Ich habe vor kurzem meinen persönlichen Webserver in einen Container gepackt. Allerdings habe ich jetzt festgestellt, dass er nicht mehr über IPv6 erreichbar ist. Portmapping ( -p 80:80 -p 443:443
) funktioniert nur für IPv4:https://github.com/containers/podman/issues/4323.
Bisher habe ich es geschafft, dem Pod eine eigene IPv6-ULA-Adresse zuzuweisen, indem ich
[
{
"subnet": "fc01::/48",
"gateway": "fc01::1"
}
]
in /etc/cni/net.d/87-podman-bridge.conflist. Jetzt kann ich also curl 'http://[fc01::1]'
vom Host selbst aus. Aber ich kann nicht herausfinden, ip6tables
wie ich Anfragen an die öffentliche IP-Adresse an den Container weiterleiten kann. Basierend aufhttps://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/ch18s04.html, Ich habe es versucht
# ip6tables -t nat -A POSTROUTING -o eth0 -s fc01::1/48 -j MASQUERADE
# ip6tables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination '[fc01::1]:80'
# ip6tables -A FORWARD -i eth0 -o cni-podman0 -p tcp --dport 80 -j ACCEPT
und verschiedene Untermengen dieser Befehle, aber ich erhalte entweder Timeouts oder „Keine Route zum Host“.
Meine Adressen sehen folgendermaßen aus:
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether f2:3c:91:c8:5b:d9 brd ff:ff:ff:ff:ff:ff
inet <PUBLIC IPv4>/24 brd <BROADCAST> scope global eth0
valid_lft forever preferred_lft forever
inet6 <PUBLIC IPv6>/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2591999sec preferred_lft 604799sec
inet6 fe80::f03c:91ff:fec8:5bd9/64 scope link
valid_lft forever preferred_lft forever
3: cni-podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether b6:58:df:4b:b9:71 brd ff:ff:ff:ff:ff:ff
inet 10.88.0.1/16 brd 10.88.255.255 scope global cni-podman0
valid_lft forever preferred_lft forever
inet6 fc01::1/48 scope global
valid_lft forever preferred_lft forever
inet6 fe80::b458:dfff:fe4b:b971/64 scope link
valid_lft forever preferred_lft forever
4: vethb4059020@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni-podman0 state UP group default
link/ether d6:5d:37:f2:0c:48 brd ff:ff:ff:ff:ff:ff link-netns cni-26c430c8-c816-8962-b2f2-b3bbb5274f93
inet6 fe80::d45d:37ff:fef2:c48/64 scope link
valid_lft forever preferred_lft forever
Antwort1
Nein, Sie benötigen keine Portweiterleitung. Der Container erhält eine eindeutige IP-Adresse; das Ziel istnichtder Gastgeber.
Sagen Sie zum Beispiel:
- Deinzufällig generiertes ULA-Netzwerk War
fdab:9bac:936f::/48
fdab:9bac:936f:0ca2::/64
Einem Gastgeber für Container gegeben- Ihre Routentabellen leiten das Container-Subnetz an den richtigen Host weiter.
fdab:9bac:936f:0ca2::443
Diesem Webserver-Container zugewiesen (Vanity-IP über statische Adressierung)- Der Host hat zufällig eine IP von
fdab:9bac:936f:1292::359
(anderes Subnetz)
Greifen Sie dann unter auf den Webserver-Container zu fdab:9bac:936f:0ca2::443
. Wenn im Container nur ein Webserver ausgeführt wird, sind dies die einzigen offenen Ports (80 und 443).
Erst seit kurzem ermöglicht Container-Networking vernünftige IPv6-Konfigurationen, die NAT überspringen. Meine Interpretation des ProblemsPodman und IPv6ist dasCNI-Pluginsverfügen über die Funktionen zum Definieren der IP-Adresszuweisung und zum Pushen von Routen. Wenn Sie sich für diese Art der Containervernetzung entscheiden.
ULA ist nicht ideal. Es wird nicht über das Internet geroutet. Adressauswahlrichtlinien haben eine niedrigere Priorität als IPv4.
Über das Internet routbar ist besser. Leider haben Sie Ihre IP-Adresse verschleiert.