hola, tengo una duda y la voy a exponer aqui a ver si los mas doctos en redes y Linux me la pueden aclarar.
uso iptables para dar acceso a internet a varios ordenadores de una red interna, uno de los cuales actua como servidor.
Con DNAT puedo canviar la dirección de destino de un paquete que va diriqido a un puerto, por la dirección ip que desee, esto lo he usado y funciona, en cuanto que cambia la direccion de destino.
Pero lo que me encuentro es que el paquete no sale por la interface conectada a la red inerna.
tengo que añadir una regla en FORWARD para que saque el paquete por la interface apropiada.
con el comando route he visto que la tabla de rutas esta de la siguiente forma:
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth1
62.42.134.0 * 255.255.255.0 U 0 0 0 eth0
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
default 62.42.134.1 0.0.0.0 UG 0 0 0 eth0
mi duda es la siguiente:
¿Como puedo hacer que asigne una pasarela para cada red en lugar de los * cuando se inicia el router?
por que se que el * es la pasarela por defecto pero eso es cuando hay un paquete que no va dirigido a ninguna de las redes que hay en la tabla, pero cuando hay un paquete que va dirigido a la red que sea tiene que ir por la pasarela que se le indica en la tabla.
el router usa Mandrake 9.0.
Si alguien sabe como tengo que modificar los scripts de red para que al añadir la red en la tabla aparezca en el campo gateway la direccion ip de la pasarela, que por favor, lo diga.
No se si me habre explicado muy bien pero si lo necesitais os aclarare lo que no este claro.
Gracias.
sobre iptables y la pasarela por defecto
Una pasarela para una red local??????????
ERROR DE CONCEPTO!!!! :)
El * no se refiere a la pasarela por defecto, sino a que a ese tipo de ruta no admite pasarela, porque es una ruta que se refiere a una red directamente conectada a ese interfaz.
Vamos a ver.. Tu tienes dos redes locales y millones de rede remotas... la pasarela solo la necesitar para acceder a las redes remotas pero no a las locales...
>
-----------------\router\-------------\linux\-----------------
\\\\\\\\\\\\ \\\\\\\\\ ^
^ ^ eth1 192.168.1.1/24
80.1.1.3/24 eth0 80.1.1.4/24
En la figura de arriba, el linux no necesita ninguna pasarela para acceder a las direcciones 80.1.1.0-255 ni 192.168.1.0-255, ya que el propio sistema solo por poner una dirección a sus interfaces te meterá dos rutas del estilo:
80.1.1.0 netmask 255.255.255.0 direct eth0
192.168.1.0 netmask 255.255.255.0 direct eth1
porque directamente puede acceder a ellas a través de la ethernet y su ARP (protocolo de resolución de direcciones)
Si quieres poder acceder al resto del mundo, le deberás añadir una ruta hacia la máquina que le pueda comunicar con el resto del universo y que debe de ser accesible a través del las redes que tiene localmente conectadas, al estilo de:
0.0.0.0 netmask 0.0.0.0 gateway 8.1.1.3
Ahora que hemos explicado la teoria, vamos a analizar tu problema, dices que haces DNAT en FORWARD, esto es el paquete ya ha entrado en el router, y va a ser enviado, entonces le cambias la dirección y... es enviado tal y como iba a hacerse previamente... es decir por el interfaz equivocado....
prueba a hacer dnat en PREROUTING... "mano de santo". te pongo un ejemplo, imaginemos que queremos pasar los paquetes HTTP que lleguen al linux de la figura de arriba a la maquina 192.168.1.30:
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
-j DNAT --to 192.168.1.30:80
Un saludo
A VER SI FUNCIONA CON NBSP....
Una pasarela para una red local??????????
ERROR DE CONCEPTO!!!! :)
El * no se refiere a la pasarela por defecto, sino a que a ese tipo de ruta no admite pasarela, porque es una ruta que se refiere a una red directamente conectada a ese interfaz.
Vamos a ver.. Tu tienes dos redes locales y millones de rede remotas... la pasarela solo la necesitar para acceder a las redes remotas pero no a las locales...
>
-----------------\router\-------------\linux\-----------------
\\\\\\\\\\\\ \\\\\\\\\ ^
^ ^ eth1 192.168.1.1/24
80.1.1.3/24 eth0 80.1.1.4/24
En la figura de arriba, el linux no necesita ninguna pasarela para acceder a las direcciones 80.1.1.0-255 ni 192.168.1.0-255, ya que el propio sistema te meterá dos rutas del estilo:
80.1.1.0 netmask 255.255.255.0 direct eth0
192.168.1.0 netmask 255.255.255.0 direct eth1
porque directamente puede acceder a ellas a través de la ethernet y su ARP (protocolo de resolución de direcciones)
Si quieres poder acceder al resto del mundo, le deberás añadir una ruta hacia la máquina que le pueda comunicar con el resto del universo y que debe de ser accesible a través del las redes que tiene localmente conectadas, al estilo de:
0.0.0.0 netmask 0.0.0.0 gateway 8.1.1.3
Ahora que hemos explicado la teoria, vamos a analizar tu problema, dices que haces DNAT en FORWARD, esto es el paquete ya ha entrado en el router, y va a ser enviado, entonces le cambias la dirección y... es enviado tal y como iba a hacerse previamente... es decir por el interfaz equivocado....
prueba a hacer dnat en PREROUTING... mano de santo. te pongo un ejemplo, imaginemos que queremos pasar los paquetes HTTP que lleguen al linux de la figura de arriba a la maquina 192.168.1.30:
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.1.30:80
gracias por la explicacion ahora entiendo un poco mejor el tema.
sí hago DNAT sobre prerouting, y de hecho al ejecutar iptables -L -t nat salen las reglas y si tiene actividad, por lo menos dice que envia y recibe bytes.
Lo que ocurre y es el motivo de mi duda, es que para que esos paquetes llegen a la eth1 que es la interfaz de la red interna tengo que añadir una regla mas en forward para que esos paquetes sea metidos en la eth1, cosa que en teoria no es necesario y que confirma tu explicación.
estas son las reglas que uso:
$IPTABLES -t nat -A PREROUTING -i $ETHINET -p tcp -m tcp --dport 3000 -j DNAT --to-destination $IPADDRLOCAL:3000
Lo que decia antes, solo con esto seria suficiente, pero no. Tengo que añadir la siguiente regla:
$IPTABLES -A FORWARD -i $ETHINET -p tcp -m tcp --dport 3000 -j ACCEPT
para que se encaminen los paquetes.
¿Es esto normal?
Gracias por contestar.
Si tienes en otra regla un -j REJECT a todo lo que no este definido, es normal, si no mira que el direccionamiento ip de los interfaces esté correcto.
Un saludo.
Por defecto en FORWARD he puesto DROP, si es por eso si que le veo sentidoa la regla que tengo que añadir.
gracias