Encaminhar pacotes UDP para VM em outro IP

Encaminhar pacotes UDP para VM em outro IP

Estou conectado à Internet através de um roteador e quero rotear pacotes UDP em uma porta, digamos 3000, para uma VM dentro do 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│  │
  │ └────────┘  │
  │             │
  └─────────────┘

Abri a porta 3000 no meu roteador e encaminhei todos os pacotes UDP para 192.168.0.2:3000 e, a partir daí, adicionei:

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

No entanto, isso não funciona como esperado, ou seja, se eu executar:

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

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

Não consigo fazer conexão e trocar dados. A coisa mais próxima que consegui deste trabalho foi ter outputo palco:

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

e então se eu nc 192.168.0.2 3000 -u -vestiverlocalmáquina, vou me conectar à VM. Já posso ver tcpdumpque os pacotes da rede externa são realmente entregues, 192.168.0.2:3000então não sei por que isso não funciona totalmente. (da internet até vm)

Responder1

Você fezativar o encaminhamento IPv4no computador? Se estiver parando por aí, provavelmente é por isso.

Além disso, você não deve precisar de uma regra de cadeia OUTPUT no iptables; o PREROUTING é suficiente.

Eu repliquei seus passos basicamente assim:

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

Na VM:

# Start listener
nc -l -u -p 3000

No 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

Em outra máquina:

# Connect
192.168.146.132 3000 -u -v

Funcionou muito bem com isso para mim:

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

informação relacionada