每一个应用程序都需要通过端口访问网络。通过获取开放端口列表、使用特定端口的应用以及运行该应用的用户,是跟踪系统中出现预期和非预期行为的一种方法。这些信息既可用于分配资源,也可用于检查rootkits或其他恶意软件。

8.13.1 预备知识

很多命令都可用来列出端口以及运行在端口上的服务。lsofnetstat命令在绝大部分GNU/Linux发行版中都可以使用。

8.13.2 实战演练

lsof(list open files)命令可以列出已打开的文件。选项-i将范围限制在已打开的网络连接:

  1. $ yum install lsof -y
  2. $ lsof -i
  3. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE
  4. NAME
  5. firefox-b 2261 slynux 78u IPv4 63729 0t0 TCP
  6. localhost: 47797->localhost:42486 (ESTABLISHED)
  7. firefox-b 2261 slynux 80u IPv4 68270 0t0 TCP
  8. slynux-laptop.local:41204->192.168.0.2:3128 (CLOSE_WAIT)
  9. firefox-b 2261 slynux 82u IPv4 68195 0t0 TCP
  10. slynux-laptop.local:41197->192.168.0.2:3128 (ESTABLISHED)
  11. ssh 3570 slynux 3u IPv6 30025 0t0 TCP
  12. localhost:39263->localhost:ssh (ESTABLISHED)
  13. ssh 3836 slynux 3u IPv4 43431 0t0 TCP
  14. slynux-laptop.local:40414->boney.mt.org:422 (ESTABLISHED)
  15. GoogleTal 4022 slynux 12u IPv4 55370 0t0 TCP
  16. localhost:42486 (LISTEN)
  17. GoogleTal 4022 slynux 13u IPv4 55379 0t0 TCP
  18. localhost:42486->localhost:32955 (ESTABLISHED)

lsof的每一项输出都对应着一个开放端口上的服务。输出的最后一列类似于:

  1. $ laptop.local:41197->192.168.0.2:3128

输出中的laptop.local:41197对应本地主机,192.168.0.2:3128对应远程主机。41197是本地主机当前的开放端口,3128是远程主机上的服务端口。

要列出本地主机当前的开放端口,可以使用下列命令:

  1. $ 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列出开放端口与服务:

  1. $ netstat tnp
  2. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  3. tcp 0 0 192.168.0.82:38163 192.168.0.2:3128 ESTABLISHED 2261/firefox-bin
  4. tcp 0 0 192.168.0.82:38164 192.168.0.2:3128 TIME_WAIT -