Hola a todos
He montado una red virtual en casa. Algo así:
Router1 <-------> firewall <--------> cliente
Router2 <------------|
de manera que:
- el Router1 está en el eth0 del firewall
- el Router2 está en el eth1 del firewall
- el cliente está en el eth2 del firewall
Si al firewall le pongo como default gw Router1, el cliente navega y puede conectarse por ssh
Si al firewall le pongo como default gw Router2, el cliente navega y puede conectarse por ssh
Si ejecuto en el firewall el script de más abajo, el cliente navega pero no puede conectarse por ssh
IPs importantes (las que tengas los Routers para acceder a Internet es inútil aquí):
Router1:
- eth0: 10.10.1.254/24
Router2:
- eth0: 10.10.2.254/24
Router1 y Router2 tienen ambos una ruta para llegar a la 10.0.0.0/24 y así no tener que hacer NAT en el firewall.
Cliente:
- eth0: 10.0.0.1/24
Firewall:
- eth0: 10.10.1.1/24
- eth1: 10.10.2.1/24
- eth2: 10.0.0.254/24
-----------SCRIPT---------------
#!/bin/bash
# damos de alta las reglas en el firewall para markar paquetes al puerto dport nuevos, relacionados o con conexion establecida
iptables -A PREROUTING -t mangle -p tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -p tcp --dport 21 -m state --state NEW,RELATED,ESTABLISHED -j MARK --set-mark 2
# solo necesitamos una tabla pues ambos protocolos van por la misma ruta:
# Añadir: 201 sshftp.out a /etc/iproute2/rt_tables si no lo esta ya
ip rule add fwmark 1 table sshftp.out
ip rule add fwmark 2 table sshftp.out
# generamos todas las rutas de la tabla principal menos el gw
while read line ;do
test -z "${line##default*}" && continue
test -z "${line##nexthop*}" && continue
ip route add $line table sshftp.out
done < \
<(/sbin/ip route ls table main)
#creamos el default gw
/sbin/ip route add default via 10.10.2.254 dev eth1 table sshftp.out
/sbin/ip route add default via 10.10.1.254 dev eth0
-------------EOF------------------------
Rutas en el Firewall (tabla main):
10.10.1.0/24 dev eth0 proto kernel scope link src 10.10.1.1
10.10.2.0/24 dev eth1 proto kernel scope link src 10.10.2.1
10.0.0.0/24 dev eth2 proto kernel scope link src 10.10.0.254
default via 10.10.1.254 dev eth0
Rutas en el Firewall (tabla sshftp.out):
10.10.1.0/24 dev eth0 proto kernel scope link src 10.10.1.1
10.10.2.0/24 dev eth1 proto kernel scope link src 10.10.2.1
10.0.0.0/24 dev eth2 proto kernel scope link src 10.10.0.254
default via 10.10.2.254 dev eth1
Estoy haciendo NAT en Router1 y Router2, pero no afecta al problema ya que los SYN+ACK de los ssh están llegando al FW a través de Router2. Lo que parece es que le llegan los paquetes al FW y no sabe cómo enviárselos al eth2.
¿puede ser que de alguna manera los paquetes, aunque no tengan como puerto de destino el 22 (al ser respuesta el puerto 22 será de origen), estén siendo marcados y enviados por algún otro interfaz?
He puesto un sniffer en todos los interfaces de las 4 máquinas (menos en los que van a Internet) y puedo ver los paquetes fluir sin problema en una conexión HTTP a través del Router1. Si abro una conexión SSH veo que los paquetes SYN+ACK llegan por el eth1 procedentes del Router2, pero al eth2 del firewall no le llega ni un sólo paquete de los respondidos por el servidor.
¿Alguna idea? ¿Algo que se me haya pasado? ¿Alguna idea loca genial?
Gracias