在对Linux服务器进行运维管理时,我们常用的命令之一就是netstat。我经常使用这个命令来检查哪些进程正在监听当前服务器上的端口。主要用于诊断网络服务的工作状态。不过,最近安装了一个Ubuntu风格的版本,发现默认没有安装netstat。我觉得很奇怪。手动安装后,我发现手册页表明netstat命令已被弃用。建议改用ss命令。该程序大部分已过时。netstat的替代品是ss。netstat-r的替代是iproute。netstat-i的替换是ip-s链接。netstat-g的替换是ipmaddr.netstatmanpagesnetstat参数的用法有很多,我一般都是组合使用,以至于记不住为什么这些参数是:netstat-npl得到的结果是这样的:ActiveInternetconnections(onlyservers)ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programnametcp00127.0.0.53:530.0.0.0:*LISTEN655/systemd-resolvetcp000.0.0.0:220.0.0.0:*LISTEN890/sshdtcp00127.0.0.1:6310.0.0.0:*LISTEN30790/cupsdtcp000.0.0.0:18025060.00.0/LISTEN80shcp:::22:::*LISTEN890/sshdtcp600::1:631:::*LISTEN30790/cupsdtcp600:::9090:::*LISTEN15415/./prometheustcp600:::18025:::*LISTEN890/sshdudp00127.0.0。53:530.0.0.0:*655/systemd-resolveudp000.0.0.0:6310.0.0.0:*30792/cups-browsedudp000.0.0.0:53530.0.0.0:*757/avahi-daemon:rudp000.0.0.0:420.0.0.0:*757/avahi-daemon:rudp600:::58232:::*757/avahi-daemon:rudp600:::5353:::*757/avahi-daemon:rActiveUNIXdomains套接字(仅服务器)ProtoRefCntFlagsTypeStateI-NodePID/ProgramnamePathunix2[ACC]STREAMLISTENING351161304/gnome-session-@/tmp/.ICE-unix/1304unix2[ACC]SEQPACKETLISTENING14481/init/run/udev/controlunix2user[ACC]270STREAMLI20privateunix/systemd/1004[ACC]STREAMLISTENING342821270/systemd/run/user/1000/gnupg/S.gpg-agent.sshunix2[ACC]STREAMLISTENING335101270/systemd/run/user/1000/gnupg/S.gpg-agentunix2[ACC]STREAMLISTENING335111270/systemd/run/user/1000/pulse/nativeunix2[ACC]STREAMLISTENING335121270/systemd/run/user/1000/gnupg/S.gpg-agent.extra是最常用的命令组合,结果显示有两段,第一段显示TCP/UDP协议监听状态,第二段显示socks文件监听状态。参数n表示以数字格式显示IP地址,否则显示主机名或域名,参数p表示显示进程名(有时不能显示),l的意思是注意LISTENING状态下的套接字。通过上面的命令,我们可以看到系统中所有打开的套接字。无论是启动网络服务还是开发网络服务开放端口,都应该可以通过这个命令看到自己已经开放的端口。如果不是,应该是端口没有正确打开,需要排查原因。所以这是一个很好用的调试命令。ss的使用上面介绍了netstat最基本的使用方法。当然还有很多其他的用法,我们先略过。如果我们想使用ss命令而不是netstat,如何达到类似的效果呢?ss-atlp是我自己摸索出来的参数组合。我目前背诵得不是很流利。每次都要看文档:StateRecv-QSend-QLocalAddress:PortPeerAddress:PortLISTEN0128127.0.0.53%lo:domain0.0.0。0:*用户:(("systemd-resolve",pid=655,fd=13))LISTEN01280.0.0.0:ssh0.0.0.0:*用户:(("sshd",pid=890,fd=5))LISTEN05127.0.0.1:ipp0.0.0.0:*用户:(("cupsd",pid=30790,fd=7))LISTEN01280.0.0.0:180250.0.0.0:*用户:(("sshd",pid=890,fd=3))LISTEN0128[::]:ssh[::]:*用户:(("sshd",pid=890,fd=6))LISTEN05[::1]:ipp[::]:*用户:(("cupsd",pid=30790,fd=6))LISTEN0128*:9090*:*用户:(("prometheus",pid=15415,fd=3))LISTEN0128[::]:18025[::]:*users:(("sshd",pid=890,fd=4))这是ss命令显示的结果,可以看到,格式和netstat有很大区别,不像netstat命令紧凑而直观。这也是很多人批评这个命令的原因之一。当然,批评这种批评的声音认为,人们只是固守着一种习惯,不愿意往前走。当然,这么说也没错。以查尔斯个人为例。就算我是2010年开始工作,只学了netstat命令,到现在已经用了将近十年了,从来没有变过。当然,它非常赏心悦目。.当然,还有一个老外提出的理由,说ss命令的名字不好听。事实上,ss可能意味着套接字统计信息。缩写后面只有两个字母,不容易联想,不像netstat那么直观。当然,这是我的解释,不是老外抱怨的理由。他们抱怨的是,每次提到ss,他们就会想到希特勒!难以置信吗?我出生于1980年代。我这个年纪的人对此没有印象。关键是我们主要用中文。估计大部分人看到ss都会想到梯子,而绝不会想到希特勒。这个纳粹大佬有一支武装,前身是党卫军特种机动部队,后来更名为武装党卫军。它的德文缩写是SS。闲话少说,说几个参数,a参数是显示所有含义,t参数是显示TCP协议,l代表LISTENING状态,p代表进程信息。从上表我们可以看出,p参数打印出来的信息并没有netstat细化的那么有条理。但是更完整,显示了进程名和PID、FD。但是因为使用了双括号,key/value格式,加上引号,所以看起来比较乱。当然,我们可以使用一些命令对其进行格式化,但还是比较麻烦。更换的原因是什么?这可能是我最好奇的事情。不过在网上查了很多资料,大多都是含糊不清的。也让我有些无奈。一般来说,我们可以看到net-tools包会被iproute包取代。原因大概有,1,这个包太旧了,2,这个包不支持很多新的内核特性(但没说是哪些特性),界面没有优化到可以使用(对命令行不友好),3,net-tools里面的ifconfig确实有很多缺点。4、以后不想再维护net-tools了。LukClaes和我,作为net-tools目前的维护者,我们一直在思考它的未来。多年来,Net-tools一直是Debian和任何其他基于linux的发行版的核心部分,但它已经过时了。它不支持linux内核的许多现代功能,界面远非最佳且难以在自动化,而且,它在过去几年里并没有得到太多的爱。另一方面,围绕2.2内核系列引入的iproute套件具有更好和一致的界面,更强大,并且几乎是十个岁,所以没有人会说它是未经测试的。因此,我们的计划是用iproute完全取代net-tools,也许会引领其他发行版的脚步。当然,大多数人和工具都使用并记住古老的接口,所以第一步是编写包装器,试图与net-tools兼容。同时,我们相信e大多数使用net-tools的包应该被修补以使用iproute,而其他人可以继续使用包装器一段时间。ifupdown包显然是第一个候选,不过好像从2007年开始就有一个使用iproute的版本在实验中了。同样从原理层面分析:目前的netstat和ifconfig命令都是通过读写虚拟文件来完成任务的/proc目录。这个东西在小型的商业系统中是没有问题的,但是在大型的系统中相比之下,ss和ip这两个命令使用了Linux内核的netlinksockets特性。根本不同。虽然,旧的命令也可以用新的原理改写,但实际上并没有人这么做,主要是因为不同程序员群体的一些政治问题,大家意见不一……当然还有更深层次的,我们用这样的调试commands,本质上还是想知道内核的状态。事实上,内核已经改变了网络模块的整个原理。另一方面,我也像以前一样需要命令来显示信息。显示层级的格式和真实原理有偏差。因此,从长远来看,替换这两个命令是必然的。结语对于我们这些搞技术的人来说,还是跟上时代的步伐比较好。虽然前面的命令很熟悉,好用,容易掌握,甚至不可能忘记,但我们仍然需要不断学习新的命令。许多发型版本默认没有net-tools包。虽然还是可以手动安装,但是这背后的态度已经很明确了。另一方面,我们在做技术的时候,也要警惕大脑的僵化,保持对新事物的好奇心和热情。
