Ich hatte die Anforderung, den Traffic eines Users des Systems über ein VPN (ppp0) zu schicken, und den restlichen Traffic ganz normal über Eth0.
Der erste Schritt auf diesem Weg, war die Pakete des Users zu markieren.
Dazu ist das Kernelmodul ipt_owner nötig,
welches mit modprobe ipt_owner
geladen wird.
Danach können Iptables Regeln verwendet werden die auf User matchen, was wir gleich benutzen:
sudo iptables -t mangle -A OUTPUT -m owner --uid-owner $USERNAME -j MARK --set-mark 1 |
$USERNAME ist natürlich durch den Namen des Users zu ersetzen, dessen Traffic umgeleitet werden soll.
So, nun werden schon mal alle Pakete des Users markiert,
als nächstes bereiten wir eine zweite Routingtabelle für jene Pakete vor:
sudo echo "1 special" >> /etc/iproute2/rt_tables |
Damit wird ein zusätzliche Routingtable mit Name special angelegt.
Als nächstes schieben wir alle Pakete die Markiert wurden eben in jenen Routingtabelle
sudo ip rule add from all fwmark 1 table special |
Soweit so gut, wir haben die Pakete separiert, und können separate Routen für diese definieren.
Da wir derzeit noch eine Routen definiert haben, sollte der Traffic allerdings noch normal fließen.
Bevor wir das ändern, legen wir jedoch zuerst eine NAT-Translation fest.
Dies sorgt dafür, das die Absende-IP ausgetauscht wird (Ich weiß nicht ob dies immer nötig ist, bei mir enthielten die Pakete allerdings fälschlicher weise die Absende IP von eth0).
sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE |
Damit sollten jetzt die per ppp0 ausgehenden Pakete auch die richtige absende IP haben.
Also sorgen wir nun auch dafür das unsere Pakete über ppp0 ausgehen:
sudo ip route add default dev ppp0 table special |
Tada :) sollte funktionieren.
Besonderheiten
Es kann sein, das DNS, sprich die Namensauflösung nicht mehr funktioniert, sofern der per DHCP reingepushte DNS server im Lokalen Lan steht, was nun nicht mehr erreichbar ist.
Um dies zu ändern kann man einfach in die Tabelle folgenden eintrag hinzufügen:
sudo ip route add throw 192.168.1.0/24 table special |
Wobei die IP durch jene des lokalen Netzes zu ersetzen ist.
Ein weiteres mögliches Problem der Konfiguration liegt im Tunnel,
bricht dieser (warum auch immer) weg, sprich das interface geht down, wird die Route automatisch aus dem Table entfernt, sprich es existiert keine Defaultroute mehr, sprich der Traffic wird wieder normal geroutet.
Manchmal mag dies praktisch sein, in manchen fällen will man jedoch das der Traffic in einem solchen fall lieber garnicht fließt.
Um das zu erreichen bietet es sich an 2 Scripte zu erstellen:
Zu erst einmal in /etc/ppp/ip-up.d/
, zum beispiel default_special:
#!/bin/sh `ip route del default table special` `ip route add default dev ppp0 table special` |
Und zum anderen in /etc/ppp/ip-down.d/
, zum beispiel default_special:
#!/bin/bash `ip route del default table special` `ip route add blackhole default table special` |
Diese Scripte sorgen dafür, dass wenn der ppp0 aufgeht, die diefaultroute eingetragen wird.
Und wenn der Tunnel wegbricht, eine ‘blackhole’ route eingetragen wird, die dafür sorgt, das die Pakete einfach verworfen werden.
3 Responses to [ Debian ] Traffic eines Systemusers über anderes Interface leiten