Linux运维之如何使用ss命令代替netstat

前言

在运维和管理 Linux 服务器的时候,我们最常用的一个命令就是 netstat,我常用这个命令来查看当前服务器上有哪些进程正在侦听端口,主要用来诊断网络服务的工作状态。

不过,最近有一次安装好一个 Ubuntu 发型版,发现默认没有安装 netstat,觉得非常奇怪,自己手动安装后,发现 man pages 提示,netstat 命令已经是 deprecated 了,建议使用 ss 命令代替。

This program is mostly obsolete. Replacement for netstat is ss. Replacement for netstat -r is ip route. Replacement for netstat -i is ip -s link. Replacement for netstat -g is ip maddr.

netstat man pages

netstat 的用法

netstat 有许多许多参数,我一般就用一种组合,以至于后来已经想不起来为什么是这几个参数了:

netstat -npl

得到的结果是这样的:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Address     State    PID/Program name
tcp    0   0 127.0.0.53:53      0.0.0.0:*        LISTEN   655/systemd-resolve
tcp    0   0 0.0.0.0:22       0.0.0.0:*        LISTEN   890/sshd
tcp    0   0 127.0.0.1:631      0.0.0.0:*        LISTEN   30790/cupsd
tcp    0   0 0.0.0.0:18025      0.0.0.0:*        LISTEN   890/sshd
tcp6    0   0 :::22          :::*          LISTEN   890/sshd
tcp6    0   0 ::1:631         :::*          LISTEN   30790/cupsd
tcp6    0   0 :::9090         :::*          LISTEN   15415/./prometheus
tcp6    0   0 :::18025        :::*          LISTEN   890/sshd
udp    0   0 127.0.0.53:53      0.0.0.0:*              655/systemd-resolve
udp    0   0 0.0.0.0:631       0.0.0.0:*              30792/cups-browsed
udp    0   0 0.0.0.0:5353      0.0.0.0:*              757/avahi-daemon: r
udp    0   0 0.0.0.0:42360      0.0.0.0:*              757/avahi-daemon: r
udp6    0   0 :::58232        :::*                757/avahi-daemon: r
udp6    0   0 :::5353         :::*                757/avahi-daemon: r
Active UNIX domain sockets (only servers)
Proto RefCnt Flags    Type    State     I-Node  PID/Program name   Path
unix 2   [ ACC ]   STREAM   LISTENING   35116  1304/gnome-session- @/tmp/.ICE-unix/1304
unix 2   [ ACC ]   SEQPACKET LISTENING   1448   1/init        /run/udev/control
unix 2   [ ACC ]   STREAM   LISTENING   34277  1270/systemd     /run/user/1000/systemd/private
unix 2   [ ACC ]   STREAM   LISTENING   34282  1270/systemd     /run/user/1000/gnupg/S.gpg-agent.ssh
unix 2   [ ACC ]   STREAM   LISTENING   33510  1270/systemd     /run/user/1000/gnupg/S.gpg-agent
unix 2   [ ACC ]   STREAM   LISTENING   33511  1270/systemd     /run/user/1000/pulse/native
unix 2   [ ACC ]   STREAM   LISTENING   33512  1270/systemd     /run/user/1000/gnupg/S.gpg-agent.extra

最常用的就是这个命令组合,展示的结果有两个段落,第一个段落展示的是 TCP/UDP 协议的侦听情况,第二个段落展示的是 socks 文件的侦听情况。参数 n 的意思是展示数字格式的 IP 地址,不然会展示主机名称或者是域名,参数 p 的意思显示进程的名字(有时候显示不出来),l 的意思,是关注处于 LISTENING 状态的 socket。

通过如上命令,我们看到了系统所有打开的 socket,如果你启动一种网络服务也好,自己开发一个网络服务打开端口也好,通过这个命令都应该能看到自己打开的端口,如果看不到,应该就是没有能够正确打开端口,要好好查询是什么原因。所以这是一个很好用的调试命令。

ss 的用法

