netstat - dlaczego demony IPv4 nasłuchują portów wymienionych tylko w -A inet6?


22

Mam komputer z:

Linux superhost 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux

Działa Apache na porcie 80 na wszystkich interfejsach i nie pojawia się w nim netstat -planA inet, jednak nieoczekiwanie można go znaleźć w netstat -planA inet6:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp6       0      0 :::5672                 :::*                    LISTEN      2402/beam.smp   
tcp6       0      0 :::111                  :::*                    LISTEN      1825/rpcbind    
tcp6       0      0 :::9200                 :::*                    LISTEN      2235/java       
tcp6       0      0 :::80                   :::*                    LISTEN      2533/apache2    
tcp6       0      0 :::34611                :::*                    LISTEN      1856/rpc.statd  
tcp6       0      0 :::9300                 :::*                    LISTEN      2235/java       
...
tcp6       0      0 10.0.176.93:80          10.0.76.98:53704        TIME_WAIT   -               
tcp6       0      0 10.0.176.93:80          10.0.76.98:53700        TIME_WAIT   -               

Mogę do niego dotrzeć za pomocą TCP4, jak widać powyżej. Jednak nawet te połączenia są wymienione w sekcji tcp6. Czemu?


1
Wszystkie adresy IPv4 są mapowane bezpośrednio na adresy IPv6 (ale nie odwrotnie). Patrz: en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
— Patrick

4
proszę przestać używać netstat? umarł - dekadę temu . Użyj iproute2 'sss
— mikeserv

Odpowiedzi:


16

Domyślnie, jeśli nie podasz adresu w Listenparametrze Apache , obsługuje on adres IPv6 za pomocą IPv4-mapped IPv6adresów. Możesz zajrzeć do Apache ipv6

Wyjście netstatnie oznacza, że ​​Apache nie nasłuchuje na adresie IPv4. To jest IPv4-mapped IPv6adres.


Istnieją inne usługi, które słuchają adresów IPv4, ale są wymienione przez netstat jako tcp6, np. ElasticSearch
— Mischa Arefiev

Wydaje mi się, że czytasz link wikipedii dostarczony przez @Patrick. Wszystkie usługi, które używają adresu IPv6 odwzorowanego na IPv4, zostaną pokazane tcp6w wynikach netstat.
— początkujący

14

Powodem tego jest to, że wszystkie adresy IPv4 są również adresami IPv6. Odłożono niewielki zakres adresów IPv6 do wykorzystania w mapowaniu adresów IPv4 jeden na jednego. Na przykład adres IPv4 192.0.2.128jest dostępny za pośrednictwem adresu IPv6 ::ffff:192.0.2.128. Dokonano tego, aby wszystkie aplikacje obsługujące tylko IPv6 mogły nadal nasłuchiwać na adresach IPv4. Zauważ, że nie można tego użyć w przypadku adresu IPv6 (bez mapowania) do komunikowania się z adresem IPv4 bez innych rzeczy, ponieważ IPv4 nie będzie wiedział, jak obsługiwać adres IPv6 (możesz użyć NAT lub innych rozwiązań chociaż).

Ponieważ wszystkie adresy IPv4 są reprezentowane w IPv6, gdy poprosisz netstato listę aplikacji korzystających z IPv6, otrzymasz również IPv4.
Może reprezentować10.0.176.93 jako ::ffff:10.0.176.93, lub nawet ::ffff:a00:b05d, ale programiści zdecydowali się pokazać go jako zwykłego adresu IPv4 przerywana-notacji.


Dziękuję, ale to nie wyjaśnia, dlaczego nie wyskakują podczas regularnych -A inet
— ćwiczeń

Myślę, że powodem, dla którego połączenia nasłuchujące są wymienione tylko jako gniazda tcp6, jest to, że tak naprawdę są to gniazda IPv6, ale z dodatkową funkcją, że akceptują również połączenia IPv4, jeśli są skonfigurowane do tego. Gniazda są powiązane z INADDR_ANY6, a kiedy przychodzi połączenie IPv4, adres jest mapowany na adres IPv6 z prefiksem :: ffff: 0000/96. Jest to jedyne zastosowanie dla tych mapowanych adresów; nie należy ich używać na przewodzie.
— Johan Myréen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.