网络丢包定位记录(三)
网络IP层丢包
接口ip地址配置丢包
1. 本机服务不通,检查lo接口有没有配置地址是127.0.0.1;
2 .本机接收失败, 查看local路由表:ip r show table local|grep 子机ip地址;这种丢包一般会出现在多IP场景,子机底层配置多ip失败,导致对应ip收不到包而丢包;
解决方案:
1.配置正确接口ip地址;比如ip a add 1.1.1.1 dev eth0
2.如果发现接口有地址还丢包,可能是local路由表没有对应条目,紧急情况下,可以用手工补上:
比如ip r add local 本机ip地址 dev eth0 table local ;
路由丢包
路由配置丢包
查看:
1.查看配置 路由是否设置正确(是否可达),是否配置策略路由(在弹性网卡场景会出现此配置)ip rule:
然后找到对应路由表。查看路由表:
或者直接用 ip r get x.x.x.x,让系统帮你查找是否存在可达路由,接口是否符合预期;
2.查看系统统计信息:
netstat -s|grep "dropped because of missing route"
解决方案:重新配置正确的路由;
反向路由过滤丢包
反向路由过滤机制是Linux通过反向路由查询,检查收到的数据包源IP是否可路由(Loose mode)、是否最佳路由(Strict mode),如果没有通过验证,则丢弃数据包,设计的目的是防范IP地址欺骗攻击。
查看:
rp_filter提供三种模式供配置:
0 - 不验证
1 - RFC3704定义的严格模式:对每个收到的数据包,查询反向路由,如果数据包入口和反向路由出口不一致,则不通过
2 - RFC3704定义的松散模式:对每个收到的数据包,查询反向路由,如果任何接口都不可达,则不通过
查看当前rp_filter策略配置:
$cat /proc/sys/net/ipv4/conf/eth0/rp_filter
如果这里设置为1,就需要查看主机的网络环境和路由策略是否可能会导致客户端的入包无法通过反向路由验证了。
从原理来看这个机制工作在网络层,因此,如果客户端能够Ping通服务器,就能够排除这个因素了。
解决方案:
根据实际网络环境将rp_filter设置为0或2:
$ sysctl -w net.ipv4.conf.all.rp_filter=2或
$ sysctl -w net.ipv4.conf.eth0.rp_filter=2
防火墙丢包
客户设置规则导致丢包
查看:
iptables -nvL |grep DROP ;
解决方案: 修改防火墙规则;
连接跟踪导致丢包
连接跟踪表溢出丢包
kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并把每条记录保存到 table 里(这个 table 在内存里,可以通过/proc/net/ip_conntrack 查看当前已经记录的总数),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间,一般这个 table 很大不容易占满并且可以自己清理,table 的记录会一直呆在 table 里占用空间直到源 IP 发一个 RST 包,但是如果出现被攻击、错误的网络配置、有问题的路由/路由器、有问题的网卡等情况的时候,就会导致源 IP 发的这个 RST 包收不到,这样就积累在 table 里,越积累越多直到占满。无论,哪种情况导致table变满,满了以后就会丢包,出现外部无法连接服务器的情况。内核会报如下错误信息:kernel: ip_conntrack: table full, dropping packet;
查看当前连接跟踪数 :
cat /proc/sys/net/netfilter/nf_conntrack_max
解决方案:
增大跟踪的最大条数
net.netfilter.nf_conntrack_max = 3276800
减少跟踪连接的最大有效时间
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
net.netfilter.nf_conntrack_udp_timeout_stream = 180
net.netfilter.nf_conntrack_icmp_timeout = 30
ct创建冲突失导致丢包
查看:当前连接跟踪统计:cat /proc/net/stat/nf_conntrack,可以查各种ct异常丢包统计
网络编程之网络丢包故障如何定位?如何解决?
解决方案:内核热补丁修复或者更新内核版本(合入补丁修改);