抓包
tcpdump常用参数
-i:指定要监听的网络接口。
-n:不解析主机名,直接显示 IP 地址。
-nn:不解析主机名和端口号,直接显示 IP 地址和端口号。
-s:指定捕获的每个数据包的字节数,默认是 68 字节,通常设置为 0 表示捕获整个数据包。
-c:指定捕获的数据包数量。
-w:将捕获的数据包写入文件。
-r:从文件读取数据包进行分析。
-v, -vv, -vvv:增加输出的详细程度。
-A:以 ASCII 格式打印数据包的内容。
-X:以十六进制和 ASCII 格式打印数据包的内容。
tcpdump -i eth0 -w capture.pcap 捕获 eth0 接口上所有流量并且写入文件capture.pcap
tcpdump -i eth0 'tcp port 80' 捕获 eth0 接口上所有 TCP 端口为 80 的流量(HTTP)
tcpdump -i eth0 host 192.168.1.1 捕获 eth0 接口上所有与 IP 地址 192.168.1.1 相关的所有流量
tcpdump -i eth0 src 192.168.1.1 捕获 eth0 接口上所有源 IP 地址为 192.168.1.1 的所有流量
tcpdump -i eth0 dst 192.168.1.1 捕获 eth0 接口上所有目的 IP 地址为 192.168.1.1 的所有流量
tcpdump -i eth0 -vv 以详细模式显示 eth0 接口上的所有流量
TCP相关参数
大多数 0代表关闭 1代表开启
#ip地址转发
net.ipv4.ip_forward = 0
#防止syn flood攻击(0 不启用 1 当半连接队列满时启用 2 无条件启用)
net.ipv4.tcp_syncookies = 1
#所允许存在time_wait状态的最大数值,超过则立刻被清楚并且警告。
net.ipv4.tcp_max_tw_buckets = 10000
#接收方能告诉发送方哪些报文段丢失,哪些报文段重传了,哪些报文段已经提前收到等信息
net.ipv4.tcp_sack = 1
#syn(半连接)队列的最大长度(还取决于其它参数)
net.ipv4.tcp_max_syn_backlog = 511
#添加时间戳(NAT环境开启多台服务器公用同一个时间戳可能有问题)
net.ipv4.tcp_timestamps = 0
#作为服务端时syn、ack重传次数
net.ipv4.tcp_synack_retries = 1
#作为客户端时syn重传次数
net.ipv4.tcp_syn_retries = 1
#主动关闭连接TIME_WAIT 状态回收(NAT环境可能有问题)
net.ipv4.tcp_tw_recycle = 1
#主动关闭连接TIME_WAIT 状态重用
net.ipv4.tcp_tw_reuse = 1
#全连接队列满了之后行为控制(0 扔掉 1回复reset报文 这个参数只在半连接队列往全连接队列移动时才有效。而全连接队列已经满的情况下,内核的默认行为只是丢弃新的 SYN 包(而且目前没有参数可以控制这个行为),这会导致客户端 SYN 不断重传。)
net.ipv4.tcp_abort_on_overflow = 1
#全连接队列大小(还取决于其它参数)
net.core.somaxconn = 511
# TIME_WAIT超时时间,默认是60s
net.ipv4.tcp_fin_timeout = 10
网络问题排查
netstat -s
XXX times the listen queue of a socket overflowed overflowed代表accept全连接队列溢出
XXX SYNs to LISTEN sockets dropped droped代表syn半连接队列溢出(accept全连接队列满droped也会增大,droped和overflowed一致的话应该是全连接队列溢出)
syn半连接队列的大小取决于(不同内核可能有差异):min(backlog, net.core.somaxconn, net.ipv4.tcp_max_syn_backlog)
accept全连接队列的大小取决于(不同内核可能有差异):min(backlog, net.core.somaxconn)
ss -lnt
-l:只显示处于“监听”状态的套接字
-n:以数字形式显示地址和端口号
-t:只显示TCP协议的套接字
监听状态下 Send-Q 表示accept队列最大值,Recv-Q表示accept队列当前使用了多少
非监听状态下 Send-Q 表示已发送但未收到确认的字节数,Recv-Q表示已收到但未被应用进程读取的字节数