Я подключен к Интернету через маршрутизатор и хочу направить UDP-пакеты на порт, скажем, 3000, на виртуальную машину внутри 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│ │
│ └────────┘ │
│ │
└─────────────┘
Я открыл порт 3000 на своем маршрутизаторе и перенаправил все UDP-пакеты на 192.168.0.2:3000, а оттуда добавил:
sudo iptables -t nat -A PREROUTING -d 192.168.0.2 -p UDP --dport 3000 -j DNAT --to 10.0.0.2:3000
Однако это не работает так, как ожидалось, то есть если я запущу:
# on VM
$ nc -l -u -p 3000
# from another machine
$ nc 54.0.0.1 3000 -u -v
Я не могу установить соединение и обменяться данными. Самое близкое, что у меня есть к этой работе, это иметь output
стадию:
sudo iptables -t nat -A OUTPUT -d 192.168.0.2 -p UDP --dport 3000 -j DNAT --to 10.0.0.2:3000
и тогда если я nc 192.168.0.2 3000 -u -v
наместныймашина, я подключусь к VM. Я уже вижу, tcpdump
что пакеты из внешней сети действительно доставляются, 192.168.0.2:3000
так что я не знаю, почему это не работает полностью. (из интернета и до VM)
решение1
Ты сделал?включить переадресацию IPv4на ПК? Если он там останавливается, то, вероятно, поэтому.
Также вам не нужно правило цепочки OUTPUT в iptables; достаточно PREROUTING.
Я повторил ваши шаги примерно так:
┌──────────────────┐
│ Another Machine │
│ 192.168.146.129 │
└────────┬─────────┘
│
│
┌──────▼──────────┐
│ pc │
│ 192.168.146.132 │
│ 10.0.3.1 │
│ ┌──────────┐ │
│ │vm │ │
│ │10.0.3.100│ │
│ └──────────┘ │
│ │
└─────────────────┘
На ВМ:
# Start listener
nc -l -u -p 3000
На ПК:
# 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
На другой машине:
# Connect
192.168.146.132 3000 -u -v
У меня все отлично сработало:
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