2012-12-31 4 views
11

Ich habe iptables blockieren alle UDP-Verkehr im Moment, aber ich möchte nur bestimmte DNS-Anfragen zu ermöglichen, durchkommen.Können iptables DNS-Abfragen nur für einen bestimmten Domainnamen zulassen?

Verwenden Sie google.com als Beispiel.

Ich versuche Stringerkennung zu verwenden, um den Domänennamen in der Anfrage zu finden und zuzulassen. Das ist, was mir eingefallen ist.

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEP T

Ich habe auch versucht --dport 53 statt --sport. Kein Würfel.

Wenn jemand weiß, wie das gemacht werden kann oder sehen, wo ich falsch gelaufen ist, wird Ihre Hilfe geschätzt!

Danke, Jarred

Antwort

19

Ich weiß, das ein bisschen spät, aber da Sie die Frage nicht geschlossen ...

Wenn man sich den Inhalt des DNS-Anforderungspaket aussehen In Wireshark o.ä. finden Sie, dass das Punktzeichen nicht verwendet wird. Jeder Teil des Domain-Name ist ein gezählter String, so dass die tatsächliche Bytes der Anforderung für google.com wird:

06 67 6f 6f 67 6c 65 03 63 6f 6d 

Das erste Byte (06) ist die Länge der google, durch die 6 ASCII-Zeichen gefolgt, dann ein Zählbyte (03) für die Länge com gefolgt von ... Sie bekommen die Idee.

Um dies in iptables entsprechen, verwenden die folgenden:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --hex-string "|06|google|03|com" -algo bm -j ACCEPT 

Der --hex-string Parameter parst die vorgesehen Zeichenfolge für Hexadezimalwerte durch Paare von vertikalen Stangen begrenzt suchen. Alles außerhalb der vertikalen Balken wird als ASCII-Text interpretiert.

ACCEPT  udp -- anywhere    anywhere    udp dpt:domain STRING match "|06676f6f676c6503636f6d|" ALGO name bm TO 65535 

einzustellen, können Sie die Regel leicht - und beschleunigen it up - durch den Suchbereich zu beschränken die Verwendung von:

Wenn Sie die OUTPUT-Tabelle Liste nach dem Eintrag hinzugefügt werden Sie etwas entlang der Linien von finden --from und --to Parameter.

+0

Awesome Mann, Sie haben eine Menge Zeit gespart. Obwohl es Zeit brauchte, dies zu überprüfen. –

+0

Ich hoffe, das gleiche wird auch für IPv6-Netzwerk funktionieren. –

+0

warum Algo-Typ ist BM (Boyer-Moore)? –

3

fand ich, dass mit Streichern mit Punkten nicht zuverlässig ist.

Dies funktioniert:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT