En un sistema Linux, que actúa como puerta de enlace en mi LAN, me gustaría enrutar el tráfico según las direcciones IP de origen.
Tengo 2 tarjetas de red y una de estas tarjetas tiene 2 puertas de enlace predeterminadas diferentes.
Sé que solo puedo tener una puerta de enlace predeterminada en un sistema y que la selección de ruta se basa en la dirección de destino.
Me gustaría asegurarme de que la PC con ip 192.168.3.5 pueda acceder y ser accesible a través de la puerta de enlace 172.16.62.254
Detrás de eth0 hay una vpn que me permite acceder a Internet.
La configuración de las interfaces de red es:
DEVICE=eth0
TYPE=Ethernet
IPADDR=172.16.61.2
PREFIX=24
IPADDR2=172.16.61.3
PREFIX2=24
GATEWAY=172.16.61.1
DEVICE=eth0:1
TYPE=Ethernet
DEFROUTE=no
IPADDR=172.16.62.100
PREFIX=24
#GATEWAY=172.16.62.254
DEVICE=eth1
TYPE=Ethernet
IPADDR=192.168.3.1
NETMASK=255.255.255.0
La tabla de enrutamiento es:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.16.62.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.16.61.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 172.16.61.1 0.0.0.0 UG 0 0 0 eth0
Las direcciones IP de las dos puertas de enlace son:
172.16.61.1
172.16.62.254
La pc con dirección IP192.168.3.2debe alcanzar GW172.16.61.1,
la pc con dirección IP192.168.3.5debe alcanzar GW 172.16.62.254
Para permitir el acceso a las 2 puertas de enlace, realizo una traducción de direcciones IP a través de iptables:
iptables -t nat -A POSTROUTING -s 192.168.3.2 -j SNAT --to-source 172.16.61.3
y viceversa
iptables -t nat -A PREROUTING -d 172.16.61.3 -j DNAT --to-destination 192.168.3.2
La idea de enrutar paquetes a través de la puerta de enlace 172.16.62.254 es utilizariptablespara marcar paquetes cuya dirección IP de origen sea 192.168.3.5 o 172.16.62.100 y luego enrutarlos usando iproute2 para lo cual realicé los siguientes pasos:
En/etc/iproute2/rt_tablesHe añadido la línea
200 route254
He marcado los paquetes con:
iptables -t mangle -A OUTPUT -s 192.168.3.5 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -s 172.16.62.100 -j MARK --set-mark 0x1
He configurado el enrutamiento con:
ip route add default via 172.16.62.254 dev eth0:1 table route254
ip route add 172.16.62.0/24 dev eth0:1 src 172.16.62.100 table route254
ip rule add from 172.16.62.100/32 table route254
ip rule add to 172.16.62.100/32 table route254
ip rule add prio 199 fwmark 0x1 lookup route254
Lo que obtuve es que la accesibilidad a la PC con la dirección 192.168.3.2 funciona, la PC es accesible desde el exterior, mientras que la PC con la dirección 192.168.3.5 no.
La salida de tcpdump en el caso de la PC con dirección 192.168.3.2 es
18:38:31.317553 IP x.x.x.x.45053 > 172.16.61.3.ftp: S 3190836796:3190836796(0) win 5840 <mss 1380,sackOK,timestamp 2834368503 0,nop,wscale 7>
18:38:31.317832 IP x.x.x.x.45053 > 192.168.3.2.ftp: S 3190836796:3190836796(0) win 5840 <mss 1380,sackOK,timestamp 2834368503 0,nop,wscale 7>
18:38:31.317732 IP 192.168.3.2.ftp > x.x.x.x.45053: S 1998545683:1998545683(0) ack 3190836797 win 28960 <mss 1460,sackOK,timestamp 1123125 2834368503,nop,wscale 7>
18:38:31.317778 IP 172.16.61.3.ftp > x.x.x.x.45053: S 1998545683:1998545683(0) ack 3190836797 win 28960 <mss 1460,sackOK,timestamp 1123125 2834368503,nop,wscale 7>
18:38:31.368562 IP x.x.x.x.45053 > 172.16.61.3.ftp: . ack 1 win 46 <nop,nop,timestamp 2834368531 1123125>
18:38:31.368580 IP x.x.x.x.45053 > 192.168.3.2.ftp: . ack 1 win 46 <nop,nop,timestamp 2834368531 1123125>
18:38:33.257206 IP x.x.x.x.45053 > 172.16.61.3.ftp: P 1:3(2) ack 1 win 46 <nop,nop,timestamp 2834370444 1123125>
La salida de tcpdump en el caso de la PC con dirección 192.168.3.5 es
12:49:04.047809 IP x.x.x.x.60804 > 172.16.62.100.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986198269 0,nop,wscale 7>
12:49:04.048069 IP x.x.x.x.60804 > 192.168.3.5.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986198269 0,nop,wscale 7>
12:49:04.047884 IP 192.168.3.5.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 922143 2986198269,nop,wscale 7>
12:49:04.047909 IP 172.16.62.100.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 922143 2986198269,nop,wscale 7>
12:49:05.448336 IP 192.168.3.5.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 923544 2986198269,nop,wscale 7>
12:49:05.448351 IP 172.16.62.100.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 923544 2986198269,nop,wscale 7>
12:49:07.048100 IP x.x.x.x.60804 > 172.16.62.100.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986201269 0,nop,wscale 7>
12:49:07.048128 IP x.x.x.x.60804 > 192.168.3.5.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986201269 0,nop,wscale 7>
Para comprobar si los paquetes estaban realmente marcados, utilicé:
iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "
pero no tengo ninguna entrada en el archivo de registro
¿Cómo puedo permitir que la PC con la dirección IP 192.168.3.5 acceda y sea accesible a través de la puerta de enlace 172.16.62.254?