Discussion:
Problema de rutas
(demasiado antiguo para responder)
Chano Records Inc.
2008-04-12 17:56:58 UTC
Permalink
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.
Tengo rutas hacia los hosts C y D que salen a través de B.

Si hago ssh desde un host X hacia A entro sin problemas.
Si hago ssh desde X hacia B no obtengo respuesta.
Si hago ssh desde C o D hacia B entro sin problemas.

Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.

Como puedo solucionar el problema?

Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.

Gracias.
Cristian Gutierrez
2008-04-12 19:00:45 UTC
Permalink
Chano Records wrote:
[...]
Post by Chano Records Inc.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Como puedo solucionar el problema?
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
Ve si te sirve la idea de:

http://archive.cert.uni-stuttgart.de/suse-security/2005/01/msg00008.html

Consiste en algo asi: marcar el paquete que entra por B:22, agregar una
segunda ruta default (que sale por B) y agregar una regla "paquetes
marcados salen por la ruta default alternativa". Suena bien, pero jamas
lo he probado :P
--
Guti
Eduardo K.
2008-04-12 19:09:33 UTC
Permalink
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.
Tengo rutas hacia los hosts C y D que salen a través de B.
Si hago ssh desde un host X hacia A entro sin problemas.
por que la ruta por default es por A.
Post by Chano Records Inc.
Si hago ssh desde X hacia B no obtengo respuesta.
por que la ruta por default es por y el ISP de B tienebuenos filtros
antispoofing.
Post by Chano Records Inc.
Si hago ssh desde C o D hacia B entro sin problemas.
Estupendo...
Post by Chano Records Inc.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Como puedo solucionar el problema?
De forma simple no puedes. Podrias hacer un NAT o proxy ssh en C o D y
de ahi rebotar a B, pero desde X, con X cualquiera solo puedes llegar
a A si el ISP B hace bien las cosas.
Post by Chano Records Inc.
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
Gracias.
--
Eduardo K. | "The Stone Age did not end for a lack of stones,
http://www.carfun.cl | and the oil age will end not for a lack of oil."
http://ev.nn.cl | Sheik Yamani, Saudi oil minister, 1973
Yi Ci
2008-04-13 02:42:18 UTC
Permalink
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.
Tengo rutas hacia los hosts C y D que salen a través de B.
Si hago ssh desde un host X hacia A entro sin problemas.
Eso es correcto, ya que A es DG.
Post by Chano Records Inc.
Si hago ssh desde X hacia B no obtengo respuesta.
El paquete, si bien llega por B, la respuesta se vuelve por A. Aun cuando
no sea lo que quieres, es correcto el comportamiento.
Post by Chano Records Inc.
Si hago ssh desde C o D hacia B entro sin problemas.
Eso tambien es correcto, ya que B es DG de C y D.
Post by Chano Records Inc.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Como puedo solucionar el problema?
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
Gracias.
A ver:
[Servidor]-(A)<----> (INET) <--(X) (*)default
+ ^
(B)----------------+
(D)--^
(C)--+

- habilita un soporte de ip dinamicas, como dynnds.org o no-ip.com.
(ejemplo.byndns.org)
- crea el registro B y el PTR para ip_B (otroejemplo.mizona.cl)
en el servidor levanta el SSHD por la IP_B.
- habilita el forzado de source_address de TCP en iptables (de hecho es
una buena practica hacerlo, asi como la comprobacion del reverso de DNS).
hagale desde fuera ssh al nombre dns de A (ejemplo.dyndns.org) o B
(otroejemplo.mizona.cl).

Ojala que te haya entendido bien el escenario.
Eduardo Romero
2008-04-13 18:14:35 UTC
Permalink
Debes jugar con ip2 route con source routing, el problema es q
marcara todos los protocolos , no solo el ssh.

buscar relatirvo a lartc en google.

