Post by Chano Records Inc.Post by Alberto Hormazabal C.Post by Alberto Hormazabal C.Post by Alberto Hormazabal C.Post by Chano Records Inc.Tengo un servidor con dos ips publicas A (dinámica) y B (fija).
Me interesa levantar acceso ssh hacia el servidor únicamente a través de B.
La ruta por defecto es a través de A.
el problema que tienes es, tal como ya dijeron aca, que los paquetes que
entran por B, tratan de salir por A ya que es A el default gateway, por
ende el cliente no esta recibiendo los paquetes de vuelta. Es un
problema tipico que pasa cuando se tienen 2 conexiones.
Ademas en este caso se produce un problema adicional por parte de TCP.
Si mal no recuerdo, los sockets se identifican con la tupla (ip origen,
puerto origen, ip destino, puerto destino, protocolo). Si una peticion
de conexion ssh llega por B, y luego sale por A, el paquete la respuesta
saldria con una ip de origen distinta a la ip de destino del paquete entrante,
por lo que el cliente no podria reconocerlo como parte de la conexion y
por ende no funcionando para nada.
Esto ultimo asumiendo que el paquete de salida sale con la IP de la
interfaz por la cual sale, cosa que ahora no tengo tiempo de comprobar.
Sale con la IP de la interfaz por la cual entró.
El SYN entra por la interfaz B con la tupla (X,p,B,22,TCP) y el
SYN_ACK trata de salir por la interfaz A con la tupla (B,22,X,p,TCP).
He tratado de realizar la marca de paquetes que me sugirieron en los
links, pero al revisar el estado de las conexiones en
/proc/net/ip_conntrack aparece con marca = 0. Debería ser 2.
tcp 6 58 SYN_RECV src=X dst=B sport=36075 dport=22 packets=1
bytes=60 src=B dst=X sport=22 dport=36075 packets=1 bytes=60 mark=0 use=1
Sigue siendo un caso extrano, esto debe funcionar. Alguien o algo esta
bloqueando esos paquetes. Que conexion tienes en A?
Falto saber que recibes en X. Puedes usar wireshark (ex ethereal), esta
disponible para varios sistemas operativos ...
Post by Chano Records Inc.Para realizar las marcas estoy usando (antes puse reglas más
específicas, ahora ya lo hice a lo bruto no más y aun así no marca nada)
iptables -A INPUT -i eth2 -j MARK --set-mark 2
tienes que usar de target CONNMARK, con tu regla de iptables estas
marcando los paquetes que entran pero no los que salen, ya que esos los
generas tu.
# iptables -j CONNMARK --help
(Hint: save-mark debe corresponder a fwmark en iproute)
Post by Chano Records Inc.Como la marca no surte efecto, se sigue ruteando por donde siempre y no
por el lado que quiero.
Estoy pensando que el kernel no tiene soporte para marcas, pero me
parece que viene por defecto en el soporte de iptables.
Ideas? que estoy haciendo mal? :(
Gracias a todos por la ayuda.
Si no se resuelve por la buena, resuelvelo por la mala como te
sugerieron aca ;)
Para que los paquetes de vuelta se vayan por la interfaz de B, tienes
que tener una gw para B y una regla especial. El gateway ya lo tienes,
pues lo usas para llegar a C y D. Voy a suponer que es "Z".
Algo como lo siguiente:
Tabla adicional, reemplaza "B" por la IP
# ip rule add from "B" table 200
Ruta adicional, reemplaza "Z" por el gateway en la red de "B".
# ip route add default via "Z" table 200
Corre los tcpdumps etc correspondientes para validar.
Puedes ver lo que hiciste con lo siguiente:
1) # ip rule show
2) # ip route show table 200
3) # ip route show table main
4) # ip route show table default
En 2. Solo debes ver tu nueva ruta default. En 3. debes ver lo mismo que
"route -n". En 4. no deberias ver nada.
Esto reemplaza lo que trataste de hacer marcando los paquetes con
conntracking y tiene la ventaja de no necesitar connection tracking y
rutear cualquier conexion a la IP B a traves del router/gateway "Z"...
Supongo esto es lo que realmente quieres...
-- Aldrin