我正在使用 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 在 IP 層級重定向所有 HTTP 封包(透過-j DNAT
或使用 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