如何在nginx配置中"允许来自主机名"

Ale*_*sky 14 nginx

我目前在我的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)

  • 我如何安装这个模块? (2认同)

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,将所有内容分组到一个文件中...


Cyb*_*m0n 5

nginx的正式发布中没有这样的功能.因为它可能会严重降低性能.

第三方模块http://wiki.nginx.org/3rdPartyModules也不包含此功能.

  • 我认为完全没有提供这个功能只能归功于性能.显然它比较慢,但这应该是我的选择.(例如,Apache为我提供了选项,就像访问日志的DNS解析一样.)在这种情况下,我非常愿意交换为只能使用的功能进行DNS查找所需的时间.偶尔由一个人.所以我想我要写自己的了. (6认同)
  • 此外 - 如果它只在配置加载时查找主机名,那将会有所帮助.这将消除任何性能考虑,同时提高配置文件的可维护性,... (5认同)