Gere regras de iptables ao conectar-se ao servidor VPN

Gere regras de iptables ao conectar-se ao servidor VPN

Estou construindo um servidor Ubuntu virtual (LXC no Proxmox) que atuará como roteador e encapsulará alguns dispositivos (por exemplo, AppleTV) da minha rede local através de uma VPN (expressVPN). A conexão e o roteamento para diferentes destinos VPN (diferentes países) estão funcionando.

Mas alguns serviços ainda sabem que não estou ligando do país onde o servidor VPN está localizado.Vazamento de DNS???)

Isso porque meu cliente, digamos que a caixa AppleTV usa, por exemplo, 1.1.1.1 como DNS. Ele não conhece o servidor DNS que o servidor VPN publicou no meu gateway.

Para evitar que isso aconteça, gostaria de usar o serviço DNS da VPN que recebo durante a conexão. Apontei o AppleTV para meu gateway como DNS e escrevi algumas regras de iptables para DNAT as solicitações aos servidores DNS fornecidos pelo servidor VPN. (Espero que faça 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

Isso funciona bem.

Pergunta

Como gerar automaticamente essas regras ao estabelecer a conexão OpenVPN? O endereço DNS específico mudará quando houver conexão com outra estação VPN (por exemplo, país diferente). ou há uma solução melhor?

Eu estava pensando em colocar isso no update-systemd-resolved, mas isso parece muito complicado. Presumo que haja um caminho fácil a seguir.

Agradeço qualquer dica.

Responder1

Bem-vindo, você pode usar o comando upe downem seu arquivo openvpn *.conf. Eles permitem executar scripts personalizados. script-security 2é obrigatório se você seguir este exemplo de estrada:

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

Os comandos reais iptablesestão nesses scripts. Por favor, verifique na página de manual se script-security 2é adequado para você.

Responder2

Responderei minha própria pergunta para mostrar minha solução.

Aprendi que resolveu usa um dns via stub (127.0.0.53) e portanto sabe usar o DNS da VPN.

Eu "apenas" tive que encaminhar/nat as solicitações de DNS dos clientes da LAN que estão usando este servidor como gateway (e DNS).

Na configuração do cliente openvpn adicionei as seguintes linhas:

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

Meus scripts estão em alta...

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

e para baixo

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 $@

regras básicas para largar principalmente outras coisas

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

observe essas regras, tive que adicioná-las para que o próprio nó pudesse procurar um nome depois que a conexão VPN fosse fechada (talvez porque eu gostaria de mudar a configuração da VPN para outro 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

A última coisa é adicionar dinamicamente o 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

e remova-o depois

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

Talvez isso ajude alguém que esteja construindo um gateway VPN.

informação relacionada