
Я использую веб-сервер Nginx на Ubuntu 20.04. В файле конфигурации моего виртуального хоста я установил директиву allow/deny, чтобы заблокировать доступ к URL всем IP, кроме указанного IP. Мои настройки виртуального хоста выглядят так:
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-адрес изменился.
На данный момент я настроил свой рабочий IP-адрес с помощью провайдера Dynamic DNS. Поэтому мой динамический DNS-адрес для работы — dansworkip.ddnsfree.com
. Я хотел бы включить адрес хоста динамического DNS в список разрешенных Nginx, чтобы при изменении публичного IP-адреса моего рабочего сервера Nginx находил новый IP-адрес в домене dansworkip.ddnsfree.com
и помещал его в директиву allow.
Я пробовал что-то вроде этого:
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-адрес разрешенного домена и добавлял в белый список IP-адрес моего имени хоста динамического DNS?
решение1
Использование IP-адреса в качестве токена аутентификации обычно считается плохой практикой. У Nginx нет функциональности, чтобы достичь того, о чем вы просите. Если бы мне действительно нужно было найти решение проблемы, которую вы поставили, то я бы выбрал решение Алексея, предложенное в комментариях, однако у 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- с ведением списка внешних.