每一个应用程序都需要通过端口访问网络。通过获取开放端口列表、使用特定端口的应用以及运行该应用的用户,是跟踪系统中出现预期和非预期行为的一种方法。这些信息既可用于分配资源,也可用于检查rootkits或其他恶意软件。
8.13.1 预备知识
很多命令都可用来列出端口以及运行在端口上的服务。lsof和netstat命令在绝大部分GNU/Linux发行版中都可以使用。
8.13.2 实战演练
lsof(list open files)命令可以列出已打开的文件。选项-i将范围限制在已打开的网络连接:
$ yum install lsof -y$ lsof -iCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODENAMEfirefox-b 2261 slynux 78u IPv4 63729 0t0 TCPlocalhost: 47797->localhost:42486 (ESTABLISHED)firefox-b 2261 slynux 80u IPv4 68270 0t0 TCPslynux-laptop.local:41204->192.168.0.2:3128 (CLOSE_WAIT)firefox-b 2261 slynux 82u IPv4 68195 0t0 TCPslynux-laptop.local:41197->192.168.0.2:3128 (ESTABLISHED)ssh 3570 slynux 3u IPv6 30025 0t0 TCPlocalhost:39263->localhost:ssh (ESTABLISHED)ssh 3836 slynux 3u IPv4 43431 0t0 TCPslynux-laptop.local:40414->boney.mt.org:422 (ESTABLISHED)GoogleTal 4022 slynux 12u IPv4 55370 0t0 TCPlocalhost:42486 (LISTEN)GoogleTal 4022 slynux 13u IPv4 55379 0t0 TCPlocalhost:42486->localhost:32955 (ESTABLISHED)
lsof的每一项输出都对应着一个开放端口上的服务。输出的最后一列类似于:
$ laptop.local:41197->192.168.0.2:3128
输出中的laptop.local:41197对应本地主机,192.168.0.2:3128对应远程主机。41197是本地主机当前的开放端口,3128是远程主机上的服务端口。
要列出本地主机当前的开放端口,可以使用下列命令:
$ lsof -i | grep ":[0-9a-z] +->" -o | grep "[0-9a-z] +" -o | sort | uniq
8.13.3 工作原理
第一个grep中使用的正则表达式:[0-9a-z]+->用来从lsof输出中提取主机端口部分(:34395->或:ssh->)。第二个grep用来删除起始的冒号以及末尾的箭头,提取端口号(数字)。多个连接可能会使用同一个端口,因此相同的端口也许会出现多次。为了保证每个端口只显示一次,将端口号排序并使用uniq命令打印出不重复的部分。
8.13.4 补充内容
还有其他一些工具也可以用来查看开放端口以及网络流量相关信息。
用netstat查看开放端口与服务
netstat也可以显示网络服务统计信息。该命令的功能非常多,已经超出了这则攻略的范围。
用netstat -tnp列出开放端口与服务:
$ netstat –tnpProto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 192.168.0.82:38163 192.168.0.2:3128 ESTABLISHED 2261/firefox-bintcp 0 0 192.168.0.82:38164 192.168.0.2:3128 TIME_WAIT -
