如何透過動態 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 本身的查找- 與外部清單的維護。

相關內容