Il mio server di casa ha due interfacce principali, eth1
(una connessione Internet standard) e tun0
(un tunnel OpenVPN). Vorrei usare iptables
per forzare l'uscita di tutti i pacchetti generati da un processo locale di proprietà dell'UID 1002 tun0
e tutti gli altri pacchetti eth1
.
Posso facilmente contrassegnare i pacchetti abbinati:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Ora, vorrei mettere alcune regole nella catena POSTROUTING (probabilmente della tabella mangle) per abbinare i pacchetti contrassegnati con 11 e inviarli a tun0
, seguiti da una regola che corrisponda a tutti i pacchetti e li invii a eth1
.
Ho trovato il target ROUTE, ma sembra riscrivere solo l'interfaccia di origine (a meno che non lo stia leggendo in modo errato).
Iptables è in grado di farlo? Devo invece scherzare con la tabella di routing (tramite ip route
o solo i route
comandi legacy )?
Modifica: ho pensato che forse avrei dovuto fornire ulteriori informazioni. Non ho altre regole iptables al momento (anche se potrei creare alcune regole per svolgere attività non correlate in futuro). Inoltre, l'output di 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
Non ho toccato la tabella di routing - questo è come è attualmente (anche se sembra abbastanza sporco). Mi dispiace, ma non ho il route
comando legacy installato su questa macchina.
E l'output di ip addr
(ovviamente, eth0 ed eth2 può essere ignorato - sono schede di rete che al momento non vengono utilizzate):
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
Modifica: ho ottenuto qualcosa che funziona, ma non sta inoltrando pacchetti contrassegnati a tun0. In sostanza, ho aggiunto una tabella (11) e usato:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Appena sudo -u user1000 wget -qO- whatismyip.org
ottengo l'indirizzo IP esterno della mia casa, ma se lo faccio sudo -u user1002 wget -qO- whatismyip.org
, ottengo anche l'indirizzo IP della mia casa (ma dovrei ottenere l'IP dall'altra parte del tunnel OpenVPN).
L'esecuzione iptables -vL
conferma che i pacchetti vengono abbinati dalla regola di marcatura, ma non sembrano seguire la regola di routing.
EDIT: ho trascorso molto tempo su questo, e anche se ancora non funziona, penso di essere un po 'più vicino.
La regola iptables deve essere nella mangle
catena OUTPUT della tabella. Penso di aver bisogno anche di una regola MASQUERADE nella nat
catena POSTROUTING della tabella, per impostare l'indirizzo di origine. Tuttavia, il reinstradamento che si verifica dopo il mangle di OUTPUT non funziona correttamente.
Ho trascorso 5 ore su questo ora, quindi sto facendo una pausa e probabilmente ci tornerò più tardi stasera o domani.