Linux und zwei Internetzugaenge

09/05/2009 - 17:44 von Marc Haber | Report spam
Hallo,

gegeben sei ein Linux-basierender Router mit einem "internen" Netzwerk
(int0), einem Perimeternetz (per0) und zwei Internetzugàngen (ext0,
ext1), die jeweils nur eine IP-Adresse bieten. Es muss also NAT
gemacht werden. Der auf ext0 angeschlossene Internetzugang soll für
http und https in die Welt genutzt werden, der andere (ext1) für den
Rest. Das Perimeternetz ist per Destination NAT erreichbar.

Ich habe mir gerade mal wieder einen Rechner angeguckt, der so eine
Aufgabe erfüllt, und bin beim Anblick des Routingmechanismus erstmal
in Ohnmacht gefallen: Das ist ja sowas von ekelhaft...

|1: ext0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
| inet 10.81.221.145/29 brd 10.1.221.151 scope global ext0
|2: ext1: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
| inet 10.82.83.225/29 brd 10.82.83.231 scope global ext1
|3: per0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
| inet 172.16.1.254/24 brd 172.16.1.255 scope global per0
|4: int0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc noqueue
| inet 192.168.8.254/24 brd 192.168.8.255 scope global int0

Dann gibt es die folgenden Routingregeln:
|0: from all lookup 255
|10: from all lookup main
|32: from all fwmark 0x12e lookup to_ext0
|32: from all fwmark 0x12f lookup to_ext1
|32000: from all lookup defaultroute
|32000: from all lookup defaultroute
|32766: from all lookup main
|32767: from all lookup default

Dabei enthàlt die Routingtabelle main alle Regeln für die direkt
konnektierten Netze, aber keine Defaultroute. Die beiden to_-Regeln
enthalten jeweils eine Defaultroute zu den beiden ISPs und die Tabelle
defaultroute enthàlt nochmal eine Defaultroute auf das Gateway in
ext1.

In der Prerouting-Chain in der Table mangle sind die folgenden Regeln:
|iptables --append PREROUTING --protocol tcp --dport 80 --in-int int+ --set-mark 0x12e
|iptables --append PREROUTING --protocol tcp --dport 443 --in-int int+ --set-mark 0x12e
|iptables --append PREROUTING --in-int int+ --set-mark 0x12f

und in der Postrouting-Chain in der Table nat die folgenden:
|iptables --append POSTROUTING --match mark --mark 0x12e --out-int ext0 --jump SNAT --to-source 10.81.221.145
|iptables --append POSTROUTING --match mark --mark 0x12f --out-int ext1 --jump SNAT --to-source 10.82.83.225

Nun greift jemand aus dem internen Netz auf einen Webserver im
Internet zu. Das entsprechende Paket wird also zunàchst in der
PREROUTING-Chain markiert, dann über die Routingregeln und die
entsprechende Routingtabelle geroutet und letztendlich im
POSTROUTING-Abschnitt abhàngig von der Markierung und dem
Routingergebnis noch auf die richtige Adresse geNATtet. Und ich hab
ein Problem, mein Essen bei mir zu behalten.

Geht das nicht ein wenig schöner? Oder ist dieses Pingpong zwischen
Paketfilter und Routing wirklich nicht verhinderbar? Was ich ganz
besonders àtzend finde ist, dass die naive Ausgabe von "ip route" oder
"route" die ganze Defaultroutenmimik nicht zeigt und man also wissen
muss, dass der Host irgendwelche Routingsauereien macht oder sich
wundert, wo denn die Defaultroute hin ist.

Kann man ernsthaft immer noch nicht im Paketfilter auf die
Routingentscheidung Einfluss nehmen?

Grüße
Marc

Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
 

Lesen sie die antworten

#1 Juergen P. Meier
10/05/2009 - 09:23 | Warnen spam
Marc Haber <mh+:

Warum machst du nicht einfach policy routing ohne fw-marking?

NATe in der Pre-routing chain der nat-Table auf die jeweils passende
externe source-IP und route dann einfach anhand der Quelladresse.
Das ist weniger Ekeleregend, Fehlertraechtig und uebersichtlicher.

Kann man ernsthaft immer noch nicht im Paketfilter auf die
Routingentscheidung Einfluss nehmen?



Direkt nicht. Wowereit.

Juergen

Ähnliche fragen