Iptables zum Umleiten von DNS-Lookup-IP und -Port

21

Ich habe festgestellt, dass mein ISP (Verizon) den gesamten DNS-Verkehr auf Port 53 abfängt.

Mit iptables möchte ich den gesamten DNS-Suchverkehr auf eine bestimmte IP und einen bestimmten Port umleiten (5353). Jeder Versuch meines Computers, eine Verbindung zu einem anderen Computer an Port 53 herzustellen, sollte auf 23.226.230.72:5353 umgeleitet werden.

Um den DNS-Server und den Port zu überprüfen, den ich verwenden möchte, habe ich diesen Befehl ausgeführt.

~$ dig +short serverfault.com @23.226.230.72 -p5353
198.252.206.16

Dies ist die Iptables-Regel, die ich zu verwenden versuche.

iptables -t nat -A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 23.226.230.72:5353

Nach dem Hinzufügen dieser Regel werden nicht alle DNS-Lookups gefunden. Website-Pings kehren zurück unknown host. Auf den Webseiten wird "Server nicht gefunden" angezeigt.

~$ mtr serverfault.com
Failed to resolve host: Name or service not known

Ich möchte, dass meine DNS-Lookups von 23.226.230.72:5353 abgerufen werden. Wie kann ich die iptables-Regel anwenden?

BEARBEITEN

Demonstration der DNS-Überwachung (Port 53) durch meinen Internetdienstanbieter. Verfolgen Sie die Ausgabe von dig auf 23.226.230.72 über Port 5353 und dann über Port 53.

~$ dig +trace stackexchange.com @23.226.230.72 -p5353

; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p5353
;; global options: +cmd
.           86395   IN  NS  ns7.opennic.glue.
.           86395   IN  NS  ns4.opennic.glue.
.           86395   IN  NS  ns3.opennic.glue.
.           86395   IN  NS  ns5.opennic.glue.
.           86395   IN  NS  ns2.opennic.glue.
.           86395   IN  NS  ns10.opennic.glue.
.           86395   IN  NS  ns1.opennic.glue.
.           86395   IN  NS  ns6.opennic.glue.
.           86395   IN  NS  ns8.opennic.glue.
dig: couldn't get address for 'ns8.opennic.glue': no more


~$ dig +trace stackexchange.com @23.226.230.72 -p53

; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p53
;; global options: +cmd
.           7440    IN  NS  f.root-servers.net.
.           7440    IN  NS  d.root-servers.net.
.           7440    IN  NS  j.root-servers.net.
.           7440    IN  NS  i.root-servers.net.
.           7440    IN  NS  g.root-servers.net.
.           7440    IN  NS  k.root-servers.net.
.           7440    IN  NS  a.root-servers.net.
.           7440    IN  NS  h.root-servers.net.
.           7440    IN  NS  e.root-servers.net.
.           7440    IN  NS  m.root-servers.net.
.           7440    IN  NS  c.root-servers.net.
.           7440    IN  NS  b.root-servers.net.
.           7440    IN  NS  l.root-servers.net.
;; Received 239 bytes from 23.226.230.72#53(23.226.230.72) in 2948 ms

stackexchange.com.  215 IN  A   198.252.206.16
;; Received 62 bytes from 192.228.79.201#53(b.root-servers.net) in 116 ms

Meine aktuellen Iptables. iptables-save

~# iptables-save
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*mangle
:PREROUTING ACCEPT [79950528:41742899703]
:INPUT ACCEPT [78748282:41360159554]
:FORWARD ACCEPT [13:5427]
:OUTPUT ACCEPT [85455483:57472640071]
:POSTROUTING ACCEPT [85480442:57475512901]
-A POSTROUTING -o lxcbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Tue Jul 15 23:06:52 2014
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*nat
:PREROUTING ACCEPT [71:18713]
:INPUT ACCEPT [7:474]
:OUTPUT ACCEPT [109:7855]
:POSTROUTING ACCEPT [109:7855]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
COMMIT
# Completed on Tue Jul 15 23:06:52 2014
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*filter
:INPUT ACCEPT [78748139:41360144354]
:FORWARD ACCEPT [13:5427]
:OUTPUT ACCEPT [85454926:57472600172]
:fail2ban-ssh - [0:0]
:fail2ban-vsftpd - [0:0]
-A INPUT -p tcp -m multiport --dports 21,20,990,989 -j fail2ban-vsftpd
-A INPUT -p tcp -m multiport --dports 22,6622 -j fail2ban-ssh
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 67 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT
-A fail2ban-ssh -j RETURN
-A fail2ban-vsftpd -j RETURN
COMMIT
Rucent88
quelle
Sie versuchen also, den gesamten Datenverkehr von Port 53 auf diese IP (23.226.230.72) und diesen Port (5353) umzuleiten?
Tachomi
Bitte posten Sie Ihre iptables ruleshier
Networker
@ Tachomi Correct
Rucent88
Oder Sie könnten den DNS Ihres ISP nicht verwenden ... Die öffentlichen DNS-Server von Google sind 8.8.8.8und8.8.4.4
Creek
@ Creek Ich denke, Sie missverstehen. Mein ISP fängt den gesamten Datenverkehr über Port 53 ab. Selbst wenn ich Google DNS-Server verwenden wollte, kann ich nicht darauf zugreifen.
Rucent88

