Mi servidor doméstico tiene dos interfaces principales eth1
(una conexión a Internet estándar) y tun0
(un túnel OpenVPN). Me gustaría usar iptables
para forzar la salida de todos los paquetes generados por un proceso local propiedad del UID 1002 tun0
y todos los demás paquetes para salir eth1
.
Puedo marcar fácilmente paquetes coincidentes:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Ahora, me gustaría poner alguna regla en la cadena POSTROUTING (probablemente de la tabla de cambios) para que coincida con los paquetes marcados con 11 y enviarlos tun0
, seguido de una regla que coincida con todos los paquetes y los envíe eth1
.
Encontré el objetivo ROUTE, pero parece que solo reescribe la interfaz de origen (a menos que lo esté leyendo incorrectamente).
¿Es iptables capaz de esto? ¿Tengo que perder el tiempo con la tabla de enrutamiento (a través de ip route
o solo los route
comandos heredados )?
Editar: pensé que tal vez debería proporcionar más información. No tengo otras reglas de iptables en este momento (aunque puedo crear algunas reglas para llevar a cabo tareas no relacionadas en el futuro). Además, la salida de ip route
es:
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
No he tocado la tabla de enrutamiento: así es como está actualmente (aunque parece bastante sucia). Lo siento, pero no tengo el route
comando heredado instalado en esta máquina.
Y la salida de ip addr
(por supuesto, eth0 y eth2 se puede ignorar, son NIC que no se están utilizando actualmente):
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
Editar: Tengo algo que funciona, pero no reenvía paquetes marcados a tun0. Básicamente, agregué una tabla (11) y usé:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Cuando acabo de sudo -u user1000 wget -qO- whatismyip.org
obtener la dirección IP externa de mi casa, pero si lo hago sudo -u user1002 wget -qO- whatismyip.org
, también obtengo la dirección IP de mi casa (pero debería obtener la IP en el otro extremo del túnel OpenVPN).
La ejecución iptables -vL
confirma que los paquetes coinciden con la regla de marcado, pero no parecen estar siguiendo la regla de enrutamiento.
EDITAR: He pasado mucho tiempo en esto, y aunque todavía no funciona, creo que estoy un poco más cerca.
La regla de iptables tiene que estar en la mangle
cadena de SALIDA de la tabla. Creo que también necesito una regla de MASQUERADE en la nat
cadena POSTROUTING de la tabla, para establecer la dirección de origen. Sin embargo, el cambio de ruta que se produce después del cambio de OUTPUT no funciona correctamente.
He pasado 5 horas en esto ahora, así que me estoy tomando un descanso y probablemente volveré a hacerlo más tarde esta noche o mañana.