由init和xinetd启动的守护进程未必是系统中所运行的全部服务。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连接的状态:
$ ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port ProcessESTAB 0 0 127.0.0.1:56960 127.0.0.1:mysqlESTAB 0 0 127.0.0.1:mysql 127.0.0.1:56960ESTAB 0 0 [::1]:6379 [::1]:60402ESTAB 0 0 [::1]:6379 [::1]:60404ESTAB 0 0 [::1]:60404 [::1]:6379ESTAB 0 0 [::1]:60402 [::1]:6379ESTAB 0 0 192.168.1.44:740 192.168.1.2:nfsCLOSE-WAIT 0 0 192.168.1.44:47135 23.217.139.9:http
从命令输出中可以看到有两个连接,分别指向192.168.1.2上的NFS和192.168.1.4上的SSH``CLOSE-WAIT状态表示报文段FIN已经发送,但是套接字尚未完全关闭。一个套接字可以永远(或者是在重启系统之前)停留在这种状态。终止拥有该套接字的进程也许能够将其释放,但并非总是一定能。
2. 跟踪侦听端口的应用程序
系统服务会打开一个套接字并将其设置为listen(侦听)模式,用于接受来自远程主机的网络连接。SSHD以此侦听SSH连接,httpd以此接受HTTP请求。
如果系统被黑,可能会多出一个新的程序,负责侦听攻击者的指令。
ss的选项-l可以列出处于listen模式的套接字。选项-u指定只输出UDP套接字。选项-t指定只输出TCP套接字。
下面的命令显示出了Linux工作站上负责侦听的UDP套接字:
$ ss -ulState Recv-Q Send-Q Local Address:Port Peer Address:Port ProcessUNCONN 0 0 *:sunrpc *:*UNCONN 0 0 *:ipp *:*UNCONN 0 0 *:ntp *:*UNCONN 0 0 127.0.0.1:766 *:*UNCONN 0 0 *:898 *:*
输出显示系统能够接受远程过程调用(Remote Procedure Call,RPC)。对应的sunrpc端口由程序portmap所占用。portmap控制着RPC服务的访问,nfs客户端和服务器都要用到该程序。
ipp和ntp端口分别由Internet打印协议(Internet Printing Protocol)和网络时间协议(NetworkTime Protocol)所占用。这两者各有其用,但不是每个系统都需要。
/etc/services中并没有列出端口号766和898①。lsof命令的选项-i能够显示出占用了某端口的任务。该命令在使用时需要有root权限:
①
ss命令因此无法像前3项输出那样将端口号映射为端口名称。
# lsof -i :898
或者
# lsof -n -i :898
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMErpcbind 3267 rpc 7u IPv4 16584 0t0 UDP *:898rpcbind 3267 rpc 10u IPv6 16589 0t0 UDP *:898
从命令输出中可以看出,侦听端口898的是RPC系统的一部分,并不是骇客。
[root@dev workspace]# lsof -i :6379COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEredis-ser 653 redis 6u IPv4 2449 0t0 TCP localhost:6379 (LISTEN)redis-ser 653 redis 7u IPv6 2450 0t0 TCP ip6-localhost:6379 (LISTEN)redis-ser 653 redis 8u IPv6 19190 0t0 TCP ip6-localhost:6379->ip6-localhost:60402 (ESTABLISHED)redis-ser 653 redis 9u IPv6 19193 0t0 TCP ip6-localhost:6379->ip6-localhost:60404 (ESTABLISHED)
12.3.3 工作原理
ss命令利用系统调用从内部的内核用表中提取信息。/etc/services中定义了系统中已知的服务和端口。
