Tenho um servidor com Pi-Hole configurado para bloquear anúncios e rastreadores. Os clientes são conectados via OpenVPN e obtêm endereços de 10.8.0.0/24. O OpenVPN apenas envia o DNS para o cliente e o tráfego é roteado através do gateway local, mas é claro que cada cliente na VPN pode entrar em contato com todos os outros clientes através de seus endereços 10.8.0.x.
Encomendei um segundo ipv4 que gostaria de usar especificamente para o cliente 10.8.0.4. Quero poder acessar o IP público e expor esse cliente diretamente à Internet para usar um Nextcloud hospedado localmente.
Pesquisei Server Fault e encontrei alguns problemas semelhantes. Tentei adicionar regras POSTROUTING e PREROUTING ao iptables, mas não funcionou. O ipv4 está atualmente adicionado temporariamente à eth0 via 'ip addr add xx.xx.xx.xx. dev eth0', não tun0 (correto?). O servidor OpenVPN é configurado exatamente como mencionado nos documentos do Pi-Hole (https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-via-vpn/). net.ipv4.ip_forward está habilitado.
Eu ainda tenho que usar o iptables? É possível ou aconselhável adicionar o ip público a uma rota ou algo assim? Desculpe se a pergunta parece boba. Sou muito novo na configuração do OpenVPN e do Route/iptables.
Essa é a primeira coisa que tentei:Redirecione todo o tráfego de entrada de um IP público secundário para um endereço IP interno usando iptables
Minhas regras atuais do iptables são:
# Generated by xtables-save v1.8.2 on Thu Dec 12 14:37:26 2019
*nat
:PREROUTING ACCEPT [329:28209]
:INPUT ACCEPT [281:25114]
:POSTROUTING ACCEPT [17:1423]
:OUTPUT ACCEPT [245:22126]
-A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source xx.xx.xx.xx
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Dec 12 14:37:26 2019
# Generated by xtables-save v1.8.2 on Thu Dec 12 14:37:26 2019
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i tun0 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i tun0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2202 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -p udp -m udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Thu Dec 12 14:37:26 2019
Regras NAT do iptables:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.8.0.0/24 !10.8.0.0/24 to:xx.xx.xx.xx
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Após o comentário do NiKiZe adicionei o endereço IP público temporariamente via
ip addr add xx.xx.xx.xx dev eth0
e inseri ambas as regras (para esclarecer que: exportei o conjunto de regras de trabalho via iptables-save, editei ambos os comandos e restaurei-o via iptables-restore)
-A PREROUTING -d xx.xx.xx.xx -j DNAT --to-destination 10.8.0.4
-A POSTROUTING -s 10.8.0.4 ! -d 10.8.0.4 -j SNAT --to-source xx.xx.xx.xx
Em seguida, abri várias sessões de terminal e monitorei o tráfego da web com tcpdump no servidor OpenVPN e em meu servidor local, confirmando que o tráfego de entrada em eth0 para pi.hole.http é roteado corretamente para meu servidor local server.vpn.http. Mas a resposta expira...
Minhas regras nat atuais são:
user@dns:~# iptables -t nat -vL --line-numbers
Chain PREROUTING (policy ACCEPT 1 packets, 52 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DNAT all -- any any anywhere pi.hole to:10.8.0.4
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 1 packets, 60 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 SNAT all -- any any server.vpn !server.vpn to:xx.xx.xx.xx <- temporarily added ip address
2 0 0 SNAT all -- any any 10.8.0.0/24 !10.8.0.0/24 to:xx.xx.xx.xx <- main ip address, statically entered
3 0 0 MASQUERADE all -- any eth0 anywhere anywhere
Chain OUTPUT (policy ACCEPT 1 packets, 60 bytes)
num pkts bytes target prot opt in out source destination
Outra edição: quando adiciono 'src server.vpn' ao tcpdump, posso ver que não há tráfego de saída do servidor local. Portanto, deve haver um problema com a configuração do servidor local ou com a regra de pós-routeamento. Estou correcto?
Após alterar a rota no server.vpn a conexão está funcionando. 'rota -n' Antes:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.178.1 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth3
169.254.160.0 169.254.160.1 255.255.248.0 UG 0 0 0 tun1000
169.254.160.0 0.0.0.0 255.255.248.0 U 0 0 0 tun1000
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.178.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
E depois:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.8.0.1 0.0.0.0 UG 0 0 0 tun0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth3
169.254.160.0 169.254.160.1 255.255.248.0 UG 0 0 0 tun1000
169.254.160.0 0.0.0.0 255.255.248.0 U 0 0 0 tun1000
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.178.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Se bem entendi, isso significa que TODAS as conexões de rede, mesmo iniciadas por server.vpn, são roteadas através da VPN. Este não é o comportamento esperado. Eu simplesmente quero que o servidor seja acessível localmente e use a Internet regular roteada localmente e também responda às conexões roteadas a partir do IP público no servidor OpenVPN.