Mein Heimserver verfügt über zwei Hauptschnittstellen eth1
(eine Standard-Internetverbindung) und tun0
(einen OpenVPN-Tunnel). Ich möchte verwenden, um iptables
zu erzwingen, dass alle Pakete, die von einem lokalen Prozess im Besitz der UID 1002 generiert wurden tun0
, beendet werden und alle anderen Pakete beendet werden eth1
.
Ich kann leicht übereinstimmende Pakete markieren:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Jetzt möchte ich einige Regeln in die POSTROUTING-Kette (wahrscheinlich der Mangle-Tabelle) aufnehmen, um Pakete zuzuordnen, die mit 11 markiert sind, und sie an zu senden tun0
, gefolgt von einer Regel, die allen Paketen entspricht und sie an sendet eth1
.
Ich habe das ROUTE-Ziel gefunden, aber das scheint nur die Quellschnittstelle neu zu schreiben (es sei denn, ich lese es falsch).
Ist iptables dazu in der Lage? Muss ich stattdessen mit der Routing-Tabelle herumspielen (über ip route
oder nur über die Legacy- route
Befehle)?
Edit: Ich dachte, dass ich vielleicht mehr Informationen geben sollte. Ich habe derzeit keine anderen iptables-Regeln (obwohl ich möglicherweise einige Regeln für die zukünftige Ausführung von nicht verwandten Aufgaben erstellt habe). Außerdem ist die Ausgabe von ip route
:
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
Ich habe die Routing-Tabelle nicht angerührt - so ist sie derzeit (obwohl sie ziemlich schmutzig aussieht). Es tut mir leid, aber ich habe den Legacy- route
Befehl nicht auf diesem Computer installiert.
Und die Ausgabe von ip addr
(natürlich können eth0 und eth2 ignoriert werden - das sind NICs, die derzeit nicht verwendet werden):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
Bearbeiten: Ich habe etwas zum Laufen gebracht, aber es leitet keine markierten Pakete an tun0 weiter. Grundsätzlich habe ich eine Tabelle (11) hinzugefügt und verwendet:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Wenn ich das gerade sudo -u user1000 wget -qO- whatismyip.org
mache sudo -u user1002 wget -qO- whatismyip.org
, bekomme ich die externe IP-Adresse meines Hauses, aber wenn ich das tue , bekomme ich auch die IP-Adresse meines Hauses (aber ich sollte die IP am anderen Ende des OpenVPN-Tunnels bekommen).
Beim Ausführen wird iptables -vL
bestätigt, dass die Pakete mit der Markierungsregel übereinstimmen, sie scheinen jedoch nicht der Routing-Regel zu entsprechen.
EDIT: Ich habe eine lange Zeit damit verbracht und obwohl es immer noch nicht funktioniert, denke ich, dass ich ein bisschen näher dran bin.
Die iptables-Regel muss sich in der mangle
OUTPUT-Kette der Tabelle befinden. Ich denke, ich brauche auch eine MASQUERADE-Regel in der nat
POSTROUTING-Kette der Tabelle, um die Quelladresse festzulegen. Die Umleitung, die nach der Störung von OUTPUT auftritt, funktioniert jedoch nicht richtig.
Ich habe jetzt 5 Stunden damit verbracht, deshalb mache ich eine Pause und werde wahrscheinlich später heute Abend oder irgendwann morgen darauf zurückkommen.
man iptables
: Diese Option sollte nur bei dynamisch zugewiesenen IP-Verbindungen (Einwählverbindungen) verwendet werden. Wenn Sie eine statische IP-Adresse haben, sollten Sie das SNAT-Ziel verwenden. Masquerading entspricht der Angabe einer Zuordnung zu der IP-Adresse der Schnittstelle, an die das Paket gesendet wird, hat jedoch auch den Effekt, dass Verbindungen vergessen werden, wenn die Schnittstelle ausfällt. Sie haben Recht, aber da sich meine IP-Adresse niemals ändern würde, habe ich mich für die Verwendung von SNAT auf Empfehlung der Manpage entschieden.PREROUTING
Kette einfach eine weitere Regel zurDNAT
richtigen Quelladresse hinzufügen (entsprechend Ihrem Standard-Gateway).Ich habe das gelöst. Das Problem lag bei den Routing-Regeln in Tabelle 11. Tabelle 11 wurde zwar getroffen, ist aber aufgrund der Routing-Regeln nicht mehr funktionsfähig. Dieses Skript verwende ich jetzt und es scheint gut zu funktionieren (obwohl es offensichtlich spezifisch für mein Setup ist). Außerdem habe ich eine neue Tabelle 21 erstellt, die dem Haupt-Uplink (eth1) gewidmet ist.
quelle
Ich denke du willst:
http://lartc.org/howto/lartc.netfilter.html
Aber ich habe das oben nicht getestet.
quelle
default
Schlüsselworts.Dies kann ohne den Befehl iptables erfolgen. Führen Sie einen einfachen Befehl ip aus
Für UID 1002:
Fügen Sie die Standardroute für Tabelle 502 über die gewünschte Schnittstelle hinzu
quelle
Error: argument "uidrange" is wrong: Failed to parse rule type