ルーター経由でインターネットに接続しており、ポート 3000 上の UDP パケットを KVM 内の VM にルーティングしたいと考えています。
┌──────────────────┐
│ 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転送を有効にするPC でですか? そこで止まる場合は、おそらくそれが原因です。
また、iptables では OUTPUT チェーン ルールは必要ありません。PREROUTING で十分です。
私は基本的に次のようにあなたの手順を再現しました:
┌──────────────────┐
│ Another Machine │
│ 192.168.146.129 │
└────────┬─────────┘
│
│
┌──────▼──────────┐
│ pc │
│ 192.168.146.132 │
│ 10.0.3.1 │
│ ┌──────────┐ │
│ │vm │ │
│ │10.0.3.100│ │
│ └──────────┘ │
│ │
└─────────────────┘
VM の場合:
# Start listener
nc -l -u -p 3000
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
他のマシンの場合:
# 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