Mein Heimserver verfügt über zwei Hauptschnittstellen eth1(eine Standard-Internetverbindung) und tun0(einen OpenVPN-Tunnel). Ich möchte verwenden, um iptableszu 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 routeoder nur über die Legacy- routeBefehle)?
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- routeBefehl 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.orgmache 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 -vLbestä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 mangleOUTPUT-Kette der Tabelle befinden. Ich denke, ich brauche auch eine MASQUERADE-Regel in der natPOSTROUTING-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.