Saludos
Edo.
Post by Yi Ci
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.
Tengo rutas hacia los hosts C y D que salen a través de B.
Si hago ssh desde un host X hacia A entro sin problemas.
Eso es correcto, ya que A es DG.
Post by Chano Records Inc.
Si hago ssh desde X hacia B no obtengo respuesta.
El paquete, si bien llega por B, la respuesta se vuelve por A. Aun cuando
no sea lo que quieres, es correcto el comportamiento.
Post by Chano Records Inc.
Si hago ssh desde C o D hacia B entro sin problemas.
Eso tambien es correcto, ya que B es DG de C y D.
Post by Chano Records Inc.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Como puedo solucionar el problema?
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
Gracias.
[Servidor]-(A)<----> (INET) <--(X) (*)default
+ ^
(B)----------------+
(D)--^
(C)--+
- habilita un soporte de ip dinamicas, como dynnds.org o no-ip.com.
(ejemplo.byndns.org)
- crea el registro B y el PTR para ip_B (otroejemplo.mizona.cl)
en el servidor levanta el SSHD por la IP_B.
- habilita el forzado de source_address de TCP en iptables (de hecho es
una buena practica hacerlo, asi como la comprobacion del reverso de DNS).
hagale desde fuera ssh al nombre dns de A (ejemplo.dyndns.org) o B
(otroejemplo.mizona.cl).
Ojala que te haya entendido bien el escenario.
Aldrin Martoq
2008-04-13 23:30:14 UTC
Permalink
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.
Tengo rutas hacia los hosts C y D que salen a través de B.
Si hago ssh desde un host X hacia A entro sin problemas.
Si hago ssh desde X hacia B no obtengo respuesta.
Si hago ssh desde C o D hacia B entro sin problemas.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Muy probablemente, pero esto no implica que la conexion al host:puerto
B:22 no funcione. En ningun caso deberias perder paquetes aunque los
tires por A, quizas alguien o algo esta botando tus paquetes?
Post by Chano Records Inc.
Como puedo solucionar el problema?
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
Primero verifica que esto es realmente lo que esta sucediendo. Un simple
tcpdump te dara la respuesta a esta y otras preguntas.

Segundo, valida si lo que llega a X es lo que esperas... quizas cuando
te conectas a B recibes respuestas como si te hubieras conectado a A.


En todo caso te preguntaria para que tienes la conexion B aparte de la
A, ya que no esta siendo de mucha ayuda o quizas no esta funcionando
como esperabas. Para que tienes B o A?

-- Aldrin
Alberto Hormazabal C.
2008-04-14 18:01:00 UTC
Permalink
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.
Tengo rutas hacia los hosts C y D que salen a través de B.
Si hago ssh desde un host X hacia A entro sin problemas.
Si hago ssh desde X hacia B no obtengo respuesta.
Si hago ssh desde C o D hacia B entro sin problemas.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Como puedo solucionar el problema?
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
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.

Una solucion facil es posible solo si conoces las ips o subredes desde
la cual se conectaran tus clientes.

En caso contrario tienes que invocar a los dioses de iptables e iproute
y pedirles que te iluminen.

aca hay una pagina que te puede ser util:
http://www.linuxhorizon.ro/iproute2.html


y por supuesto tambien nunca esta demas echarle una mirada al Linux
Advanced Routing and Traffic Control HOWTO:

http://lartc.org/
--
El Tuto
***@aalc.lj.cl
Aldrin Martoq
2008-04-14 23:02:40 UTC
Permalink
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.
Tengo rutas hacia los hosts C y D que salen a través de B.
Si hago ssh desde un host X hacia A entro sin problemas.
Si hago ssh desde X hacia B no obtengo respuesta.
Si hago ssh desde C o D hacia B entro sin problemas.
Lo que supongo que pasa es que la conexión en el segundo caso llega
desde X a B pero trata de volver a X a través de A.
Como puedo solucionar el problema?
Estoy usando reglas de iptables para limitar los accesos, pero incluso
eliminando todas las reglas, el problema persiste.
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.
Debo insistir que eso no es un problema per se... Ese caso debe
funcionar, sin problemas.



-- Aldrin
Alberto Hormazabal C.
2008-04-15 22:42:55 UTC
Permalink
Post by Aldrin Martoq
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.
Debo insistir que eso no es un problema per se... Ese caso debe
funcionar, sin problemas.
efectivamente no es un problema per se, el diseño basico de IP le
permitiria funcionar bien en un caso asi. Sin embargo ciertas
situaciones externas, como por ejemplo esos filtros antispoofing que
comentaba el Yayo, o las redes con NAT y enmascaramiento, resultan en
este tipo de problemas.

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.
--
El Tuto
***@aalc.lj.cl
Alberto Hormazabal C.
2008-04-15 22:44:23 UTC
Permalink
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.
--
El Tuto
***@aalc.lj.cl
Chano Records Inc.
2008-04-16 14:01:32 UTC
Permalink
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

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

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.
Aldrin Martoq
2008-04-17 04:26:40 UTC
Permalink
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

Loading...