如何使用动态 DNS 而不是 IP 地址来使用 Nginx 允许列表?

如何使用动态 DNS 而不是 IP 地址来使用 Nginx 允许列表?

我在 Ubuntu 20.04 上运行 Nginx Web 服务器。在我的虚拟主机配置文件中,我设置了允许/拒绝指令,以阻止除指定 IP 之外的所有 IP 访问 URL。我的虚拟主机设置如下:

server {
    # Restrict access to LAN & Personal IP's
    allow 127.0.0.1; # LoopBack IP Address
    allow 192.168.1.0/24; # LAN IP Address
    allow 123.456.789.102/32; # Home Public IP Address
    allow 111.222.333.444/32; # Work Dynamic IP Address
    deny all;
    error_page 403 =444;
...

问题在于我的“工作动态 IP 地址”实际上是动态的,并且经常变化。因此,几天之内,我可以从我的工作 IP 地址访问网页111.222.333.444/32。但是,当工作动态 IP 地址更改为时555.777.888.999/32,我无法再从工作访问网页,因为我的工作公共 IP 地址已更改。

到目前为止,我已经使用动态 DNS 提供商设置了我的工作 IP 地址。因此,我的工作动态 DNS 地址是dansworkip.ddnsfree.com。我想将动态 DNS 主机地址合并到 Nginx 的允许列表中,这样当我的工作公共 IP 地址发生变化时,Nginx 会从域中查找新的 IP 地址dansworkip.ddnsfree.com,并将其放入允许指令中。

我尝试过这样的事情:

server {
    # Restrict access to LAN & Personal IP's
    allow 127.0.0.1; # LoopBack IP Address
    allow 192.168.1.0/24; # LAN IP Address
    allow 123.456.789.102/32; # Home Public IP Address
    allow dansworkip.ddnsfree.com; # Work Dynamic IP Address
    deny all;
    error_page 403 =444;
...

但是当我尝试此配置时,Nginx 无法启动,并且我的 Nginx 日志中出现以下错误:

[emerg] 10269#10269: invalid parameter "dansworkip.ddnsfree.com" in /etc/nginx/conf.d/www.mysite.com

我的问题是,如何将动态 DNS 合并到 Nginx 中,以便 Nginx 查找允许域的 IP 地址并将动态 DNS 主机名的 IP 地址列入白名单?

答案1

使用 IP 地址作为身份验证令牌通常被认为是不好的做法。Nginx 没有实现您所要求的功能。如果我真的必须找到您提出的问题的解决方案,那么我会采用评论中提出的 Alexey 的解决方案,但是 Nginx 确实有一个非常有用的身份验证/授权功能,它允许您移交决定到您选择/设计的网页。

在其中,您可以使用任何可以编码的身份验证规则/机制。您可以使用会话数据(如果您选择的工具支持此功能),但请考虑任何会话标识符是否可能与您为其提供网关的应用程序实现的标识符相冲突。

例如,在 PHP 中,

<?php
$ipdir="/var/www/access";
$TTL=600;

function deny_access() 
{
   header('HTTP/1.0 403 Forbidden');
   exit;
}

function permit_access()
{
   print "";
   exit;
}

function refresh_config()
{
   // replace files in "/allow", delete aged files from "/deny"
   // then update timestamp on control file.
   // Implementation left as an exercise for the reader
}

if (time() - filemtime($ipdir . "/control.file") > $TTL) {
    refresh_config();
} 
if (file_exists($ipdir . "/deny", $_SERVER['REMOTE_ADDR'])) {
    deny_access();
} else if (file_exists($ipdir . "/allow", $_SERVER['REMOTE_ADDR'])) {
    permit_access();
} else {

}

另一种方法(根据多种因素可能更有效,但仅限于 IP 地址)是维护nginx 本身的查找- 维护外部列表。

相关内容