代码之家  ›  专栏  ›  技术社区  ›  Alex Howansky

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

  •  14
  • Alex Howansky  · 技术社区  · 14 年前

    我目前正在nginx.conf中执行此操作:

    allow 1.2.3.4;
    deny;
    

    我真正想做的是:

    allow my.domain.name;
    deny;
    

    也就是说,我希望nginx在请求时对my.domain.name做一个A记录查找,如果它与请求来自的IP相匹配,那么就允许它。不过,我看不出有任何内置机制可以做到这一点。在我开始编写自定义代码之前,有没有人有自己的方法?

    3 回复  |  直到 14 年前
        1
  •  5
  •   CyberDem0n    14 年前

    nginx的官方发行版中没有这样的功能。因为它可能会严重降低性能。

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

        2
  •  19
  •   gaRex    9 年前

    ngx_http_rdns_模块可以满足您的需要: http://wiki.nginx.org/HttpRdnsModule ( https://github.com/flant/nginx-http-rdns )

    摘要

    此模块允许对传入连接进行反向DNS(rDNS)查找,并通过允许/拒绝规则提供对传入主机名的简单访问控制(类似于HttpAccessModule allow/deny指令;支持正则表达式)。模块与由标准解析器指令定义的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;
        }
    
        #...
    }
    
        3
  •  1
  •   kheraud    6 年前

    这个答案是一个替代方案,它允许从nginx解析域,但目标完全相同,能够解析nginx配置中包含的ip。

    1)创建文件 allowed-domain.list 其中包含要授予访问权限的域:

    jean-paul.mydomain.com
    rufus.mydomain.com
    robert.mydomain.com
    

    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"
    

    3)对这个脚本给予正确的许可 chmod +x domain-resolver.sh

    4)添加生成有效nginx配置并重新启动nginx的cron作业:

    #!/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
    

    这可能是 @daily 或者你可以让它每小时,每分钟,每秒钟。。。

    5)更新nginx配置以将此输出考虑在内:

    include /pathtooutputdir/allowed-ips-from-domains.conf;
    deny all;
    

    你可以改进这个添加一个ip格式检查,防止ipv6如果你不想它,组在一个单一的文件。。。