netstat 输出的本地地址中的 ::: 是什么?

netstat 输出的本地地址中的 ::: 是什么?

这是我得到的 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

我很好奇::::本地地址是什么意思?外国地址0.0.0.0:*又是什么意思?:::*

答案1

正如许多其他答案所提到的,::代表全零,然后 netstat 可能会在地址后显示冒号,因此您会得到三个冒号。

在这些答案中我都没有看到对“这到底意味着什么”(在这种情况下)这个问题的回答。

对于 netstat 来说,::(在 IPv6 中)或 0.0.0.0(在 IPv4 中)基本上表示“任何”。
因此,该软件正在监听任何地址上的 TCP 端口 80(HTTP 端口)。

如果您有多个网卡接口(您确实有,稍后我将解释),那么您可以只监听特定地址。例如,使用某些软件,您可以执行一些操作,例如让您的 HTTP 服务器监听使用有线以太网的网卡,但不响应使用无线网络的网卡。如果您这样做了,那么您的计算机可能会执行一些操作,例如监听 IPv4 192.0.2.100:80(或 IPv6 2001:db8:abcd::1234:80)。

但是,由于您正在监听“:::80”,因此您的计算机不会只监听一个传入 IP 地址上的端口 80 流量,而是监听任何IPv6 地址。

为什么你要挑剔你正在监听的接口?好吧,我有时使用此功能的一种方法是让计算机监听环回接口。(还记得我说过你有多个网卡接口吗……这就是我这么说的原因之一。我猜你有一个真正的物理网络连接,而且你还有一个环回接口。这是当今大多数类型计算机最典型的设置。)我使用 SSH 隧道来实现这一点。然后我可以做一些事情,比如让本地 VNC 查看器连接到 SSH 隧道的本地端。通过让 SSH 隧道监听环回接口,我不必担心 SSH 隧道可能会监听来自其中一个物理网络接口的流量。因此,SSH 隧道只会看到来自我的计算机的网络流量。

在某些情况下,0.0.0.0 或 :: 基本上表示“未指定”的地址,如RFC 4291 第 2.5.2 节它表示“它表示没有地址”。我有时会看到这种情况,当软件试图引用“无效”地址(例如,如果计算机没有分配地址),而没有特定的地址可显示时。但是,在这种情况下,:: 或 0.0.0.0 指的是“未知”地址。这就是为什么所有侦听端口都显示为“未知”的原因。对于已建立的连接,您知道远程端是谁,因为您正在与他们通信。对于“侦听”连接,您正在监听全新的对话。该流量可能来自世界上任何地方。传入流量可能来自任何地址。并且,nestat 显示该地址的方式是指定全零的地址。由于没有特定的地址可用,“未指定”地址似乎非常合适。

最后,我想说的是,让软件监听所有网络接口是很常见的事情。一些软件可以配置为只监听特定的互联网地址,或者可能是特定的网卡。这样可能会更安全一些,因为这样软件就不会监听没有有效流量的地方。这可能会限制攻击的能力。然而,很多软件没有这样的选项,或者这样的选项有点隐蔽。所以,监听所有网卡并不是一件非常可怕的事情。这很常见。而且,如果你想阻止软件在特定网络端口上接收流量,还有其他方法可以实现这一点,包括用防火墙阻止不需要的流量。如果你这样做,防火墙可能会阻止流量,但(网络)服务器可能仍会监听该网络接口上的流量。在这种情况下,服务器永远不会在该接口上获得流量,但 netstat 仍会报告服务器正在监听(对于永远不会到达该服务器的流量)。看到 netstat 报告服务器软件正在监听所有接口是很常见的,所以这并不是什么值得特别担心的事情。

最后,我要说的是,这个问题和这个答案并不是针对 Linux 的。(我之所以提到这一点,是因为我确实看到了这个问题上的“Linux”标签。)显示的命令行参数和显示的示例输出可能来自 Linux,不同的操作系统显示的内容可能略有不同。但是,关于 :: 和 0.0.0.0 的主题,netstat 在这方面的工作方式在运行 BSD 或 Microsoft Windows(以及可能还有许多其他系统)的机器上是相同的。

答案2

正如其他人所说,这是此上下文的自然 IPv6 符号。

我们来引用并解读一下相关标准:

:::== 0000.0000.0000.0000.0000.0000.0000.0000:**

https://www.rfc-editor.org/rfc/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:== 未指定地址*

https://www.rfc-editor.org/rfc/rfc4291#section-2.5.2定义“未指定的地址”:

地址 0:0:0:0:0:0:0:0 称为未指定地址。它绝不能分配给任何节点。它表示没有地址。它的一个使用示例是初始化主机在获知其自身地址之前发送的任何 IPv6 数据包的源地址字段。

未指定的地址不得用作 IPv6 数据包的目标地址或 IPv6 路由标头。源地址未指定的 IPv6 数据包绝不能由 IPv6 路由器转发。

这使得它成为本例中 N/A 列的一个不错的选择。

所以::不是 localhost,同一文件称其位于::1

netstat1.60 上,输出读取的协议tcp6udp6IPv6 协议可以更好地显示正在发生的事情,例如:

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

也可以看看:

答案3

::1 是 IPv6 的本地主机,例如 IPv4 的 127.0.0.1。

:::* 是 0:0:1:*(IPv6 0:0:0,端口 *)的缩写,类似于 IPv4 0.0.0.0:*。外部地址列中的这两个都表示没有外部地址列。对于侦听套接字,显然(尚未)有连接的外部地址。对于 udp 套接字,您通常没有连接的外部地址,因此这些地址也列为 0.0.0.0:*。

答案4

我很好奇:本地地址中的 ::: 是什么意思?

Linux 版本的 netstat 使用 <IP>:<port> 的表示法,其中 IP 地址以裸形式显示*。

因此 :::111 表示 IP 为 :: 且端口为 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 套接字的应用程序使用“recvfrom”API 调用来接收数据包并确定数据包来自何处,并使用“sendto”API 调用将数据包发送到特定地址。

* 这种表示法不太好,因为这意味着显示的字符串在 netstat 中和在其他地方的含义不同。在大多数情况下, 3FFE::1234:5678 表示 IP 地址 3FFE:0000:0000:0000:0000:0000:1234:5678 ,但在 linux netstat 输出中,它表示 IP 地址 3FFE:0000:0000:0000:0000:0000:0000:1234 和端口 5678 。相比之下,windows 版本的 netstat 将 IPv6 地址括在方括号中以避免产生歧义。

相关内容