initxinetd启动的守护进程未必是系统中所运行的全部服务。init本地文件中(/etc/rc.d/rc.local)的命令、crontab表项、甚至是特权用户都可以启动守护进程。

ss命令会返回套接字统计信息,其中包括使用套接字的服务以及当前套接字状态。

12.3.1 预备知识

实用工具ss作为iproute2软件包的一部分已经安装在了如今大部分的发行版中。

12.3.2 实战演练

ss能够显示出比netstat更多的信息。下面将介绍该工具的一些特性。

1. 显示tcp套接字状态

每一次HTTP访问、每一个SSH会话都会打开一个tcp套接字连接。选项-t可以输出TCP连接的状态:

  1. $ ss -t
  2. State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
  3. ESTAB 0 0 127.0.0.1:56960 127.0.0.1:mysql
  4. ESTAB 0 0 127.0.0.1:mysql 127.0.0.1:56960
  5. ESTAB 0 0 [::1]:6379 [::1]:60402
  6. ESTAB 0 0 [::1]:6379 [::1]:60404
  7. ESTAB 0 0 [::1]:60404 [::1]:6379
  8. ESTAB 0 0 [::1]:60402 [::1]:6379
  9. ESTAB 0 0 192.168.1.44:740 192.168.1.2:nfs
  10. CLOSE-WAIT 0 0 192.168.1.44:47135 23.217.139.9:http

从命令输出中可以看到有两个连接,分别指向192.168.1.2上的NFS192.168.1.4上的SSH``CLOSE-WAIT状态表示报文段FIN已经发送,但是套接字尚未完全关闭。一个套接字可以永远(或者是在重启系统之前)停留在这种状态。终止拥有该套接字的进程也许能够将其释放,但并非总是一定能。

2. 跟踪侦听端口的应用程序

系统服务会打开一个套接字并将其设置为listen(侦听)模式,用于接受来自远程主机的网络连接。SSHD以此侦听SSH连接,httpd以此接受HTTP请求。

如果系统被黑,可能会多出一个新的程序,负责侦听攻击者的指令。

ss的选项-l可以列出处于listen模式的套接字。选项-u指定只输出UDP套接字。选项-t指定只输出TCP套接字。

下面的命令显示出了Linux工作站上负责侦听的UDP套接字:

  1. $ ss -ul
  2. State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
  3. UNCONN 0 0 *:sunrpc *:*
  4. UNCONN 0 0 *:ipp *:*
  5. UNCONN 0 0 *:ntp *:*
  6. UNCONN 0 0 127.0.0.1:766 *:*
  7. UNCONN 0 0 *:898 *:*

输出显示系统能够接受远程过程调用(Remote Procedure Call,RPC)。对应的sunrpc端口由程序portmap所占用。portmap控制着RPC服务的访问,nfs客户端和服务器都要用到该程序。

ippntp端口分别由Internet打印协议(Internet Printing Protocol)和网络时间协议(NetworkTime Protocol)所占用。这两者各有其用,但不是每个系统都需要。

/etc/services中并没有列出端口号766898①。lsof命令的选项-i能够显示出占用了某端口的任务。该命令在使用时需要有root权限:

ss 命令因此无法像前3项输出那样将端口号映射为端口名称。

  1. # lsof -i :898

或者

  1. # lsof -n -i :898
  1. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  2. rpcbind 3267 rpc 7u IPv4 16584 0t0 UDP *:898
  3. rpcbind 3267 rpc 10u IPv6 16589 0t0 UDP *:898

从命令输出中可以看出,侦听端口898的是RPC系统的一部分,并不是骇客。

  1. [root@dev workspace]# lsof -i :6379
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. redis-ser 653 redis 6u IPv4 2449 0t0 TCP localhost:6379 (LISTEN)
  4. redis-ser 653 redis 7u IPv6 2450 0t0 TCP ip6-localhost:6379 (LISTEN)
  5. redis-ser 653 redis 8u IPv6 19190 0t0 TCP ip6-localhost:6379->ip6-localhost:60402 (ESTABLISHED)
  6. redis-ser 653 redis 9u IPv6 19193 0t0 TCP ip6-localhost:6379->ip6-localhost:60404 (ESTABLISHED)

12.3.3 工作原理

ss命令利用系统调用从内部的内核用表中提取信息。/etc/services中定义了系统中已知的服务和端口。