私は 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