Asignación de IP pública al cliente OpenVPN. ¿iptables, ruta o qué usar para eso?

Asignación de IP pública al cliente OpenVPN. ¿iptables, ruta o qué usar para eso?

Tengo un servidor con Pi-Hole configurado para bloquear anuncios y rastreadores. Los clientes se conectan a través de OpenVPN y obtienen direcciones de 10.8.0.0/24. OpenVPN solo envía el DNS al cliente y el tráfico se enruta a través de la puerta de enlace local pero, por supuesto, cada cliente de la VPN puede comunicarse con todos los demás clientes a través de sus direcciones 10.8.0.x.

Ordené un segundo ipv4 que me gustaría usar específicamente para el cliente 10.8.0.4. Quiero poder acceder a la IP pública y exponer ese cliente directamente a Internet para usar un Nextcloud alojado localmente.

Busqué Server Fault y encontré algunos problemas similares. Intenté agregar reglas POSTROUTING y PREROUTING a iptables pero no funcionó. Actualmente, el ipv4 se agrega temporalmente a eth0 a través de 'ip addr add xx.xx.xx.xx. dev eth0', no tun0 (¿es correcto?). El servidor OpenVPN está configurado exactamente como se menciona en los documentos de Pi-Hole (https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-via-vpn/). net.ipv4.ip_forward está habilitado.

¿Tengo que usar iptables? ¿Es posible o recomendable agregar la ip pública a una ruta o algo así? Perdón si la pregunta suena tonta. Soy bastante nuevo en la configuración de OpenVPN y Route/iptables.

Eso es lo primero que probé:Redirigir todo el tráfico entrante desde una IP pública secundaria a una dirección IP interna usando iptables

Mis reglas actuales de iptables son:

# 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

Reglas NAT de 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

Después del comentario de NiKiZe, agregué temporalmente la dirección IP pública a través de

ip addr add xx.xx.xx.xx dev eth0

e ingresé ambas reglas (para aclarar que: exporté el conjunto de reglas de trabajo a través de iptables-save, edité ambos comandos y lo restauré a través de 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

Luego abrí varias sesiones de terminal y supervisé el tráfico web con tcpdump en el servidor OpenVPN y mi servidor local, confirmando que el tráfico entrante en eth0 a pi.hole.http se enruta correctamente a mi servidor local server.vpn.http. Pero la respuesta se agota...

Mis reglas nat actuales son:

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

Otra edición: cuando agrego 'src server.vpn' a tcpdump, puedo ver que no hay tráfico saliente desde el servidor local. Por lo tanto, tiene que haber un problema con la configuración del servidor local o con la regla de posenrutamiento. ¿Estoy en lo correcto?

Después de cambiar la ruta en server.vpn, la conexión funciona. 'ruta -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

Y después:

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

Si entiendo esto correctamente, eso significa que CADA conexión de red, incluso iniciada por server.vpn, se enruta a través de la VPN. Este no es el comportamiento previsto. Simplemente quiero que se pueda acceder al servidor localmente y utilizar Internet normal enrutado localmente y también responder a las conexiones enrutadas desde la IP pública en el servidor OpenVPN.

información relacionada