[ Debian ] Traffic eines Systemusers über anderes Interface leiten

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.

This entry was posted in Uncategorized and tagged , , , , , , , , , , . Bookmark the permalink.

3 Responses to [ Debian ] Traffic eines Systemusers über anderes Interface leiten

  1. volki says:

    Schoenes ding :)

  2. Daniel says:

    Das ist genau das, was ich gesucht habe, und es funktioniert einwandfrei*. Vielen Dank! :D
    Vielleicht ist es dir noch nicht aufgefallen, aber im zweiten Codekästchen wurden die beiden > zu > übersetzt. Wer sich auskennt, wird das aber merken, also ist das nur ein Schönheitsfehler… :)

    * Zumindest auf meinem Heimsystem. Bei mit Virtuozzo verwalteten virtuellen Systemen lässt sich das Kernelmodul nicht laden, also fällt das Ganze leider flach.

  3. Daniel says:

    Ah, ich habe übersehen, dass die Kommentare HTML-fähig sind. Ich meinte also, dass > zu > wurde.

Leave a Reply

Your email address will not be published. Required fields are marked *