Ich bin über einen Router mit dem Internet verbunden und möchte UDP-Pakete über einen Port, sagen wir 3000, an eine VM innerhalb von KVM weiterleiten.
┌──────────────────┐
│ router │
│ 54.0.0.1 (public)│
│ 192.168.0.1 │
└────────┬─────────┘
│
│
┌──────▼──────┐
│ pc │
│ 192.168.0.2 │
│ 10.0.0.1 │
│ ┌────────┐ │
│ │vm │ │
│ │10.0.0.2│ │
│ └────────┘ │
│ │
└─────────────┘
Ich habe Port 3000 auf meinem Router geöffnet und alle UDP-Pakete an 192.168.0.2:3000 weitergeleitet und von dort aus Folgendes hinzugefügt:
sudo iptables -t nat -A PREROUTING -d 192.168.0.2 -p UDP --dport 3000 -j DNAT --to 10.0.0.2:3000
Dies funktioniert jedoch nicht wie erwartet. Das heißt, wenn ich Folgendes ausführe:
# on VM
$ nc -l -u -p 3000
# from another machine
$ nc 54.0.0.1 3000 -u -v
Ich kann keine Verbindung herstellen und keine Daten austauschen. Das Beste, was ich bisher erreicht habe, ist folgende output
Phase:
sudo iptables -t nat -A OUTPUT -d 192.168.0.2 -p UDP --dport 3000 -j DNAT --to 10.0.0.2:3000
und wenn ich dann nc 192.168.0.2 3000 -u -v
auflokalMaschine, ich werde mit der VM verbunden. Ich kann bereits sehen, tcpdump
dass Pakete von einem externen Netzwerk tatsächlich zugestellt werden, 192.168.0.2:3000
daher weiß ich nicht, warum das nicht vollständig funktioniert. (vom Internet bis zur VM)
Antwort1
Hast duIPv4-Weiterleitung aktivierenauf dem PC? Wenn es dort stehen bleibt, ist das wahrscheinlich der Grund.
Außerdem sollten Sie in iptables keine OUTPUT-Kettenregel benötigen; das PREROUTING ist ausreichend.
Ich habe Ihre Schritte im Wesentlichen wie folgt wiederholt:
┌──────────────────┐
│ Another Machine │
│ 192.168.146.129 │
└────────┬─────────┘
│
│
┌──────▼──────────┐
│ pc │
│ 192.168.146.132 │
│ 10.0.3.1 │
│ ┌──────────┐ │
│ │vm │ │
│ │10.0.3.100│ │
│ └──────────┘ │
│ │
└─────────────────┘
Auf VM:
# Start listener
nc -l -u -p 3000
Auf dem 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
Auf einer anderen Maschine:
# Connect
192.168.146.132 3000 -u -v
Hat bei mir damit prima geklappt:
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