上面介绍了 netstat 的最最基本的一种用法,其他用法当然还有很多,但是先略过不表,如果想使用 ss 命令来代替 netstat 的话,我们怎样达到类似的效果呢?

ss -atlp

这是我自己摸索的一个参数组合,目前我背诵得还不是很流利,每次还需要看一下文档:

State     Recv-Q      Send-Q           Local Address:Port            Peer Address:Port
LISTEN     0        128             127.0.0.53%lo:domain             0.0.0.0:*       users:(("systemd-resolve",pid=655,fd=13))
LISTEN     0        128                0.0.0.0:ssh               0.0.0.0:*       users:(("sshd",pid=890,fd=5))
LISTEN     0        5                127.0.0.1:ipp               0.0.0.0:*       users:(("cupsd",pid=30790,fd=7))
LISTEN     0        128                0.0.0.0:18025              0.0.0.0:*       users:(("sshd",pid=890,fd=3))
LISTEN     0        128                 [::]:ssh                [::]:*       users:(("sshd",pid=890,fd=6))
LISTEN     0        5                  [::1]:ipp                [::]:*       users:(("cupsd",pid=30790,fd=6))
LISTEN     0        128                   *:9090                 *:*       users:(("prometheus",pid=15415,fd=3))
LISTEN     0        128                 [::]:18025               [::]:*       users:(("sshd",pid=890,fd=4))

这是 ss 命令呈现出来的结果,可以看到,格式和 netstat 很不一样,不像 netstat 命令那么紧凑和直观。这是很多人诟病这个命令的原因之一。当然,批判这种批判的声音认为,人们只是死守了一种习惯,不愿前行。当然了,这么说也未尝不对,就拿 Charles 个人来说,就算我 2010 年参加工作,才学会 netstat 命令,那我到现在也使用了将近十年,从来没有变过,当然看得无比顺眼啦。

当然,也有一种理由是老外提出来的,说 ss 这个命令的名字不好,其实 ss 可能是 socket statistics 的意思,缩写以后,竟然只有两个字母,不太好联想,不像 netstat 那么直观。当然这是我的解释,不是老外抱怨的理由,他们抱怨的是,每每提及 ss,他们会联想起希特勒!是不是匪夷所思,我是 80 后,我这个年代的人,对这个都没有什么印象,关键我们用中文为主,估计大家看到 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 了。

Luk Claes and me, as the current maintainers of net-tools, we've been thinking about it's future. Net-tools has been a core part of Debian and any other linux based distro for many years, but it's showing its age.

It doesnt support many of the modern features of the linux kernel, the interface is far from optimal and difficult to use in automatisation, and also, it hasn't got much love in the last years.

On the other side, the iproute suite, introduced around the 2.2 kernel line, has both a much better and consistent interface, is more powerful, and is almost ten years old, so nobody would say it's untested.

Hence, our plans are to replace net-tools completely with iproute, maybe leading the route for other distributions to follow. Of course, most people and tools use and remember the venerable old interface, so the first step would be to write wrappers, trying to be compatible with net-tools.

At the same time, we believe that most packages using net-tools should be patched to use iproute instead, while others can continue using the wrappers for some time. The ifupdown package is obviously the first candidate, but it seems that a version using iproute has been available in experimental since 2007.

https://serverfault.com/questions/633087/where-is-the-statement-of-deprecation-of-ifconfig-on-linux

也有从 原理层面 分析的:现在的 netstat 和 ifconfig 命令,都是通过读写 /proc 目录下的虚拟文件来完成任务的,这个东西在小型业务系统上,是没问题的,但是在大规模系统里,可能会伤害系统的性能之类的。相比之下,ss 和 ip 两个命令,使用的是 Linux 内核的 netlink sockets 特性。有着根本上的不同。虽然,老命令也可以用新原理重写,但是其实并没有人那么做,主要因为不同程序员团体的一些 political issues ,大家意见不合……

