
私は 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 アドレス から Web ページにアクセスできます111.222.333.444/32
。しかし、その後、職場の動的 IP アドレスが に変更されると555.777.888.999/32
、職場のパブリック IP アドレスが変更されたため、職場から Web ページにアクセスできなくなります。
現在、私はダイナミック 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
私の質問は、Nginx が許可されたドメインの IP アドレスを検索し、ダイナミック DNS ホスト名の IP アドレスをホワイトリストに登録できるように、ダイナミック DNS を Nginx に組み込むにはどうすればよいかということです。
答え1
IPアドレスを認証トークンとして使用するのは、一般的に悪い習慣と考えられています。Nginxには、あなたが求めている機能がありません。あなたが提起した問題の解決策を本当に見つけなければならないのであれば、コメントで提案されたAlexeyの解決策を採用しますが、Nginxには非常に便利な認証/承認機能があり、決定を委ねる選択/デザインしたウェブページに。
そこでは、コード化できる認証ルールやメカニズムを使用できます。セッション データを使用できます (選択したツールがこれをサポートしている場合)。ただし、セッション ID が、ゲートウェイを提供しているアプリケーションによって実装されている ID と競合する可能性があるかどうかを考慮してください。
例えば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自体の検索- リストの外部メンテナンス。