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 アドレスが含まれており/#/、実際の IP を渡すために dnsmasq をプロキシとして使用します1.1.1.1/1.0.0.1

私が理解しているように、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 レベルでリダイレクトします (-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

関連情報