![Портал авторизации dnsmasq с ipset/nft «разрешенный список»](https://rvso.com/image/1703346/%D0%9F%D0%BE%D1%80%D1%82%D0%B0%D0%BB%20%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8%20dnsmasq%20%D1%81%20ipset%2Fnft%20%C2%AB%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%C2%BB.png)
Я пытаюсь создать своего рода портал авторизации с помощью 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