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.