![DNSMASQ-Captive-Portal mit IPSET/NFT-„Erlaubtliste“](https://rvso.com/image/1703346/DNSMASQ-Captive-Portal%20mit%20IPSET%2FNFT-%E2%80%9EErlaubtliste%E2%80%9C.png)
Ich spiele mit dnsmasq, um eine Art Captive Portal zu erstellen.
Die Idee ist:
dnsmasq
Standardmäßig werden alle DNS-Anfragen an die lokale IP ( address=/#/123.123.123.123
) umgeschrieben, und nginx
hier ist bereits die Anzeige der „Seite mit eingeschränktem Zugriff“ eingerichtet.
Aber ich möchte eine Art Ausschlussliste hinzufügen:
ipset create captive-allowed hash:ip
ipset add captive-allowed 222.222.222.222
Dies enthält die IP-Adressen der Clients, die nicht umgeschrieben werden sollten, /#/
und verwendet dnsmasq als Proxy, um 1.1.1.1/1.0.0.1
echte IPs zu übergeben.
So wie ich es verstanden habe, dnsmasq
funktionieren die IPset-Einstellungen nur für jede Domäne. Also muss ich Folgendes tun:
ipset=/google.com/captive-allowed/go.ogle.real.ip
ipset=/amazon.com/captive-allowed/ama.zon.real.ip
... billion records more ...
Ist meine Annahme richtig? Oder übersehe ich vielleicht etwas?
Antwort1
Tun Sie das bloß nicht über dnsmasq – die Einbeziehung von DNS führt nur zu unnötiger Komplexität (Caching, DNSSEC-Fehler, leichte Umgehung auch versehentlich usw.). Verwenden Sie stattdessen nur iptables/nft, um alle HTTP-Pakete auf IP-Ebene umzuleiten (mit DNAT über -j DNAT
oder -j REDIRECT
). Beispiel:
-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