2019独角兽企业重金招聘Python工程师标准>>>
前言
在 Troubleshooting 过程中,检查完进程信息后,接下来就是排查网络情况的时候了,初略翻过《TCP/IP 详解卷一:协议》这本书,简直跟看《深入理解 Linux 内核》一毛一样,各种协议各种底层结构体,每个域代表不同的意思,许许多多的域组合在一起共同控制着网络和内核。
Troubleshooting 系列仅仅整理工具和排查问题可能用到的命令,尽量不细述底层概念(功力有限我也写不出来)。
curl netstat iptables network ifconfig ip地址配置 traceroute telnet ping lsof iftop(top系列)vpn tcpdump 等抓包,和各种网络攻击(后续单独整理)
网络状态
- netstat
显示网络相关信息(网络连接、路由表、接口状态等)
常见的参数:
-a 显示所有连接中的 socket
-c 持续列出网络状态
-n 尽量把别名转换成数字显示
-o 显示计时器
-p 显示正在使用 socket 的程序识别码和程序名称
-i 显示网卡列表
-s 显示网络统计信息
-v 显示指令执行过程,与 -p 不可同用
-t/u tcp/udp 连接状况
netstat 的输出结果可分为两个部分:
1、Active Internet connections:有源 TCP 连接,列中 Recv-Q 和 Send-Q 为接受队列和发送队列,如果没有堆积一般都为 0。
2、Active UNIX domain sockets:有源 Unix 域套接口(只能用于本机通信,性能较高),RefCnt 表示连接到套接口的进程号。
套接口的类型:TCP、UDP、RAW、UNIX 域 等
状态:
LISTEN:处于监听状态ESTABLISHED:表示打开的一个连接SYN-SENT:发送连接请求后等待匹配的状态SYN-RECEIVED:收到和发送一个连接请求后等待对方确认连接请求FIN-WAIT-1:等待远程 TCP 连接中断请求,或之前的连接中断请求确认FIN-WAIT-2:从远程 TCP 等待连接中断请求CLOSE-WAIT:等待从本地用户发来的连接中断请求CLOSING:等待远程 TCP 对连接中断的确认LAST-ACK:等待原来的发向远程 TCP 的连接中断请求的确认TIME-WAIT:等待足够的时间以确保远程 TCP 接收到连接中断请求的确认CLOSED:没有任何连接状态
通过 netstat 可以查看连接本机的ip,通过 uniq 可以统计出连接 ip 的数量。
- curl
curl 是一款用于上传下载的传输工具,支持 http/https/ftp/imap/pop3 等协议,同时也支持断点续传,功能十分强大。
PS:本人用的最多的是在无图形界面的 linux 上测试网页状态,将网页输出到界面上:
curl http://www.baidu.com
-o:保存网页至指定文件-O:保存服务器上指定文件,url 需要明确指定文件名-C/--continue-at:断点续传,可指定位置获取数据,假设文件大小为1000字节,-C 100 代表获取 100-999 的数据-r:分块下载,类似于 -C,可以使用区间,-r 0-1024 代表获取 0-1024 的数据,cat part* > all 即可以合并-T/--upload-file:上传,-T "file[1-100].txt" ftp://myserver.com/upload/、-T "{file1.txt, file2.txt}" http://myserver.com-d/--data:post 请求,-d "id=1&name=test" http://myserver.com/example.php-F/--form:上传,-F "password=@/etc/passwd" www.mypasswords.com-e/--referer:伪造 referer(盗链),服务器一般会检查 http 请求的 referer,用于控制访问,也就是告诉服务器你是从哪个页面跳转过来的,-e "www.baidu.com" http://www.baidu.com 告诉服务器你是从 www.baidu.com 跳转过来的-A/--user-agent:定义 user agent,伪装成一个指定的浏览器,-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)http://www.baidu.com-b/--cookie:有的网站会查看 cookie 信息来判断是否按规定浏览,-b /cookie.txt http://www.baidu.com 使用本地 cookie.txt 里的 cookie 信息来访问,也可以输入参数和值:-b "name=wade" http://www.baidu.com-c/--cookie-jar:保存操作时生成的 cookie 文件,-c ./cookie.txt http://www.baidu.com-w/--write-out:自定义输出内容,-w %{http_code} -w "time=%{time_total}\n" http://www.baidu.com 打印返回的 http 码和响应时间,还有很多参数可以打印。-u/--user: <user[:password]> 用户名和密码,curl -O -u username:passwd ftp://www.linux.com/file.txt 从 ftp 服务器下载文件(也可以 curl -O ftp://username:passwd@www.linux.com/file.txt)-x/--porxy:上网很多时候需要用到代理服务器,-x 192.168.1.1:8080 http://www.baidu.com 使用代理服务以及端口访问-s/--silent:静音模式
当然,curl 还有很多别的功能,只是列了几个常用的选项,附上一个写的不错的博客:http://www.ruanyifeng.com/blog/2011/09/curl.html,可参考。
- iptables
可参考《2小时玩转 iptables》pdf
ipset 是 iptables 的扩展,允许创建一个匹配整个地址的地址集合,而 iptables 仅仅支持线性存储和过滤,地址集合可提高查找的速率。
#iptables + ipset:centos 默认没有安装 iptables 和 ipsetyum install iptables-services ipset#创建一个新的 ipset,ipset 默认可存储 65536 个 element,可通过选项 maxelem 修改数量ipset create my_ipset hash:nat (maxelem 65536)#查看以创建的 ipset ipset list#添加一个ip 到 ipset 中ipset add my_ipset 192.168.1.1#从 ipset 中去除一个 ipipset del my_ipset 192.168.0.1#在创建 iptables 规则链时使用 ipsetiptables -I INPUT -m set --match-set my_ipset src -p tcp --destination-port 22 -j DROP#删除 ipsetipset destroy my_ipset#将 ipset 规则保存到文件ipset save my_ipset -f my_ipset.txt#从文件中导入 ipset 规则ipset restore -f my_ipset.txt
ipset 支持动态修改地址集合,哪怕 iptables 正在使用这个集合,这样在生产环境上面就可以很好的管理黑名单列表,而不用重启 iptables 了。
- telnet
telnet 是一款基于 telnet 协议的远程工具,Telnet 协议是 TCP/IP 协议家族中的一员,是一个远程登录服务的标准协议,但是由于 telnet 采用明文传送报文,没有使用公钥私钥加密,所有大都服务器都没有开放 telnet 服务,而使用加密的ssh 方式。
一般使用 telnet 大都是检查远程服务器的某个端口是否能访问。
telnet 192.168.0.1 22
Telnet 实例还可以将键盘连接到某个目标 TCP 端口,并将此 TCP 端口输出回送到显示屏上,它几乎可以连接所有的 TCP 服务器,包括 HTTP 服务器。
通过 Telnet 程序直接与 Web 服务器进行对话,通过 Telnet 可以打开一条到某台机器上某个端口的 TCP 连接,然后直接向那个端口输入一些字符,Web 服务器会将 Telnet 程序做为一个 Web 客户端来处理,所有回送给 TCP 连接的数据都会显示在屏幕上。
步骤:
1、首先,向 DNS 服务器查找 www.joes-hardware.com 的 IP 地址,打开一条到目标服务器端口 80 的 TCP 连接,当然 Telnet 会为我们完成这些。2、在完成打开一条 TCP 连接后,Telnet 会输出三行内容,告诉我们已经建立了连接。3、接下来就要输入 HTTP 请求了4、请求结束后(由一行空行表示),服务器会在一条 HTTP 响应中将内容返回并关闭连接。
输出:
Telnet 虽然可以很好的模拟 HTTP 客户端,但是并不能作为服务器使用,而且 Telnet 做自动化很繁琐,可以使用 nc(netcat)方便的操纵基于 TCP 和 UDP 的流量(包括 HTTP)