
Я пытаюсь создать своего рода портал авторизации с помощью dnsmasq.
Идея такова:
dnsmasq
по умолчанию переписать все DNS-запросы на локальный IP ( address=/#/123.123.123.123
), и nginx
уже настроено здесь на отображение «страницы с ограниченным доступом».
Но я хочу добавить некий список исключений:
ipset create captive-allowed hash:ip
ipset add captive-allowed 222.222.222.222
Он будет содержать IP-адреса клиентов, которые не должны быть перезаписаны, /#/
и будет использовать dnsmasq в качестве прокси-сервера для 1.1.1.1/1.0.0.1
передачи реальных IP-адресов.
Как я понял, dnsmasq
настройки ipset работают только для каждого домена. Поэтому мне нужно сделать:
ipset=/google.com/captive-allowed/go.ogle.real.ip
ipset=/amazon.com/captive-allowed/ama.zon.real.ip
... billion records more ...
Верно ли мое предположение? Или я что-то упускаю?
решение1
Только не делайте этого через dnsmasq вообще – вовлечение DNS только добавляет ненужной сложности (кэширование, сбои DNSSEC, легко обойти даже случайно и т. д.). Вместо этого используйте только iptables/nft для перенаправления всех HTTP-пакетов на уровне IP (используя DNAT через -j DNAT
или -j REDIRECT
). Например:
-A FORWARD_CAPTIVE -m set --match-set AllowedClientsMAC src -j ACCEPT
-A FORWARD_CAPTIVE -j REJECT
<...>
-A PREROUTING_CAPTIVE -m set --match-set AllowedClientsMAC src -j ACCEPT
-A PREROUTING_CAPTIVE -p tcp -m tcp --dport 53 -j DNAT --to-destination 192.168.1.53
-A PREROUTING_CAPTIVE -p tcp -m udp --dport 53 -j DNAT --to-destination 192.168.1.53
-A PREROUTING_CAPTIVE -p tcp -m tcp --dport 80 -j REDIRECT
-A PREROUTING_CAPTIVE -p tcp -m tcp --dport 443 -j REDIRECT