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.