Genere reglas de iptables mientras se conecta al servidor VPN

Genere reglas de iptables mientras se conecta al servidor VPN

Estoy construyendo un servidor Ubuntu virtual (LXC en Proxmox) que actuará como enrutador y hará un túnel en algunos dispositivos (por ejemplo, AppleTV) de mi red local a través de una VPN (expressVPN). La conexión y el enrutamiento a diferentes destinos VPN (diferentes países) están funcionando.

Pero algunos servicios aún saben que no estoy llamando desde el país en el que se encuentra el servidor VPN. (Creo que se llama¿¿¿DNS con fugas???)

Esto se debe a que mi cliente, digamos que la caja AppleTV usa, por ejemplo, 1.1.1.1 como DNS. No conoce el servidor DNS que el servidor VPN publicó en mi puerta de enlace.

Para evitar que eso suceda, me gustaría usar el servicio DNS de VPN que recibo cuando me conecto. Apunté el AppleTV a mi puerta de enlace como DNS y escribí algunas reglas de iptables para DNAT las solicitudes a los servidores DNS proporcionados por el servidor VPN. (Espero que tenga sentido)

# Route DNS Traffic
iptables -t nat -A PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination 10.54.0.1:53
iptables -t nat -A PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination 10.54.0.1:53

Eso funciona bien.

Pregunta

¿Cómo generar automáticamente estas reglas al establecer la conexión OpenVPN? La dirección DNS específica cambiará cuando se conecte a otra estación VPN (por ejemplo, un país diferente). ¿O hay una solución mejor?

Estaba pensando en ponerlo en el update-systemd-resolved, pero parece demasiado complicado. Supongo que hay un camino fácil a seguir.

Estoy agradecido por cualquier pista.

Respuesta1

Bienvenido, puede usar el comando upand downen su archivo openvpn *.conf. Estos permiten ejecutar scripts personalizados. script-security 2Es obligatorio si vas por este ejemplo de carretera:

script-security 2
up /usr/local/bin/set-redirect-dns.sh
down /usr/local/bin/unset-redirect-dns.sh

Los comandos reales iptablesestán en estos scripts. Consulte con la página de manual si script-security 2está bien para usted.

Respuesta2

Responderé mi propia pregunta para mostrar mi solución.

Aprendí que resuelto usa un dns vía stub (127.0.0.53) y por lo tanto sabe cómo usar el DNS de la VPN.

"Simplemente" tuve que reenviar/nat las solicitudes de DNS de los clientes de LAN que utilizan este servidor como puerta de enlace (y DNS).

En la configuración del cliente openvpn agregué las siguientes líneas:

mci@vpngateway:/etc/openvpn$ head destinations/belgium_udp.ovpn -n4
script-security 2
up /etc/openvpn/linkup.sh
down /etc/openvpn/linkdown.sh
down-pre

Mis guiones están listos...

mci@vpngateway:/etc/openvpn$ cat linkup.sh 
#!/bin/bash

# First let systemd-resolved do its magic
/etc/openvpn/update-systemd-resolved $@

# Set iptable rules
/etc/openvpn/iptables_baserules.sh

# Set DNS
/etc/openvpn/iptables_setdns.sh

y abajo

mci@vpngateway:/etc/openvpn$ cat linkdown.sh 
#!/bin/bash

# First delete DNS iptables rules
/etc/openvpn/iptables_removedns.sh

# After let systemd-resolved do its magic
/etc/openvpn/update-systemd-resolved $@

reglas básicas para dejar en su mayoría otras cosas

mci@vpngateway:/etc/openvpn$ cat iptables_baserules.sh 
#!/bin/bash

# Flush
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X

# Block All
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

# allow Localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Make sure you can communicate with any DHCP server
iptables -A OUTPUT -d 255.255.255.255 -j ACCEPT
iptables -A INPUT -s 255.255.255.255 -j ACCEPT

# Make sure that you can communicate within your own network
iptables -A INPUT -s x.x.x.0/24 -d x.x.x.0/24 -j ACCEPT
iptables -A OUTPUT -s x.x.x.0/24 -d x.x.x.0/24 -j ACCEPT

# Allow established sessions to receive traffic:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow TUN
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A OUTPUT -o tun0 -j ACCEPT

# allow VPN connection
iptables -I OUTPUT 1 -p udp --destination-port 1195 -m comment --comment "Allow VPN connection" -j ACCEPT
iptables -I OUTPUT 1 -p tcp --destination-port 1195 -m comment --comment "Allow VPN connection" -j ACCEPT

# Block All
iptables -A OUTPUT -j DROP
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

Tenga en cuenta estas reglas, tuve que agregarlas para que el nodo pudiera buscar un nombre después de que se cerrara la conexión VPN (tal vez porque me gustaría cambiar la configuración VPN a otro servidor).

iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

Lo último es agregar dinámicamente el DNS nat

mci@vpngateway:/etc/openvpn$ cat iptables_setdns.sh 
#!/bin/bash

# Route DNS Traffic
# Get DNS from VPN
dns=$(resolvectl dns -i tun0)
dns=${dns##* }
echo "Found DNS on tun0: ${dns}"
iptables -t nat -A PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53
iptables -t nat -A PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53

y retirarlo después

mci@vpngateway:/etc/openvpn$ cat iptables_removedns.sh 
#!/bin/bash

# Route DNS Traffic
# Get DNS from VPN
dns=$(resolvectl dns -i tun0)
dns=${dns##* }
echo "Found DNS on tun0: ${dns}"
iptables -t nat -D PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53
iptables -t nat -D PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53

Quizás esto ayude a alguien más que esté construyendo una puerta de enlace VPN.

información relacionada