staging.inyokaproject.org

Namensauflösung/Routing IPv4/v6 für localhost

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Moin, kann mir jemand erklären, nach welchen Regeln / Prios die Namensauflösung für und das Routing von IPv4/IPv6 funktioniert? Oder einen Link zum Wiki schicken ...

Hintergrund meiner Frage:

# netstat -tulpn | grep 8086
tcp6       0      0 :::8086                 :::*                    LISTEN      76751/docker-proxy

Der Dienst lauscht hier also auf IPv6.

1
2
# curl localhost:8086 
404 page not found

ok. (der Dienst antwortet, dass er mit 404 antwortet tut nichts zur Sache)

1
2
# curl 127.0.0.1:8086
404 page not found

Warum? Wird da IPv4 nach IPv6 geroutet?

Gestern hatte ich ich den Effekt, dass bei gleicher netstat-Ausgabe ein Dienst nur auf

1
# curl 127.0.0.1:8086

und nicht auf

1
# curl localhost:8086 

antwortete. Da war meine Verwirrung perfekt. Danke schon mal für die Hilfe.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

BillMaier schrieb:

[…] Namensauflösung … und das Routing von IPv4/IPv6 funktioniert?

1
2
# curl localhost:8086 
404 page not found

[…]

1
2
# curl 127.0.0.1:8086
404 page not found

Warum?

  • localhost ist üblicherweise 127.0.0.1! (Und meistens auch nur 127.0.0.1!)

  • Kannst Du selbst überprüfen:

    host localhost

Wird da IPv4 nach IPv6 geroutet?

  • IPv4 und IPv6 sind zwei inkompatible Protokolle. Ein abgesendetes IPv4-Paket kann nicht per IPv6 zugestellt werden, und umgekehrt gilt das ebenso. Es gibt also kein Routing zwischen diesen beiden Protokollen. Das IPv4-Routing ist völlig unabhängig vom IPv6-Routing.

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

kB schrieb:

  • DNS und Routing haben nichts miteinander zu tun.

ich weiß.

  • localhost ist üblicherweise 127.0.0.1! (Und meistens auch nur 127.0.0.1!)

  • Kannst Du selbst überprüfen:

    host localhost
# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1

gibt es hier eine Prio? Wenn ja, wo wird sie definiert?

Wird da IPv4 nach IPv6 geroutet?

  • IPv4 und IPv6 sind zwei inkompatible Protokolle. Ein abgesendetes IPv4-Paket kann nicht per IPv6 zugestellt werden, und umgekehrt gilt das ebenso. Es gibt also kein Routing zwischen diesen beiden Protokollen. Das IPv4-Routing ist völlig unabhängig vom IPv6-Routing.

es sei denn es ist explizit eingerichtet https://de.wikipedia.org/wiki/NAT64

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

so, ich bin einen Schritt weiter:

root@docker2:~# netstat -tulpn | grep 8086
tcp6       0      0 :::8086                 :::*                    LISTEN      20441/dockerd   
root@docker2:~# curl -4 http://localhost:8086
404 page not found
root@docker2:~# curl -6 http://localhost:8086
^C
root@docker2:~# curl -4 http://docker2:8086
404 page not found
root@docker2:~# curl -6 http://docker2:8086
curl: (6) Could not resolve host: docker2
root@docker2:~# host localhost
localhost has address 127.0.0.1
localhost has IPv6 address ::1
root@docker2:~# host docker2
docker2 has address 192.168.253.102
root@docker2:~# curl http://localhost:8086
^C
root@docker2:~# curl http://docker2:8086
404 page not found

curl nutzt hier also standardmäßig zur Namensauflösung IPv6. Falls es dafür keinen Eintrag gibt, nimmt er IPv4.

Warum zeigt dann netstat nur 'tcp6' auf diesem Port?

