30

Это вывод netstat -tulpn, который я получаю:

tcp        0      0 127.0.0.1:2208              0.0.0.0:*                   LISTEN      2055/hpiod
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      2077/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2138/sendmail: acce
tcp        0      0 127.0.0.1:2207              0.0.0.0:*                   LISTEN      2060/python
tcp        0      0 0.0.0.0:735                 0.0.0.0:*                   LISTEN      1825/rpc.statd
tcp        0      0 :::111                      :::*                        LISTEN      1781/rpcbind
tcp        0      0 :::80                       :::*                        LISTEN      2624/httpd
tcp        0      0 :::22                       :::*                        LISTEN      2096/sshd
udp        0      0 0.0.0.0:32768               0.0.0.0:*                               2398/avahi-daemon:
udp        0      0 0.0.0.0:68                  0.0.0.0:*                               1581/dhclient
udp        0      0 0.0.0.0:729                 0.0.0.0:*                               1825/rpc.statd
udp        0      0 0.0.0.0:732                 0.0.0.0:*                               1825/rpc.statd
udp        0      0 0.0.0.0:5353                0.0.0.0:*                               2398/avahi-daemon:
udp        0      0 0.0.0.0:631                 0.0.0.0:*                               2077/cupsd
udp        0      0 :::32769                    :::*                                    2398/avahi-daemon:
udp        0      0 :::684                      :::*                                    1781/rpcbind
udp        0      0 :::5353                     :::*                                    2398/avahi-daemon:
udp        0      0 :::111                      :::*                                    1781/rpcbind

Мне любопытно узнать: что означает ::: в Local Address? А что такое 0.0.0.0:* и :::* в иностранном адресе ?

6 ответов6

21

Как упоминалось во многих других ответах, :: представляет все нули, и затем netstat может показывать двоеточие после адреса, так что вы получите три двоеточия.

То, что я не видел ни в одном из этих ответов, является ответом на вопрос о том, что это действительно означает (в данном случае).

В случае netstat :: (в IPv6) или 0.0.0.0 (в IPv4) в основном означает "любой".
Итак, программа прослушивает TCP-порт 80 (HTTP-порт) по любому из адресов.

Если у вас есть несколько интерфейсов сетевых карт (что вы и делаете, как я сейчас объясню), вы можете прослушивать только определенный адрес. Например, с некоторым программным обеспечением вы могли бы сделать что-то вроде заставить ваш HTTP-сервер прослушивать сетевую карту, которая использует проводной Ethernet, но не отвечать на сетевую карту, которая использует беспроводную сеть. Если вы это сделаете, то ваш компьютер может сделать что-то вроде прослушивания IPv4 192.0.2.100:80 (или IPv6 2001:db8:abcd::1234:80).

Но, поскольку вы слушаете «:::80», ваш компьютер не прослушивает трафик порта 80 только на одном входящем IP-адресе, вы прослушиваете трафик порта 80 на любом IPv6-адресе.

Почему вы хотите быть разборчивыми в том, какой интерфейс вы слушаете? Ну, иногда я использовал эту возможность, чтобы компьютер слушал интерфейс обратной связи. (Помните, когда я говорил, что у вас несколько интерфейсов сетевых карт ... это одна из причин, по которой я это сказал. Я предполагаю, что у вас есть реальное физическое сетевое соединение, и что у вас также есть петлевой интерфейс. Это наиболее типичная установка для большинства типов компьютеров в наши дни.) Я делаю это с SSH туннелированием. Затем я могу сделать что-то вроде подключения локального средства просмотра VNC к локальному концу туннеля SSH. Благодаря тому, что SSH-туннель прослушивает интерфейс обратной связи, мне не нужно беспокоиться о том, что SSH-туннель может прослушивать трафик, поступающий от одного из физических сетевых интерфейсов. Таким образом, SSH-туннель будет видеть только сетевой трафик, исходящий от моего компьютера.

