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


37

这是我得到的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:*:::*国外的地址?


3
您可以省略IPv6中的前导零,这样就只剩下冒号了。
路易(Louis)

其实我讲得太早了。我不知道为什么有三个冒号而不是两个冒号+1。我想最后一个指示端口。
2013年

Answers:


22

正如许多其他答案提到的那样,::表示全零,然后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地址上的端口80流量。

为什么要对正在收听的界面保持挑剔的态度?好吧,有时,我使用此功能的一种方法是让计算机监听回送接口。(请记住,当我说您有多个网卡接口时……这是我这么说的一个原因。我猜您有一个真正的物理网络连接,并且您也有一个环回接口。这是最典型的设置如今,大多数类型的计算机都可以使用。)我使用SSH隧道进行操作。然后,我可以做一些事情,例如使本地VNC查看器连接到SSH隧道的本地端。通过让SSH隧道在回送接口上侦听,我无需担心SSH隧道可以侦听来自物理网络接口之一的流量。所以,

在某些情况下,按照RFC 4291第2.5.2节的规定,0.0.0.0或::基本上是指“未指定”地址。上面写着“这表明没有地址”。我有时在软件尝试引用“无效”地址(例如,如果计算机未分配地址)时看到这种情况,该地址没有要显示的特定地址。但是,在这种情况下,:::或0.0.0.0指的是“未知”地址。这就是为什么所有LISTENING端口都显示为“未知”的原因。对于已建立的连接,您知道远程端是谁,因为您正在与它们进行通信。对于“ LISTENING”连接,您正在收听全新的对话。该流量可能来自世界各地。传入流量可以来自任何地址。而且,nestat显示的方式是指定全零的地址。由于没有要使用的特定地址,

最后,我要指出,让软件在所有网络接口上进行侦听是很常见的事情。可以将某些软件配置为仅侦听特定的Internet地址或特定的网卡。这可能会更加安全,因为那样一来,该软件就不会在没有有效流量的地方进行监听。这可能会限制攻击能力。但是,许多软件没有这样的选择,或者这样的选择有些被掩埋/隐藏。因此,在所有网卡上进行监听并不是一件非常糟糕的事情。这很普遍。而且,如果您想防止软件在特定网络端口上接收流量,则还有其他方法可以做到这一点,包括使用防火墙阻止不需要的流量。如果这样做,防火墙可能会阻止流量,但是(网络)服务器可能仍会监听该网络接口上的流量。在这种情况下,服务器将永远不会在该接口上获得流量,但是netstat仍会报告该服务器正在侦听(因为该流量永远不会到达该服务器)。看到netstat报告服务器软件正在所有接口上进行监听是很常见的,因此不必特别警惕。

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


8

就像其他人所说的,这是这种情况下的自然IPv6表示法。

让我们引用并解释相关标准:

::: * == 0000.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

netstat1.60上,输出上的协议读取tcp6udp6针对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的本地主机,例如IPv4的127.0.0.1。

::: *是0:0:1:*(IPv6 0:0:0,端口*)的简写,就像IPv4 0.0.0.0:*。外部地址列中的这两个都表示没有外部地址列。在使用监听套接字的情况下,很明显没有(尚未)连接的外部地址。对于udp套接字,通常没有连接的外部地址,因此这些地址也以0.0.0.0:*列出。


致下降投票者:您能发表评论吗?
Werner Henze


0

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

linux版本的netstat使用:表示,其中IP地址显示为*。

因此::: 111表示IP地址为::和端口111。

::是压缩格式的IPv6地址,使用以下规则:可以将::替换为零。完全写出来就等于0000: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 :0000:1234和端口5678。相比之下,netstat的Windows版本将IPv6地址括在方括号中,以避免产生歧义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.