netstat - почему демоны IPv4 прослушивают порты, перечисленные только в -A inet6?

22

У меня есть компьютер с:

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

Он запускает Apache через порт 80 на всех интерфейсах и не отображается в нем netstat -planA inet, однако неожиданно его можно найти в 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   -               

Я могу достичь этого по TCP4 просто отлично, как видно выше. Однако даже эти соединения перечислены ниже tcp6. Зачем?

Миша арефьев
источник
1
Все адреса IPv4 отображаются напрямую на адреса IPv6 (но не наоборот). См .: en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses
Патрик,
4
пожалуйста, прекратите использовать netstat? он умер - десять лет назад . Используйте iproute2 'sss
mikeserv

Ответы:

16

По умолчанию, если вы не указываете адрес для Listenпараметра Apache , он обрабатывает адрес ipv6, используя IPv4-mapped IPv6адреса. Вы можете посмотреть в Apache ipv6

Вывод netstatне означает, что Apache не прослушивает IPv4-адрес. Это IPv4-mapped IPv6адрес.

beginer
источник
Существуют и другие службы, которые прослушивают адреса IPv4, но netstat перечисляет их как tcp6, например ElasticSearch
Mischa
Я предполагаю, что вы прочитали ссылку на Википедию, предоставленную @Patrick. Все те службы, которые используют IPv4-сопоставленный IPv6-адрес, будут показаны tcp6в выводе netstat.
начинающий
14

Причина этого заключается в том, что все адреса IPv4 также являются адресами IPv6. Небольшой диапазон адресов IPv6 был выделен для использования при однозначном сопоставлении адресов IPv4. Например, адрес IPv4 192.0.2.128доступен через адрес IPv6 ::ffff:192.0.2.128. Это было сделано для того, чтобы любые приложения, поддерживающие только IPv6, могли прислушиваться к адресам IPv4. Обратите внимание, что это не может использоваться для адреса IPv6 (не сопоставленного), чтобы общаться с адресом IPv4 без других вовлеченных вещей, поскольку IPv4 не будет знать, как обращаться с адресом IPv6 (вы можете использовать NAT или другие решения) хотя).

Поскольку все адреса IPv4 представлены в IPv6, при запросе netstatсписка приложений, использующих IPv6, вы также получите IPv4.
Он может быть представлен 10.0.176.93как ::ffff:10.0.176.93или даже ::ffff:a00:b05d, но разработчики приложения решили показать его как обычный адрес IPv4 с точечной нотацией.

Патрик
источник
Спасибо, но это не ответит, почему они не всплывают, когда занимаются регулярно-A inet
Миша Арефьев,
Я предполагаю, что причина прослушивающих подключений указана только как сокеты tcp6, потому что они действительно являются сокетами IPv6, но с дополнительной функцией, что они также принимают подключения IPv4, если настроены для этого. Сокеты привязаны к INADDR_ANY6, и при подключении к IPv4-адресу адрес сопоставляется с IPv6-адресом с префиксом :: ffff: 0000/96. Это единственное использование для этих сопоставленных адресов; они не должны использоваться на проводе.
Йохан Мирен