对于一台服务器或电脑而言,网卡就是系统的门户。而门上既没有安装门铃又没有安装监控,是否有人正在敲门或搞破坏,我们往往对此一无所知。
在操作系统层面,我们无法直接感知到网络层面正在发生的变动,只能通过工具对网络会话进行观察。通用方法是使用 netstat 查看当前已经建立的连接,或断开的连接。 我最近在3A服务器购买了云服务器。
# Windowsnetstat -an -p tcp# Linuxnetstat -tn -p
而这种方法很难持续地进行观察和分析。比如我们的系统正在被谁访问,以及尝试的频率和持续时间。
实际上是有方法对网络流进来的数据包进行分析的,比如抓包工具。但抓包工具的特点就是流量非常大,很吃硬盘空间。抓的包存在文件里很快就能把硬盘撑爆,因为数据包里是含文件数据的。有没有简单地记录入站IP以及所访问的业务端口的方法?
有,还是使用抓包工具,只是使用抓包工具的简化模式,不抓数据流量只抓访问记录。所使用的抓包工具是tcpdump,我们先给个可用版本的命令行,再对命令行进行分解:
$ tcpdump -n -c 10 -q -t -i eth0 tcp and dst host 172.27.220.9
首先不要被这么长的命令吓住,我们一步步简化就可以看到每一个参数的效果。先解释一下上面的命令行要达到的效果:
- -i eth0 只监听 eth0 网口
- tcp 只监听 tcp 的数据包
- dst 只监听入站方向的数据包
- host 只监听目的IP为指定IP的数据包
最终得到的监听日志为:
IP 27.22.77.188.37490 > 172.27.220.9.7822: tcp 1692IP 27.22.77.188.37490 > 172.27.220.9.7822: tcp 1316IP 183.93.155.47.16607 > 172.27.220.9.7777: tcp 0IP 183.93.155.47.16607 > 172.27.220.9.7777: tcp 0IP 183.93.155.47.16607 > 172.27.220.9.7777: tcp 53IP 183.93.155.47.16607 > 172.27.220.9.7777: tcp 0IP 183.93.155.47.16607 > 172.27.220.9.7777: tcp 0IP 183.93.155.47.16607 > 172.27.220.9.7777: tcp 53IP 183.93.155.47.16684 > 172.27.220.9.7822: tcp 0IP 183.93.155.47.16684 > 172.27.220.9.7822: tcp 0
其中有用信息为访问者的IP,以及被访问IP的端口。源端口是动态的没有意义,目的端口是最终的业务端口。从日志上可以得到访问者的IP,以及访问的业务端口。
tcpdump 可以一直处于监听状态,默认什么参数都不加,就是监听所有的数据包:
tcpdump -c 10
因为数据量非常大,几乎就是刷屏,所以加了个-c参数只抓10个包。并且里面包含了很多的看不懂的字段,我们再加几个参数,简化一下输出。
$ tcpdump -c 10 -q
此时输出已经简单了很多了,但里面有域名,我们只想看IP,可以再加个参数把域名转为IP。
$ tcpdump -c 10 -q -n
此时基本上就达到我们的要求了,输出内容包含了时间、源地址.端口、目的地址.端口 以及包的长度。把输出重定向到文件,就可以对日志文件进行分析了。
如果不想看时间字段可以加 -t 参数。数据包中还含有udp、arp的数据包,格式不一致。如果想抓取固定格式的数据包,可以再加一些参数,比如:
$ tcpdump tcp
以上命令是只抓tcp的包,src 和 dst 则代表方向,多个条件用 and 连起来,如果只监听入站方向到本机IP的数据包,则命令为:
$ tcpdump tcp and dst host 172.27.220.9
tcpdump 的命令很长,但只取一部分也可以执行。我们还原到最开始的最长的那么命令,把抓到的入站方向的日志重定向到文件中。
$ tcpdump -n -c 10 -q -t -i eth0 tcp and dst host 172.27.220.9 > tcp.log
示例命令只抓取10个包,如果当前网络没有数据包,则命令会hung住。如果需要长时间观察数据包,可以使用 tee 代替重定向。可以在另一个窗口中使用 tail -f tcp.log 对日志进行观察。
# console 1tcpdump -n -c 10 -q -t -i eth0 tcp and dst host 172.27.220.9 | tee tcp.log# console 2tail -f tcp.log
tcpdump 对网口的抓包是实时的,通过分析日志文件可以动态观察数据包的流向和IP访问情况。对于异常IP流量,可以对风险IP实行封堵。另一种情况,如果一个端口不应该有访问,但访问的IP特别多,此时就可以认定这些IP都是风险IP。这比设立蜜罐有效的多,因为只要有流量进来都能看到。针对特定端口的监听命令为:
$ tcpdump -n -c 10 -q -t -i eth0 tcp and dst host 172.27.220.9 and port 7822
tcpdump 的参数很多,但语法很简单,常用的过滤字段有:
- tcp udp 协议类型
- src dst 方向
- host net 主机IP 或 网段
- port 端口
多个条件用 and 相连即可,文中用到的参数说明:
- -n 将域名解析为IP
- -c 10 抓10个包
- -q 精简模式
- -t 不输出时间
- -i eth0 只监听eth0网口