В некоторых случаях 0.0.0.0 или :: в основном означает "неуказанный" адрес, как указано в разделе 2.5.2 RFC 4291, в котором говорится "Это указывает на отсутствие адреса". Я иногда видел это, когда программное обеспечение пытается сослаться на "недопустимый" адрес (например, если компьютеру не назначен адрес, возможно), где нет конкретного адреса для отображения. Однако в этом случае :: или 0.0.0.0 ссылаются на "неизвестный" адрес. Вот почему все LISTENING порты отображаются как "неизвестные". Для установленного соединения вы знаете, кто является удаленным концом, потому что вы общаетесь с ними. Для соединения "LISTENING" вы слушаете совершенно новые разговоры. Этот трафик может исходить из любой точки мира. Входящий трафик может прийти с любого адреса. И способ отображения Nestat, который заключается в указании адреса всех нулей. Поскольку нет конкретного адреса для использования, "неопределенный" адрес кажется вполне уместным.

Я просто подведу итог, отметив, что прослушивание программного обеспечения на всех сетевых интерфейсах - очень распространенная вещь. Некоторое программное обеспечение может быть настроено на прослушивание только определенного интернет-адреса или, возможно, конкретной сетевой карты. И это может быть немного более безопасно, потому что тогда программное обеспечение не прослушивает, где не ожидается действительный трафик. Это может ограничить способность атаковать. Тем не менее, многие программы не имеют такой опции, или такая опция несколько скрыта / скрыта. Таким образом, прослушивание на всех сетевых картах - не супер страшная вещь. Это довольно часто. И, если вы хотите запретить программам получать трафик через определенный сетевой порт, есть другие способы сделать это, включая блокировку нежелательного трафика с помощью брандмауэра. Если вы сделаете это, брандмауэр может заблокировать трафик, но (веб-сервер) все еще может прослушивать трафик на этом сетевом интерфейсе. В этом случае сервер никогда не получит трафик через этот интерфейс, но netstat все равно сообщит, что сервер прослушивает (для того трафика, который никогда не достигнет этого сервера). Просмотр отчета netstat о том, что серверное программное обеспечение прослушивает все интерфейсы, является очень распространенным явлением, и поэтому не о чем беспокоиться.

Наконец, я упомяну, что этот вопрос и этот ответ не относятся к Linux. (Я упоминаю об этом, потому что я вижу тег "Linux" в этом вопросе.) Показанные параметры командной строки и пример выходных данных могут быть получены из Linux, и разные операционные системы могут отображать вещи немного по-разному. Однако, что касается темы :: и 0.0.0.0, то, как netstat работает в этом отношении, идентично на машине с BSD или Microsoft Windows (и, вероятно, во многих других системах).

7

Как говорили другие, это естественная нотация IPv6 для этого контекста.

Давайте процитируем и интерпретируем соответствующие стандарты:

:::* == 0000.0000.0000.0000.0000.0000.0000.0000:*

http://tools.ietf.org/html/rfc5952#section-4 говорит, что канонические (не просто возможные сокращения) адреса IPv6:

  • написано в шестнадцатеричном виде с символами a-f нижнем регистре.
  • сгруппированы каждые 2 байта по :
  • ведущие 0 должны быть удалены. 0000 становится 0 .
  • самая длинная последовательность :0:0:0: ДОЛЖНА быть преобразована в :: . Может быть сделано только один раз, или приведет к двусмысленности.

Так что :::* означает:

  • 0000:0000:0000:0000:0000:0000:0000 на любом порту (:*)
  • == 0:0:0:0:0:0:0 (конечный 0 удаления)
  • == :: (последовательное сокращение нуля)

0000.0000.0000.0000.0000.0000.0000.0000:* == не указан адрес

http://tools.ietf.org/html/rfc4291#section-2.5.2 определяет "неопределенный адрес":

