我透過路由器連接到互聯網,並希望將連接埠(例如 3000)上的 UDP 封包路由到 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
我當地的機器,我將連接到虛擬機器。我已經可以看到tcpdump
來自外部網路的資料包確實已傳遞到,192.168.0.2:3000
所以我不知道為什麼這不能完全工作。 (從網路一直到虛擬機器)
答案1
你是否啟用 IPv4 轉送在電腦上?如果它停在那裡,可能是原因。
另外,您不應該需要 iptables 中的 OUTPUT 鏈規則; 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