PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : iptables/nat und DNS



unex
26.12.02, 02:25
Hallo,

ich würde gerne meinen Rechner 1 der sich ins Netz einwählt (ppp0) als Gateway für einen zweiten Rechner benutzen.
Mit iptables und nat klappt das ja ganz gut. Ich kann vom 2. Rechner aus, auch Verbindungen mit anderen Rechnern herstellen, wenn ich die IP der Rechner angebe.
Wie bekomme ich es aber hin das DNS funktioniert?

Wenn ich 'w3m 62.180.126.148' eingebe, bekomme ich die linuxforen angezeigt.
Mache ich aber ein 'w3m www.linuxforen.de' so geht es nicht. Das liegt daran das dem Rechner (Rechner 2) niemand den Namen auflöst.

Wie löst ihr dieses Problem? Würdet ihr die Nameserver direkt beim 2. Rechner eintragen (will ich nicht unbedingt machen das sich diese auch ändern können....). Oder liesse sich das auch dynamischer mit iptables regeln?

thx.
unex

geronet
26.12.02, 09:56
Am einfachsten: externe DNS Server auf Client eintragen

Fortgeschritten: Einen DNS-Server cacheonly auf dem Router installieren und diesen verwenden nach diesem HOWTO: http://center.kernelnotes.de/LDP/HOWTO/DNS-HOWTO.html

Profi: Mit iptables die DNS Anfragen auf externe Server redirecten und auf dem Client den Router als DNS Server eintragen (ohne laufendem bind):

iptables -t nat -A PREROUTING --source < Netzwerkadresse, z.B.: 192.168.1.0/255.255.255.0> --in-interface <internes Interface, z.B. eth0> --protocol tcp --destination-port domain --jump DNAT --to-destination <IP des externen DNS Servers>

Das gleiche für UDP:

iptables -t nat -A PREROUTING --source < Netzwerkadresse, z.B.: 192.168.1.0/255.255.255.0> --in-interface <internes Interface, z.B. eth0> --protocol udp --destination-port domain --jump DNAT --to-destination <IP des externen DNS Servers>

Grüsse, Stefan

unex
26.12.02, 10:52
Original geschrieben von geronet ]
Am einfachsten: externe DNS Server auf Client eintragen

Ja, ist wie gesagt wohl die einfachste Variante.


Fortgeschritten: Einen DNS-Server cacheonly auf dem Router installieren und diesen verwenden nach diesem HOWTO: http://center.kernelnotes.de/LDP/HOWTO/DNS-HOWTO.html

Daran hatte ich auch schon gedacht.



Profi: Mit iptables die DNS Anfragen auf externe Server redirecten und auf dem Client den Router als DNS Server eintragen (ohne laufendem bind):

iptables -t nat -A PREROUTING --source < Netzwerkadresse, z.B.: 192.168.1.0/255.255.255.0> --in-interface <internes Interface, z.B. eth0> --protocol tcp --destination-port domain --jump DNAT --to-destination <IP des externen DNS Servers>

Das gleiche für UDP:

iptables -t nat -A PREROUTING --source < Netzwerkadresse, z.B.: 192.168.1.0/255.255.255.0> --in-interface <internes Interface, z.B. eth0> --protocol udp --destination-port domain --jump DNAT --to-destination <IP des externen DNS Servers>

Jo, so funktionierts auch. Is ja aber vom Grundprinzip her das gleiche wie erstere Variante.
Letztere hat den Vorteil, das ich die DNS Server erst ermitteln lassen kann und dann im Skript ersetzen lasse.

Hast du ne Ahnung wie ich die DNS Server ermittel? Ich meine bei meiner Einwahl ins Netz wird mir ja ein Primärer und ein
Sekundärer zugewiesen. Wie komme ich an die IP der beiden?

thx für die Antworten. ;)

cerb
26.12.02, 11:53
for i in $(grep -i nameserver /etc/resolv.conf | awk {'print $2'}); do iptables -t nat -A PREROUTING --source < Netzwerkadresse, z.B.: 192.168.1.0/255.255.255.0> --in-interface <internes Interface, z.B. eth0> --protocol tcp --destination-port domain --jump DNAT --to-destination $i; done

und das halt fuer TCP und UDP in dein firewall-script einfuegen (an der stelle, wo das stattfinden soll) ...

geronet
26.12.02, 11:58
Aus der /etc/ppp/resolv.conf oder /etc/resolv.conf die beiden IP-Adressen rauslesen und eintragen:

DNSSERVER1=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n 1p)
DNSSERVER2=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n 2p)


Grüsse, Stefan

Jasper
26.12.02, 12:30
Original geschrieben von geronet
Aus der /etc/ppp/resolv.conf oder /etc/resolv.conf die beiden IP-Adressen rauslesen und eintragen:

DNSSERVER1=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n 1p)
DNSSERVER2=$(grep nameserver /etc/resolv.conf | awk '{ print $2 }' | sed -n 2p)


da kann ich nicht anders ;) , da sind mir das grep und sed zuviel:

DNSSERVER1=$(awk 'BEGIN{ IGNORECASE=1 } /^nameserver/ { if( ++C==1 ) print $2 }' /etc/resolv.conf)
DNSSERVER2=$(awk 'BEGIN{ IGNORECASE=1 } /^nameserver/ { if( ++C==2 ) print $2 }' /etc/resolv.conf)

awk ist sehr mächtig :)

-j

cerb
26.12.02, 13:05
ist trotzdem laenger als geronet's oder meins. noch mehr tipparbeit erspart es, wenn man es in einer for-schleife in den iptables-aufruf einbaut (man muss es dann immer nur einmal schreiben ...)

Jasper
26.12.02, 17:52
Original geschrieben von cerb
ist trotzdem laenger als geronet's oder meins. noch mehr tipparbeit erspart es, wenn man es in einer for-schleife in den iptables-aufruf einbaut (man muss es dann immer nur einmal schreiben ...)

mir gings nicht um länger oder kürzer, sondern darum, aufzuzeigen, dass man dafür nur awk benötigt, weil awk alle benötigte funktionalität hat. ich schreibe lieber mehr für eine effizientere lösung.

du solltest aber trotzdem nach '^nameserver' matchen, manche haben auskommentierte zeilen in ihren resolv.conf drin, die deine lösung stark ins schleudern bringen.

-j

cerb
26.12.02, 19:19
1:0 für dich :-)

unex
26.12.02, 21:53
Ich dachte dass die DNS Server in einer Variable gespeichert werden... in der resolv.conf
hätte man auch mal nachschauen könnnen... ;)

Besten Dank für eure Hilfe!

Martin