Адрес 0:0:0:0:0:0:0:0 называется неопределенным адресом. Он никогда не должен быть назначен ни одному узлу. Это указывает на отсутствие адреса. Одним из примеров его использования является поле «Адрес источника» любых пакетов IPv6, отправленных инициализирующим хостом до того, как он узнал свой собственный адрес.

Неуказанный адрес не должен использоваться в качестве адреса назначения пакетов IPv6 или заголовков маршрутизации IPv6. Пакет IPv6 с неопределенным адресом источника никогда не должен пересылаться маршрутизатором IPv6.

что делает его хорошим выбором для столбца N/A, как в этом случае.

Так что :: не является localhost , что в том же документе говорится, что на ::1 .

В netstat 1.60 протоколы на выходе читают tcp6 и udp6 для IPv6, которые лучше показывают, что происходит, например:

tcp6       0      0 :::22                   :::*                    LISTEN      1201/sshd
udp6       0      0 :::5353                 :::*                                1449/avahi-daemon:

Смотрите также:

3

Это относится к адресу IPv6. В IPv6 мы можем сжать последовательность 0 , используя модификатор ::

Например,

0:0:0:0:0:0:0:1

можно записать как

::1

Но есть определенные правила, которые необходимо соблюдать в этом отношении, которые вы можете найти в любом учебнике по Ipv6.

2

::1 является локальным узлом для IPv6, как 127.0.0.1 для IPv4.

:::* - это короткая версия 0:0:1:* (IPv6 0:0:0, порт *), это похоже на IPv4 0.0.0.0:*. Оба из них в столбце внешнего адреса означают, что столбец внешнего адреса отсутствует. В случае прослушивающих сокетов ясно, что нет (пока) подключенного внешнего адреса. В случае сокетов udp у вас обычно нет подключенных внешних адресов, поэтому они также перечислены с 0.0.0.0:*.

0

:::* Был бы ваш localhost/loop назад в IPv6 :)

В основном, у вас есть сервисы, прослушивающие и подключающиеся к сервисам локально.

0

Мне любопытно узнать: что означает ::: в Local Address?

Версия netstat для Linux использует обозначение: где IP-адрес отображается голым *.

Итак, ::: 111 означает IP of :: и порт 111.

:: является сжатым IPv6-адресом с использованием правила, согласно которому ряд нулей можно заменить на ::. Выписан полностью и эквивалентен 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0000.

Как и в случае IPv4, в качестве значения заполнителя используется адрес из всех нулей (известный как неопределенный адрес). В случае локального адреса это означает, что сокет прослушивает все интерфейсы IPv6 (и, возможно, также все интерфейсы IPv4 в зависимости от параметров сокета, которые netstat не показывает).

А что такое 0.0.0.0:* и :::* в иностранном адресе?

Это означает, что сокет не привязан к определенному внешнему адресу. :: или 0.0.0.0 указывает неуказанный IP-адрес (для IPv4 или IPv6 соответственно), а * указывает неуказанный порт.

Для TCP это относится только к сокетам, прослушивающим входящие соединения. Когда "accept" вызывается для принятия соединения, создается отдельный сокет с определенным удаленным IP-адресом и портом.

Для UDP нет концепции приема соединений. Приложение, привязанное к сокету UDP с внешним адресом :::*, использует вызов API "recvfrom" для получения пакетов и определения их происхождения и вызов API "sendto" для отправки пакетов на определенный адрес.

* Эта запись неудачна, потому что она означает, что отображаемая строка означает разные вещи в netstat в другом месте. В большинстве случаев 3FFE::1234:5678 будет означать IP-адрес 3FFE:0000:0000:0000:0000:0000:1234:5678, но в выводе netstat linux это означает IP-адрес 3FFE:0000:0000:0000:0000:0000:0000:1234 и порт 5678. Windows-версия netstat, напротив, заключает адреса IPv6 в квадратные скобки, чтобы избежать двусмысленности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .