Reenviar paquetes UDP a VM en otra IP

Reenviar paquetes UDP a VM en otra IP

Estoy conectado a Internet a través de un enrutador y quiero enrutar paquetes UDP en un puerto, digamos 3000, a una VM dentro de KVM.

┌──────────────────┐    
│ router           │
│ 54.0.0.1 (public)│
│ 192.168.0.1      │
└────────┬─────────┘
  ┌──────▼──────┐
  │ pc          │
  │ 192.168.0.2 │
  │ 10.0.0.1    │
  │ ┌────────┐  │
  │ │vm      │  │
  │ │10.0.0.2│  │
  │ └────────┘  │
  │             │
  └─────────────┘

Abrí el puerto 3000 en mi enrutador y reenvié todos los paquetes udp a 192.168.0.2:3000, y desde allí agregué:

sudo iptables -t nat -A PREROUTING -d 192.168.0.2 -p UDP --dport 3000 -j DNAT --to 10.0.0.2:3000

Sin embargo, esto no funciona como se esperaba, es decir, si ejecuto:

# on VM
$ nc -l -u -p 3000

# from another machine
$ nc 54.0.0.1 3000 -u -v

No puedo establecer una conexión e intercambiar datos. Lo más parecido que tengo a este funcionamiento es tener outputuna etapa:

sudo iptables -t nat -A OUTPUT -d 192.168.0.2 -p UDP --dport 3000 -j DNAT --to 10.0.0.2:3000

y luego si nc 192.168.0.2 3000 -u -vsigolocalmáquina, me conectaré a VM. Ya puedo ver tcpdumpque los paquetes de la red externa se entregan, 192.168.0.2:3000así que no sé por qué esto no funciona completamente. (desde internet hasta vm)

Respuesta1

Acaso túhabilitar el reenvío IPv4en la computadora? Si se detiene allí, probablemente sea por eso.

Además, no debería necesitar una regla de cadena de SALIDA en iptables; el PREROUTING es suficiente.

Repliqué tus pasos básicamente así:

┌──────────────────┐    
│ Another Machine  │
│ 192.168.146.129  │
└────────┬─────────┘
  ┌──────▼──────────┐
  │ pc              │
  │ 192.168.146.132 │
  │ 10.0.3.1        │
  │ ┌──────────┐    │
  │ │vm        │    │
  │ │10.0.3.100│    │
  │ └──────────┘    │
  │                 │
  └─────────────────┘

En máquina virtual:

# Start listener
nc -l -u -p 3000

En PC:

# Add Port Forwarding rule
sudo iptables -t nat -A PREROUTING -d 192.168.146.132 -p udp --dport 3000 -j DNAT --to-destination 10.0.3.100:3000

# Enable IPv4 forwarding
sudo sysctl -w net.ipv4.ip_forward=1

# Monitor traffic
sudo tcpdump -nni any udp port 3000

En otra máquina:

# Connect
192.168.146.132 3000 -u -v

Funcionó bien con eso para mí:

nc 192.168.146.132 3000 -u -v
192.168.146.132: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.146.132] 3000 (?) open
^C

información relacionada