我目前在我的nginx.conf中这样做:
allow 1.2.3.4;
deny;
Run Code Online (Sandbox Code Playgroud)
我真正想做的是:
allow my.domain.name;
deny;
Run Code Online (Sandbox Code Playgroud)
即,我希望nginx在请求时对my.domain.name执行A记录查找,如果它与请求来自的IP匹配,则允许它.但是,我没有看到任何内置机制.在开始编写自定义内容之前,有人有本地方法吗?
小智 19
ngx_http_rdns_module可以满足您的需求:http://wiki.nginx.org/HttpRdnsModule (https://github.com/flant/nginx-http-rdns)
此模块允许对传入连接进行反向DNS(rDNS)查找,并通过允许/拒绝规则提供对传入主机名的简单访问控制(类似于HttpAccessModule允许/拒绝指令;支持正则表达式).模块使用标准解析器指令定义的DNS服务器.
location / {
resolver 127.0.0.1;
rdns_deny badone\.example\.com;
if ($http_user_agent ~* FooAgent) {
rdns on;
}
if ($rdns_hostname ~* (foo\.example\.com)) {
set $myvar foo;
}
#...
}
Run Code Online (Sandbox Code Playgroud)
khe*_*aud 12
这个答案是一种替代方案,它让域名解析脱离 nginx,但目标完全相同,能够解析 nginx 配置中包含的 ip。
1) 创建一个文件allowed-domain.list,其中包含您要授予访问权限的域:
jean-paul.mydomain.com
rufus.mydomain.com
robert.mydomain.com
Run Code Online (Sandbox Code Playgroud)
2)创建一个 bash 脚本domain-resolver.sh来为您进行查找:
#!/usr/bin/env bash
filename="$1"
while read -r line
do
ddns_record="$line"
if [[ ! -z $ddns_record ]]; then
resolved_ip=`getent ahosts $line | awk '{ print $1 ; exit }'`
if [[ ! -z $resolved_ip ]]; then
echo "allow $resolved_ip;# from $ddns_record"
fi
fi
done < "$filename"
Run Code Online (Sandbox Code Playgroud)
3)给予该脚本正确的权限chmod +x domain-resolver.sh
4) 添加一个 cron 作业,生成有效的 nginx 配置并重新启动 nginx :
#!/usr/bin/env bash
/pathtoscript/domain-resolver.sh /pathtodomainlist/allowed-domain.list > /pathtooutputdir/allowed-ips-from-domains.conf
service nginx reload > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
这可以是一项@daily工作,也可以让它每小时、每分钟、每秒运行一次......
5) 更新您的 nginx 配置以考虑此输出:
include /pathtooutputdir/allowed-ips-from-domains.conf;
deny all;
Run Code Online (Sandbox Code Playgroud)
您可以通过添加 ip 格式检查来改进此功能,如果不需要,则阻止 ipv6,将所有内容分组到一个文件中...
nginx的正式发布中没有这样的功能.因为它可能会严重降低性能.
第三方模块http://wiki.nginx.org/3rdPartyModules也不包含此功能.
| 归档时间: |
|
| 查看次数: |
22270 次 |
| 最近记录: |