[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Duda sobre policy-based routing.



El Tue, 31 de Mar de 2015, a las 01:56:29PM +0000, Camaleón dijo:

> > 0:      from all lookup local 
> > 10:     from all lookup main 
> > 249:    from 172.16.0.2 lookup TABLA1 
> > 250:    from 172.17.0.2 lookup TABLA2 
> > 999:    from 192.168.0.0/24 lookup TABLA1 
> > 1000:   from 192.168.1.0/24 lookup TABLA2 
> > 32767:  from all lookup default
>
> Esta tabla tuya no la pillo, la del documento que enlazas sí tiene lógica.

Sí, al final he hecho un solución parecida a la expuesta en LARTC que
toma del documento enlazado la idea de que la tabla main se revise al
principio. No sé si hay algo que sobra o que dejaría de funcionar en
algún caso especial (por ejemplo, cuando marcara tráfico para que
saliera por una interfaz concreta).

Se parte de esto (pongo otra vez el esquema):
                                                +---+
INTERNET -- 172.16.0.1 ---- 172.16.0.2 (eth0) --+   +--- 192.168.0.1 (eth2)
INTERNET -- 172.17.0.1 ---- 172.17.0.2 (eth1) --+   +--- 192.168.1.1 (eth3)
                                                +---+

Y se quiere hacer que el tráfico hacia internet procedente de la red
192.168.0.1 siempre salga por eth0 y el procedente de la red 192.168.1.1
por eth1.

La política de rutas es la que he puesto en el otro mensaje y en este se
ve comentada. Las reglas de cada cada tabla son las siguientes:

+ local: Las que ponga el núcleo de linux (no toco nada)
+ main: Sólo las entradas de las redes directamente conectadas. O sea:

#v+
$ ip route show
172.16.0.0/16 dev eth0  proto kernel  scope link  src 172.16.0.2 
172.17.0.0/16 dev eth1  proto kernel  scope link  src 172.17.0.2
192.168.0.0/24 dev eth2  proto kernel  scope link  src 192.168.0.1 
192.168.1.0/24 dev eth3  proto kernel  scope link  src 192.168.1.1
#v-

Al no haber ninguna indicación sobre cómo se va a otras redes, se
seguiría comprobando la política 249, porque "throw default" es una
entrada implícita.

+ TABLA1: Hay una única entrada que dice que se sale a internet por
  172.16.0.1:

#v+
# ip route show table TABLA1
default via 172.16.0.1 dev eth0
#v-

+ TABLA2: Hay una única entrada que dice que se sale a internet por
  172.17.0.1:

#v+
# ip route show table TABLA2
default via 172.17.0.1 dev eth1 
#v-

+ default: Hay una única entrada que dice por dónde se sale a internet.
  Al ser revisada en la última regla, sólo saldrá por aquí el tráfico
  que no haya sido encaminado por alguna regla anterior. Supongamos que
  balanceamos entre eth0 y eth1:

#v+
# ip route show table default
default 
        nexthop via 172.16.0.1  dev eth0 weight 1
        nexthop via 172.17.0.1  dev eth1 weight 1
#v-

Visto esto entiendo que si llega tráfico procedente del exterior a la
interfaz 172.16.0.2, la respuesta del servidor siempre será por esta
interfaz gracias a la regla 249, ya que como ip de origen de ese paquete
de respuesta, se toma la ip de destino del paquete al que se responde.
Idéntico razonamiento se puede hacer con la interfaz eth1 y la regla
250. Por tanto, estas dos reglas aseguran que siempre se responde por la
interfaz por la que se recibe tráfico. Obviamente, para que esto ocurra
así, la ip de origen ya debe estar fijada en el paquete antes de que se
empiecen a comprobar las reglas.

Ahora bien, si es el servidor el que origina tráfico (p. e. hace una
consulta DNS para resolver un nombre), entonces a priori no hay ip de
origen: esta se establecerá dependiendo de por qué interfaz salga el
paquete. Así llegamos a la última regla y la tabla default dice que 
se sale una vez por eth0 y la siguiente por eth1. Pero para que esto sea
así, la ip de origen no debe estar fijada al comprobarse las reglas,
sino fijarse como consecuencia de ellas.

Querría saber si esto es así o no, es decir, si cuando se responde se
establece la ip de origen antes de cualquier decisión de encaminamiento;
pero, sin embargo, cuando se inicia una comunicación la ip de origen se
establece como consecuencia de la decisión de encaminamiento: "como debe
salir por esta interfaz según las reglas de encaminamiento, le pongo la
ip de esta interfaz".

He hecho pruebas con el comando ping y la configuración que he puesto
parece funcionar: si se entra por eth0, se sale por eth0; si se entra
por eth1, se sale por eth1; y, si se hace ping desde el propio servidor,
hacia afuera, una vez se sale por eth0 y otra vez por eth1.

No sé si he logrado explicarlo todo bien.

Un saludo.

-- 
   Hay dos sistemas de conseguir la felicidad: uno, hacerse
el idiota; otro, serlo.
                  --- Enrique Jardiel Poncela. --


Reply to: