这是我得到的 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
。
在netstat
1.60 上,输出读取的协议tcp6
和udp6
IPv6 协议可以更好地显示正在发生的事情,例如:
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 地址括在方括号中以避免产生歧义。