iptables reenvía el tráfico al túnel vpn si está abierto

iptables reenvía el tráfico al túnel vpn si está abierto

Utilicé la siguiente guía para configurar mi Raspberry Pi como punto de acceso:

Raspberry Pi 3 como punto de acceso wifi

Estoy reenviando wlan0y eth0aplicando NAT a todo mi tráfico. ¡Funciona genial!

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

Ahora quiero configurar las mismas reglas excepto usar la interfaz tun0-00y reenviartodomi tráfico a través de mi túnel vpn. Quiero enviarlo todo, no quiero que se filtre nada en la red del host. Pensando que es algo como esto:

sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT

Desafortunadamente, sé que estas reglas de iptables no están completas... El problema es que eth0permanece activa; la regla original para reenviar el tráfico todavía eth0existe.

Quiero enviar todo mi tráfico a través del túnel si el túnel está abierto; si no, estoy bien usándolo eth0.

Actualizar:

Usé el indicador -I para insertar mis reglas:

sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT

La cadena ADELANTE:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  wlan0  tun0-00  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  tun0-00 wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth0   wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  wlan0  eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  wlan1  wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  wlan0  wlan1   0.0.0.0/0            0.0.0.0/0           

Todavía no hay alegría, el reenvío no parece funcionar.

Configuración de VPN del cliente

Eliminé cosas que parecían sensibles:

dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1

El pi se conecta bien y refleja una IP pública diferente. Los clientes todavía muestran el pi como su puerta de enlace pero ya no pueden conectarse.

Solución

Primero necesitaba agregarlo redirect-gateway def1al archivo .ovpn en el pi.

Entonces necesitaba escribir correctamente el nombre de mi interfaz... Uf. Me siento como un loco, pero al parecer lo vi tun0-00en un principio y esa fue la única vez que existió. En realidad, la interfaz es simplemente tun0.

Entonces los comandos apropiados de iptables fueron:

sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT

¡Funciona muy bien ahora!

Respuesta1

Necesitará ambos conjuntos de reglas dentro de iptables. Los dos conjuntos de reglas garantizan que el tráfico que sale por las interfaces especificadas esté adecuadamente enmascarado. Aquí está mi sugerencia, que es un poco más sencilla que la tuya:

# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forward everything
iptables -A FORWARD -j ACCEPT

La parte del rompecabezas que falta es la ruta. Si el túnel está activo, desea que "todo" el tráfico saliente lo utilice. En caso contrario utilice la ruta normal.

esto se manejadentro de OpenVPNutilizando el redirect-gateway def1parámetro en la configuración de su cliente.

Respuesta2

La herramienta útil es enumerar las reglas existentes con números de línea:

iptables --line-numbers -t filter -L FORWARD

Podrías eliminar las reglas con -Dla opción:

iptables -t filter -D FORWARD 1

Puede insertar una nueva regla en una ubicación especificada con -Ila opción:

iptables -t filter -I FORWARD 0 blah-blah-blah

esto insertaría una nueva regla al principio de una tabla, por lo que será consultada en un primer turno.

Editar:

Generalmente, sólo necesita una regla en la FORWARDtabla que coincida -m state --state RELATED,ESTABLISHED:

-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

ya que el seguimiento de conexiones permitiría enrutar todas las conexiones ya conocidas.

Y sí, necesitas configurarenrutamiento de políticaspara reenviar su wlantráfico no a la puerta de enlace predeterminada a la que probablemente se pueda acceder a través de su ethernet interfaz, sino a través de vpnla interfaz.

información relacionada