Antworten:

12

Führen Sie alle diese Anweisungen als root (sudo) aus.

Bearbeiten Sie diese Datei.

/etc/NetworkManager/NetworkManager.conf

Deaktivieren Sie DnsMasq, indem Sie die Zeile auskommentieren dns=dnsmasq. Setzen Sie ein #vor die Linie

#dns=dnsmasq

Starten Sie Ihr Netzwerk neu.

service network-manager restart

Fügen Sie diese iptable-Regeln hinzu.

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353
iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353
Rucent88
quelle
2
Diese Lösung wird mit dem Betriebssystem aktualisiert und verbraucht keine Ressourcen. Sie birgt kein Sicherheitsrisiko, ist sehr einfach mit einem Boot-Skript einzurichten und benötigt keine Wartung. Der Nachteil ist, dass es nicht sehr flexibel ist
Rucent88
3

Es sieht so aus, als ob Sie wirklich die Kontrolle darüber haben möchten, was mit Ihren DNS-Abfragen geschieht.

Ich bin mir nicht sicher, ob iptables meine bevorzugte Lösung wäre.

Haben Sie darüber nachgedacht, einen lokalen DNS-Server einzurichten, der Ihre Anforderungen einfach an den gewünschten Host und Port weiterleitet? Ein Beispiel: Mit der Option bind9 forwarders können Sie einem Forwarder einen Port hinzufügen.

Eine solche Einrichtung ist viel einfacher zu warten und zu beheben und kann viel flexibler sein. Ziehen Sie den Vorteil des Cache in Betracht, oder betrachten Sie nur den Fall, in dem Ihr externer DNS-Server ausfällt. Sie können mehrere Weiterleitungen in Ihrer DNS-Konfiguration haben, aber nur eine IP in den iptables-Regeln ....

Einen guten Überblick über die Einrichtung von bind9 gibt es in einem Tutorial bei Digital Ocean . Fügen Sie einfach den Port zu den Weiterleitungen hinzu und Sie sollten fertig sein.

Bind9 verbraucht nicht viel Ressourcen und ist einfach zu konfigurieren (oder zumindest: einfacher als iptables :-))

Vincent De Baere
quelle
Oh, und es ist unnötig zu erwähnen, dass Sie in diesem Setup nicht vergessen, Ihre Geräte so einzustellen, dass sie Ihren lokalen DNS-Weiterleitungsserver verwenden.
Vincent De Baere
Ich hatte einen DNS-Server, aber er war nicht zuverlässig (Junk-Hardware). Die Sicherheit auf dem neuesten Stand zu halten, war ein Schmerz. Es hat mehr Zeit, Ressourcen und Strom verbraucht und schließlich den Ausschlag gegeben. Wenn ich Hunderte von Computern hinter einem Unternehmensnetzwerk hätte, stimme ich zu, dass der DNS-Server eine gute Idee wäre. Aber ich bin nur eine Person mit einem Laptop. Ein paar Iptable-Regeln sollten die einfachste und niedrigste Ressource sein.
Rucent88
Fügen Sie einfach eines auf Ihrem Laptop hinzu, es verbraucht fast keine Ressourcen und wird mit Ihrem Hauptbetriebssystem aktualisiert (vorausgesetzt, Sie verwenden Distributionspakete) und lässt es auf localhost abhören. Nahezu kein Sicherheitsrisiko.
Vincent De Baere
Tatsächlich ist es meiner Meinung nach in 99% der Fälle besser, das Szenario beizubehalten. Die einzigen 1%, die nicht zutreffen, beziehen sich auf die Konfiguration eines Captive Portal-Systems, aber das ist eine andere Geschichte.
Iwanleoncz
2

