
Tengo un servidor OpenVPN y un cliente, y quiero usar este túnel para acceder no solo 10.0.8.0/24
a Internet sino a todo. Hasta ahora, hacer ping al servidor desde el cliente a través de la tun0
interfaz funciona, y viceversa.
Sin embargo, hacer ping www.google.com
desde el cliente tun0
no funciona (se pierden todos los paquetes).
Pensé que debería configurar el servidor para que cualquier paquete proveniente tun0
del 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
wlan0
y un adaptador TUNtun0
. - El servidor utiliza un adaptador Ethernet
eth0
y un adaptador TUNtun0
. la VPN se expande
10.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 MASQUERADE
oiptables -t nat -A POSTROUTING -o ext_if-j SNAT --to-source ext_ip
con el significado obvio deext_if
yext_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 hacia0.0.0.0/1
y128.0.0.0/1
en 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.
- estableciendo una ruta explícita a A vía S: