帶有 ipset/nft「允許列表」的 dnsmasq 強制門戶

帶有 ipset/nft「允許列表」的 dnsmasq 強制門戶

我正在使用 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

相關內容