
Tengo preguntas sobre el flujo de paquetes IP para el siguiente escenario.
El escenario es:
- Una interfaz tun0 (10.0.0.2/8) y una tarjeta LAN inalámbrica física wlan0 (dirección IP no fija) en el lado del cliente, wlan0 podría conectarse a Internet,
- Otra interfaz tun0 (10.0.0.1/8) y una tarjeta ethernet física eth0 (192.168.1.38/24) en el lado del servidor (Ubuntu 12.04 amd64), eth0 está en una red privada detrás de un firewall NAT y podría conectarse a Internet a través de el firewall (firewall como puerta de enlace),
- ha ejecutado "
echo 1 > /proc/sys/net/ipv4/ip_forward
" en el lado del servidor, - ha ejecutado "
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
" en el lado del servidor,
Aquí está el diagrama del escenario:
--------------- ----------------
| | | |
| client tun0 |----------| client wlan0 |
| 10.0.0.2 | | ip not fix |
| | | |
--------------- ----------------
|
|
internet
|
|
----------------
| |
| firewall |
| (gateway) |
| 192.168.1.1 |
| |
----------------
|
| private network
| 192.168.1.0/24
|
--------------- ----------------
| | | |
| server tun0 |----------| server eth0 |
| 10.0.0.2 | | 192.168.1.38 |
| | | |
--------------- ----------------
He utilizado dos programas cliente/servidor muy simples tipo VPN para leer/escribir paquetes IP de las dos interfaces tun0 y crear un túnel entre wlan0 y eth0, de modo que los paquetes IP de 10.0.0.2 puedan llegar a 10.0.0.1 y viceversa ( por ejemplo, podría ejecutar ftp desde 10.0.0.1 a 10.0.0.2).
Sin embargo, si quiero utilizar el cliente tun0 (10.0.0.2) para navegar por páginas web, la solicitud http se originaría en 10.0.0.2 y se dirigiría a una dirección IP de Internet (seguramente no 10.0.0.1). La solicitud http, (creo) después de llegar al servidor tun0 (10.0.0.1), se reenviaría al servidor eth0 (ya que ip_forward está activado, y creo que esta solicitud http reenviada aún tendría una dirección IP de origen de 10.0.0.2, corríjanme si me equivoco) y allí se realiza NAT para reempaquetar la solicitud http como proveniente de eth0 (es decir, la dirección IP de origen cambia a 192.168.1.38 cuando ejecuté el comando iptables) y luego la solicitud http reempaquetada pasa a través del firewall (y luego Internet) hasta su destino.
Cuando la respuesta http (del sitio web) llega al servidor eth0, la NAT inversa debería realizarse allí. Mi pregunta es :
- ¿La NAT inversa revierte la dirección IP de destino de la respuesta http a 10.0.0.2?
- ¿Cómo sabe el servidor eth0 dónde reenviar la respuesta http con NAT invertida?
- ¿Eth0 reenviaría la respuesta http al servidor tun0 (10.0.0.1) ya que la dirección IP de destino de la respuesta tiene NAT inversa para ser 10.0.0.2?
- ¿Necesito agregar una ruta en el lado del servidor para el enrutamiento/reenvío adecuado de la respuesta http con NAT invertida? Si es así, ¿cómo?
- ¿Necesito agregar algunas reglas de iptables en el lado del servidor para un enrutamiento/reenvío adecuado de la respuesta http con NAT invertida? Si es así, ¿cómo?
Respuesta1
Suponiendo que su cliente envía todo el tráfico a través de tun0, debe agregar lo siguiente en el lado del servidor (después de habilitar /proc/sys/net/ipv4/ip_forward):
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
Después de este paso, cuando navegue por las páginas web de su cliente, el siguiente será el flujo de paquetes:
- El cliente enviará el paquete a 10.0.0.1.
- En el lado del servidor, el paquete recibido en tun0 se traducirá de 10.0.0.2 a 192.168.1.38.
- Se creará una entrada de mapeo en la tabla NAT.
- El paquete se enviará a Internet a través de 192.168.1.1 (puerta de enlace).
- Se recibirá respuesta al 192.168.1.38.
- La NAT inversa se producirá según la entrada de asignación creada en el paso 3.
- El paquete de respuesta se enrutará de regreso a 10.0.0.2.
Espero no estar perdiendo ningún paso importante :)