kB Ganz so einfach scheint es doch nicht zu sein wie du schreibst. Schau mal https://unix.stackexchange.com/questions/152612/netstat-why-are-ipv4-daemons-listening-to-ports-listed-only-in-a-inet6?answertab=votes#tab-top und https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses Mal abgesehen von der Technik (ist jetzt kein Routing), aber ein Mapping scheint es zu geben.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

BillMaier schrieb:

[…] # host localhost localhost has address 127.0.0.1 localhost has IPv6 address ::1

}}} gibt es hier eine Prio? Wenn ja, wo wird sie definiert?

Wird da IPv4 nach IPv6 geroutet?

  • IPv4 und IPv6 sind zwei inkompatible Protokolle. Ein abgesendetes IPv4-Paket kann nicht per IPv6 zugestellt werden, und umgekehrt gilt das ebenso. Es gibt also kein Routing zwischen diesen beiden Protokollen. Das IPv4-Routing ist völlig unabhängig vom IPv6-Routing.

es sei denn es ist explizit eingerichtet https://de.wikipedia.org/wiki/NAT64

  • Auch NAT64 ist kein Routing zwischen IPv6 und IPv4. Wie gesagt, aus technischen Gründen geht ein solchen Routing gar nicht. NAT64 ist NAT für IPv6, wobei die IPv6-Adressen algo­rith­misch aus IPv4-Adressen berechnet werden und ein Gateway (welches zwar 64-Router genannt wird, aber kein Router auf Layer-3 ist) die Layer-4-Nutzdaten aus dem IPv6-Paket auspackt und neu in IPv4 verpackt. Ein Router arbeitet auf Layer-3, NAT64 funktioniert auf Layer-4.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

BillMaier schrieb:

[…] kB Ganz so einfach scheint es doch nicht zu sein wie du schreibst. Schau mal https://unix.stackexchange.com/questions/152612/netstat-why-are-ipv4-daemons-listening-to-ports-listed-only-in-a-inet6?answertab=votes#tab-top und https://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses Mal abgesehen von der Technik (ist jetzt kein Routing), aber ein Mapping scheint es zu geben.

  • Ja, diese beiden Zitate beschreiben, dass man IPv4-Adressen im IPv6-Adress-Namensraum darstellen kann. Das ist nur eine Notation und hat nichts mit IPv4 ←→ IPv6 Kommunikation auf Layer-3 (Routing) zu tun, was nicht funktionieren kann.

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Allein schon das mit der Notation erzeugt

Haarausfall!

Ich will doch nicht sehen, dass mein Dienst auf tcp6 lauscht mit einer IPv4-notierten IPv6-Adresse 🙄

//edited: mit einer IPv6-notierten IPv4-Adresse

(confused)

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

BillMaier schrieb:

[…] (confused)

Willkommen im Club!

thomasschaefer

Anmeldungsdatum:
20. Dezember 2013

Beiträge: 54

Das ist ganz einfach:

1
:::Portnummer

ist unter linux in der Regel ein Dualstacksocket, es sei denn irgendwo beim Aufruf der Socketfunktion wird IPv6-only mitgegeben.

das "tcp6" bei einigen Netstat-Versionen, vor allem die bei Ubuntu und debian, ist schlichtweg falsch.

Zum einen ist es nur tcp und zum anderen verwirrt es mit der Angabe "6", wenn unter diesem Socket auch IPv4-Packete angenommen werden.

Das ganze hat nichts mit DNS oder gar NAT64 zu tun. DNS spielt nur dann eine Rolle wenn z.B. localhost in der

1
/etc/hosts

nur für eines der beiden Protokolle definiert ist. Beim direkten Aufruf von 127.0.0.1 bzw. ::1 wird es uninteressant.

Beispiel von Netstat (opensuse)

1
2
3
tcp        0      0 :::80                   :::*                    LISTEN      2779/httpd-prefork
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2814/sshd           
tcp        0      0 :::22                   :::*                    LISTEN      2814/sshd   

Der Apache bedient hier ipv4 und ipv6 mit einem Socket und sshd verwendet dafür zwei. Obendrauf ist tcp und nicht tcp4 oder tcp6.

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

