Mój serwer domowy ma dwa główne interfejsy eth1
(standardowe połączenie internetowe) i tun0
(tunel OpenVPN). Chciałbym użyć, iptables
aby wymusić wyjście wszystkich pakietów wygenerowanych przez proces lokalny posiadany przez UID 1002 tun0
i wszystkich innych pakietów do wyjścia eth1
.
Mogę łatwo oznaczyć dopasowane pakiety:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Teraz chciałbym umieścić jakąś regułę w łańcuchu POSTROUTING (prawdopodobnie tabeli maglowania), aby dopasować pakiety oznaczone 11 i wysłać je do tun0
, a następnie regułę, która pasuje do wszystkich pakietów i wysłać je do eth1
.
Znalazłem cel ROUTE, ale wydaje się, że przepisuje tylko interfejs źródłowy (chyba że czytam go niepoprawnie).
Czy iptables jest w stanie to zrobić? Czy zamiast tego muszę zadzierać z tablicą routingu (za ip route
pomocą zwykłych route
poleceń)?
Edycja: Pomyślałem, że może powinienem podać więcej informacji. Nie mam obecnie żadnych innych reguł iptables (chociaż mogę stworzyć pewne reguły, aby wykonywać niepowiązane zadania w przyszłości). Ponadto dane wyjściowe ip route
to:
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
Nie dotknąłem tabeli routingu - tak właśnie jest obecnie (choć wygląda dość brudno). Przykro mi, ale nie mam route
zainstalowanego starszego polecenia na tym komputerze.
Wyjście ip addr
(oczywiście eth0 i eth2 można zignorować - są to karty sieciowe, które nie są obecnie używane):
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
Edycja: Mam coś w rodzaju pracy, ale to nie jest przekazywanie oznaczonych pakietów do tun0. Zasadniczo dodałem tabelę (11) i użyłem:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Kiedy tylko sudo -u user1000 wget -qO- whatismyip.org
dostaję zewnętrzny adres IP mojego domu, ale jeśli to zrobię sudo -u user1002 wget -qO- whatismyip.org
, dostaję także adres IP mojego domu (ale powinienem otrzymywać adres IP na drugim końcu tunelu OpenVPN).
Uruchomienie iptables -vL
potwierdza, że pakiety są dopasowywane przez regułę znakowania, ale wydaje się, że nie są zgodne z regułą routingu.
EDYCJA: Spędziłem nad tym dużo czasu i chociaż nadal nie działa, myślę, że jestem trochę bliżej.
Reguła iptables musi znajdować się w mangle
łańcuchu WYJŚCIA tabeli. Myślę, że potrzebuję również reguły MASQUERADE w nat
łańcuchu POSTROUTING tabeli, aby ustawić adres źródłowy. Jednak przekierowanie, które występuje po maglecie OUTPUT, nie działa poprawnie.
Spędziłem na tym teraz 5 godzin, więc robię sobie przerwę i pewnie wrócę do niej później wieczorem lub jutro.