当然,深层次的还有,我们使用这样的调试命令,本质上还是希望获知内核的状态的,其实,内核已经改变了 networking 模块的整个原理,另一方面我还要求命令像从前那样去展示信息,展示层面的格式和真实原理已经背离,所以,从长远看,替代这两个命令才是必然。

结论

咱们这些做技术的,也还是要与时俱进比较好,虽然,以前的那些命令熟悉,好用,手到擒来,甚至无法忘记,但是新的还是要保持学习。很多发型版已经默认不带有 net-tools 包了,虽然仍然可以手动安装回来,但是,这背后的态度已经很明确了。另一方面,我们做技术,也要谨防自己的大脑僵化,还是要保持对新事物的好奇心和热情。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 详谈Linux netstat命令(高级面试必备)

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等. 输出信息含义 执行netstat后,其输出结果为 Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 2 210.34.6

  • Linux netstat命令详细解析

    简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等. 输出信息含义执行netstat后,其输出结果为 复制代码 代码如下: Active Internet connections (w/o servers)Proto Recv-Q Send-Q Local Address Foreign Address Statetcp 0 2 2

  • Linux下用netstat查看网络状态、端口状态

    在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际的网络连接以及每一个网络接口设备的 netstat命令的功能是显示网络连接.路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作. 该命令的一般格式为: netstat [选项] 命令中各选项的含义如下: -a 显示所有socket,包括正在监听的. -c 每隔1秒就重新显示一遍,直到用户中断它. -i 显示所有网络接口的信息,格式同"i

  • linux ss命令详解

    ss 是 Socket Statistics 的缩写.ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似.但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netstat 更快.当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢.ss 命令利用到了 TCP 协议栈中 tcp_diag.tcp_diag 是一个用于分析统计的模块,可以获得 L

  • Linux下netstat命令的一些常见用法

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等. 输出信息含义 执行netstat后,其输出结果为 Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 2 210.34.6

  • Linux netstat命令大全详解

    简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等. 输出信息含义 执行netstat后,其输出结果为 Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 2 210.34.6

  • Linux netstat命令查看并发连接数的方法

    介绍 并发连接数是指防火墙或代理服务器对其业务信息流的处理能力,是防火墙能够同时处理的点对点连接的最大数目,它反映出防火墙设备对多个连接的访问控制能力和连接状态跟踪能力,这个参数的大小直接影响到防火墙所能支持的最大信息点数. 实现方法 使用以下命令即可分组查看各种连接状态哦: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 解释: 返回结果示例: LAST_ACK 5 (正在等待处理的请求数) SYN_RE

  • Linux运维之如何使用ss命令代替netstat

    前言 在运维和管理 Linux 服务器的时候,我们最常用的一个命令就是 netstat,我常用这个命令来查看当前服务器上有哪些进程正在侦听端口,主要用来诊断网络服务的工作状态. 不过,最近有一次安装好一个 Ubuntu 发型版,发现默认没有安装 netstat,觉得非常奇怪,自己手动安装后,发现 man pages 提示,netstat 命令已经是 deprecated 了,建议使用 ss 命令代替. This program is mostly obsolete. Replacement fo

  • Linux运维基础进程管理及环境组成分析

    1.进程基本概述 进程是已启动的可执行程序的运行中实例. /proc目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息. 每一个进程的PID是唯一的,就算进程退出了,其它进程也不会占用其PID 2.进程的组成部分 已分配内存的地址空间 安全属性,包括所有权凭据和特权 程序代码的一个或多个执行线程 进程状态 3.进程的环境 本地和全局变量 当前调度上下文 分配的系统资源,如文件描述符和网络端口 4.进程状态 标志 内核定义的状态名称和描述 R TASK_RUNNING:进程正在C

  • Linux运维基础系统磁盘管理教程

    1.磁盘分区: 2.fdisk分区 磁盘小于2t用fdisk分区,大于2t用gdisk分区 1.查看磁盘情况 [root@localhost ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT fd0 2:0 1 4K 0 disk sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─rhel-root 253:0 0 17.5G 0 lvm

  • Linux运维基础进程管理实时监控控制

    目录 1.后台运行作业 2.使用信号控制进程 基本进程管理信号 3.监控进程活动 IO负载 4.实时进程监控 top用于实现全屏动态显示系统信息 1.后台运行作业 1.sleep 999 & (运行作业) [root@localhost ~]# sleep 999 & [1] 3670 2.ps -ef|grep sleep(查看进程) [root@localhost ~]# ps -ef|grep sleep root 3670 3642 0 10:54 pts/1 00:00:00 s

  • Linux运维基础交换分区和lvm管理教程

    目录 1.交换分区SWAP 1.1创建swapfile 1.2格式化swap分区 1.3检测当前swap分区情况 1.4开启新建的SWAP分区 1.5关闭新建的swap分区 1.6给新区增加一个交换分区swap 2. lvm管理 步骤lvm 1.准备物理磁盘(加磁盘参考上一博客) 3.卷组管理 扩展卷组,将新磁盘加入卷组 4.逻辑卷管理 逻辑卷扩展的容量不能超过卷组的容量 对ext4文件系统的逻辑卷裁剪容量 首先自己创建一个1G的逻辑卷作为裁剪的对象 1.如果已经挂载,必须先卸载 2.裁剪容量,

  • Linux运维基础httpd静态网页教程

    目录 1.利用仓库创建httpd lrzsz unzip文件 2.对源码文件进行解压 3.配置httpd-vhosts.conf的3种方法 方法1:(相同IP,不同端口号配置) 方法2:(不同IP,相同端口号配置) 方法3:(相同IP,相同端口号,不同域名) 1.利用仓库创建httpd lrzsz unzip文件 1.挂载 [root@clq0917 ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 写保护,将以只读方式挂载 写配置文件 [root@clq09

  • Linux运维从初级进阶为高级知识点总结

    运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑.掐网线.搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,很难体现个人价值,渐渐的对行业很迷茫,觉得没什么发展前途. 这些枯燥无味工作的确会使人匮乏,从技术层面讲这些其实都是基本功,对后期的运维工作会无形中带来一定的帮助,因为我也是这么过来的,能深刻体会到.所以在这个时期一定要保持积极向上的心态,持续的学习.在未来的某一天,相信会回报给你的! 好了,进入正题,根据我多年的运维工作经验,给大家分享下高级运维工程师学习路线.

  • Linux运维常用命令

    自己的小网站跑在阿里云的ECS上面,偶尔也去分析分析自己网站服务器日志,看看网站的访问量.看看有没有黑阔搞破坏!于是收集,整理一些服务器日志分析命令,大家可以试试! 1.查看有多少个IP访问:  awk '{print $1}' log_file|sort|uniq|wc -l PS: wc -l 看看有多少行 2.查看某一个页面被访问的次数: grep "/index.php" log_file | wc -l 3.查看每一个IP访问了多少个页面: awk '{++S[$1]} EN

  • 详解Linux运维CentOS系统SVN双备份Shell脚本

    前言 SVN是Subversion的简称,是一个开放源代码的版本控制系统,采用了分支管理系统.说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的. 作为一个代码管理工具,备份操作显得尤为重要,这里采取这样的备份策略:在执行本地备份的同时,让Shell脚本自动上传数据到另一台FTP备份服务器中,这种异地备份策略成本比较小,无需存储,而且安全系统高,想到与双备份,本地和异地同时出现数据损坏的概率是低很多的. 备份策略说明 使用CentOS 6系列系统,安装vsftpd,修改配置参数.

  • Linux运维工具Supervisor的安装使用(进程管理工具)

    一.介绍 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.目前Supervisor可以运行在大多数Unix系统上,但不支持在Windows系统上运行.Supervisor需要Python2.4及以上版本,但任何Python 3版本都不支持. 二.自带Web管理程序 Supervisor有四个组件: 1. supervisord 运行Supervisor的后台服务,它用来启动和管理那些你需要Sup

随机推荐