Hacer ping a un servidor externo a través del túnel OpenVPN no funciona

Hacer ping a un servidor externo a través del túnel OpenVPN no funciona

Tengo un servidor OpenVPN y un cliente, y quiero usar este túnel para acceder no solo 10.0.8.0/24a Internet sino a todo. Hasta ahora, hacer ping al servidor desde el cliente a través de la tun0interfaz funciona, y viceversa.

Sin embargo, hacer ping www.google.comdesde el cliente tun0no funciona (se pierden todos los paquetes).

Pensé que debería configurar el servidor para que cualquier paquete proveniente tun0del destino de Internet sea reenviado, así que se me ocurrió esta línea de configuración de iptables:

interface_connecting_to_the_internet='eth0'
interface_openvpn='tun0'
internet_ip_address=`ifconfig "$interface_connecting_to_the_internet" | sed -n s'/.*inet \([0-9.]*\).*/\1/p'`

iptables -t nat -A POSTROUTING -o "${interface_connecting_to_the_internet}" -j SNAT --to-source "${internet_ip_address}"
echo '1' > /proc/sys/net/ipv4/ip_forward

Sin embargo, esto no funciona, los paquetes aún se pierden y me pregunto qué podría estar mal con mi configuración.


Algunos detalles:

La ruta ip da en el servidor:

default via 176.31.127.254 dev eth0  metric 3 
10.8.0.0/24 via 10.8.0.2 dev tun0 
10.8.0.2 dev tun0  proto kernel  scope link  src 10.8.0.1 
127.0.0.0/8 via 127.0.0.1 dev lo 
176.31.127.0/24 dev eth0  proto kernel  scope link  src 176.31.127.109 

La ruta ip le da al cliente:

default via 192.168.1.1 dev wlan0  proto static 
10.8.0.1 via 10.8.0.5 dev tun0 
10.8.0.5 dev tun0  proto kernel  scope link  src 10.8.0.6 
127.0.0.0/8 via 127.0.0.1 dev lo  scope link 
192.168.1.0/24 dev wlan0  proto kernel  scope link  src 192.168.1.109 

  • El cliente utiliza un adaptador wifi wlan0y un adaptador TUN tun0.
  • El servidor utiliza un adaptador Ethernet eth0y un adaptador TUN tun0.
  • la VPN se expande10.0.8.0/24

  • Tanto el cliente como Linux utilizan Linux 3.6.1.

Respuesta1

Para resumir la discusión:

Para llegar a un host A específico a través de una VPN desde el cliente C al servidor S, hay que:

  • habilitar el reenvío de IP en S ( sysctl -w net.ipv4.ip_forward=1)
  • habilite el enmascaramiento o snat a través de iptables en S: iptables -t nat -A POSTROUTING -o ext_if -j MASQUERADEo iptables -t nat -A POSTROUTING -o ext_if-j SNAT --to-source ext_ipcon el significado obvio de ext_ify ext_ip.
  • configure el enrutamiento apropiado en C, ya sea (S denota la dirección IP de Sen la VPN):
    • estableciendo una ruta explícita a A vía S:ip route add A via S dev vpn_if
    • estableciendo una ruta predeterminada a través de S: ip route add default via S dev vpn_if, donde también hay que establecer una ruta adecuada a S: ip route add S via previous_gateway dev prev_if.
    • utilizando push "redirect-gateway def1"en el servidor, en cuyo caso OpenVPN configurará rutas hacia 0.0.0.0/1y 128.0.0.0/1en C a través de S, que son más específicas que la ruta predeterminada y se pueden eliminar fácilmente cuando se detiene el túnel.

información relacionada