kB schrieb:

  • localhost ist üblicherweise 127.0.0.1! (Und meistens auch nur 127.0.0.1!)

"meistens" stelle ich hiermit mal in Frage:

aus der /etc/hosts , Ubuntu 16.04:

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

//edited: selbst wenn ich es da entferne, wird es per

host localhost

immer noch aufgelöst. Scheint also noch andere Ecken zu geben...

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

thomasschaefer schrieb:

Das ist ganz einfach:

1
:::Portnummer

ist unter linux in der Regel ein Dualstacksocket, es sei denn irgendwo beim Aufruf der Socketfunktion wird IPv6-only mitgegeben.

das "tcp6" bei einigen Netstat-Versionen, vor allem die bei Ubuntu und debian, ist schlichtweg falsch.

Zum einen ist es nur tcp und zum anderen verwirrt es mit der Angabe "6", wenn unter diesem Socket auch IPv4-Packete angenommen werden.

Das ganze hat nichts mit DNS oder gar NAT64 zu tun. DNS spielt nur dann eine Rolle wenn z.B. localhost in der

1
/etc/hosts

nur für eines der beiden Protokolle definiert ist. Beim direkten Aufruf von 127.0.0.1 bzw. ::1 wird es uninteressant.

Beispiel von Netstat (opensuse)

1
2
3
tcp        0      0 :::80                   :::*                    LISTEN      2779/httpd-prefork
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      2814/sshd           
tcp        0      0 :::22                   :::*                    LISTEN      2814/sshd   

Der Apache bedient hier ipv4 und ipv6 mit einem Socket und sshd verwendet dafür zwei. Obendrauf ist tcp und nicht tcp4 oder tcp6.

So gehört das! 👍 Aber mich fragt ja keiner 😲

Dumm nur, wenn irgendwelche Applikationen im Hintergrund curl verwenden (solls geben...) und deshalb für IPv6 zwar eine Namensauflösung bekommen, aber kein Dienst antwortet. Jetzt kann man entweder versuchen curl umzubiegen oder dem Host die Namensauflösung für IPv6 weg nehmen (versuchen...) oder den IPv6-Weg sicher zu stellen. Letzteres wäre zwar ideal, aber das kann nicht der Anspruch von heute auf morgen sein...

Von daher werde ich mich mal daran versuchen: https://unix.stackexchange.com/questions/265597/how-to-avoid-curl-trying-ipv6-name-resolution

thomasschaefer

Anmeldungsdatum:
20. Dezember 2013

Beiträge: 54

Normalerweise testet man ja erst die Applikationen via IPv6 und setzt dann die AAAA-Records.

Bei Localhost mit gesetzten ::1 localhost in /etc/hosts muss man auch ein wenig den Zusammenstellern der Distribution trauen. Ordentlich (vor)konfiguriert gibt es praktisch keinen Dienst, der noch kein IPv6 unterstützt.

Im Moment leide ich noch unter xrdp, einige Paketmaintainer halten es schlichtweg nicht für nötig, dort Dualstack einzuschalten. (betrifft aber nicht localhost sondern vorallem das Problem von DS-lite)

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

Bei mir ist es Docker. "By default, the Docker daemon configures the container network for IPv4 only" https://docs.docker.com/engine/userguide/networking/default_network/ipv6/ Allerdings lässt es sich wohl einfach aktivieren. Mal schaun, ob das zuverlässig funktioniert.

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

thomasschaefer schrieb:

Das ist ganz einfach:

1
:::Portnummer

ist unter linux in der Regel ein Dualstacksocket, es sei denn irgendwo beim Aufruf der Socketfunktion wird IPv6-only mitgegeben.

das "tcp6" bei einigen Netstat-Versionen, vor allem die bei Ubuntu und debian, ist schlichtweg falsch.

Vielen Dank noch für diese Klarstellung! 👍

BillMaier Team-Icon

Supporter
(Themenstarter)

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6389

danke thomasschaefer und kB

Antworten |