Versuche dies:

Zuerst müssen Sie die Weiterleitungsoption in aktivieren

/etc/sysctl.conf

Setzen Sie den Wert von auf eins

net.ipv4.ip_forward = 1

Aktivieren Sie die Änderungen

sysctl -p 

Speichern Sie und führen Sie Folgendes aus:

iptables -t nat -A PREROUTING -p tcp --sport 53 -j DNAT --to-destination 23.226.230.72:5353
iptables -t nat -A POSTROUTING -j MASQUERADE

Wenn Sie die In-Schnittstelle (-i eth1) in PREROUTING oder / und die Out-Schnittstelle (-o eth0) in POSTROUTING angeben könnten, wäre dies hilfreich.

HINWEIS: MASQUARADE-Leitung ist erforderlich, während diese die Ziel-IP mit der Haupt-IP maskiert.

Tachomi
quelle
Ich habe sysctl net.ipv4.ip_forward=1die Iptables-Regeln eingegeben. DNS funktioniert, wird aber immer noch von meinem ISP abgefangen. Das bedeutet für mich, dass DNS immer noch über Port 53 gesendet wird.
Rucent88
Ich habe deine Regel in geändert udp, aber ich habe die gleichen Ergebnisse erzielt.
Rucent88
Könnten Sie bitte die Ausgabe von iptables-save setzen? Was ich könnte ist, dass Ihre Maskierung nur die angegebene MASQUERADE alle - 10.0.3.0/24, also Wenn Sie diese Zeile deaktivieren und die -A POSTROUTING -j MASQUERADE verlassen könnten, könnte hilfreich sein
Tachomi
Ich habe die angeforderten Informationen hinzugefügt
Rucent88
Ok, lassen Sie uns einen kleinen Takt verstehen ... Der gesamte eingehende Datenverkehr auf Port 53 ist derjenige, den Sie auf 23.226.230.72 umleiten möchten, oder der ausgehende?
Tachomi
1

Versuche dies:

iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A POSTROUTING -j MASQUERADE

Es bedeutet:
1) Jeder lokaler Benutzer kontaktiert an Port 23.226.230.72 tcp 53 Sende Welt Port aus 5353.
2) Den gleichen wie 1 , aber für udp
3) Stellen Sie die Quelle Informationen über das ausgehende Paket als von uns kommen.

George Hidalgo
quelle
0
iptables -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A PREROUTING -p udp  --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A POSTROUTING -j MASQUERADE
Zibri
quelle
Die Tatsache, dass diese Antwort nicht "5353" erwähnt, lässt mich glauben, dass es automatisch falsch ist.
G-Man sagt, dass Monica
korrigiert .........
Zibri
OK, ich sehe mir Ihre Antwort noch einmal an. Es scheint sehr ähnlich zu sein tachomi Antwort außer (1) Sie haben sich geändert sportzu  dport(dies war offenbar ein Fehler in tachomi Antwort , dass battman622 vor drei Jahren darauf hingewiesen , (2) Sie haben eine Linie (Befehl) für udp(dies ist eine legitime Verbesserung von Tachomis Antwort, aber eine, die bereits in einem Kommentar erwähnt wurde  … (Fortsetzung)
G-Man sagt, dass Monica
(Fortsetzung) ... und einige andere Antworten), und (3) ersetzt Sie --to-destinationmit  --to.  Die Manpage sagt das nicht --tound  --to-destinationist äquivalent; Im Gegenteil, es wird angegeben, dass dies --tomit dem NETMAPZiel verwendet wird (im Gegensatz zum  DNATZiel) und dass sein Argument keine Portnummer enthält. (Obwohl mir aufgefallen ist, dass einige andere Antworten so lauten, --towie Sie es getan haben.) Sind Sie sicher, dass dies so --tofunktioniert, wie Sie es verwendet haben (mit einer Portnummer, mit dem  DNATZiel)? … (Fortsetzung)
G-Man sagt, dass Monica
(Fortsetzung)… (Wenn ja, sollte vielleicht jemand eine Änderungsanforderung an den Betreuer der Manpages senden.) Ist dies  --tobesser als   --to-destinationin irgendeiner anderen Form als Kürze?
G-Man sagt, dass Monica