![Gere regras de iptables ao conectar-se ao servidor VPN](https://rvso.com/image/1072880/Gere%20regras%20de%20iptables%20ao%20conectar-se%20ao%20servidor%20VPN.png)
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 up
e down
em 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 iptables
estã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.