iptables加载顺序问题及优化方法
iptables加载顺序问题及优化方法
1. 问题背景
近期, 在跟进存储节点升级 RAID 卡固件的事情时, 发现部分集群在重启机器后, 有极大的概率出现 client request block 的问题, block 时业务受到影响, 但隔一小段时间后, 故障能自行恢复. 问题重现机率高, 影响面大, 所以深入进一步排查.
2. 问题排查
- 通过 OSD 日志发现, 故障期间 OSD 日志有报出连接问题, 并在问题连接最终断开并重新连上后, 故障恢复
- 检查所有节点的网络通迅, 路由表, MTU, 防火墙, 均无发现问题
- 线索1: 在解决部分 block request 时, 为解决 block request, 停了全部 OSD; 发现全停了 OSD 后, 再次启动后并没有出现 block request, 获得线索1
- 线索1: 重新启动的 OSD 表现正常, 并多次验证依然如此, 推测第一次 OSD 启动时, 可能有部分设置有问题导致故障
- 根据线索1, 第一时间想到了 /etc/rc.local 中最后加载的配置, 其中存储节点只有防火墙及 sysctl 配置加载
- 验证: 注释 rc.local, 进行重启, 确认没有出现 block request, 问题原因缩小到防火墙及 sysctl 配置差异
- 一开始怀疑到 sysctl 最后才加载, 导致前面 OSD 节点在并发启动 OSD 服务时, backlog等网络参数过小, 导致丢包或连接丢失问题
- 排除验证: 通过对 /etc/rcS.d 的过滤, 确认在 ceph 服务启动前, sysctl 已经由系统内置的加载过一遍
- 钩子验证: 通过在 /etc/init.d/ceph 的启动配置中, 加入输出 sysctl 配置的操作, 进一步验证了 sysctl 的配置已经是加载过(在 /etc/rcS.d/S11procps 中加载)
- 至此基本可以确认防火墙的加载导致故障, 但尚未进行根因分析
3. 根因分析
这段时间正好遇到新上的一波计算节点出现不少节点的 nova 服务异常故障, 一联想可能是同个问题导致, 并做进一步的根因分析
- 拿两台有问题的计算节点, 一台注释防火墙加载, 一台保持原配置, 重启机器, 观察到不加载防火墙的计算节点nova-compute服务正常, 而加载了防火墙的节点 nova-compute 服务异常
- 表现: nova-compute 服务异常时, 日志不定时刷新, 但从master的nova service-list 以及 rabbitmap的状态中, 却能观察到正常的心跳及连接
-
通过观察防火墙规则, 初步判断为 TCP 连接的建立先于 conntrack 规则的加载, 导致 conntrack 规则加载后, 原来已经握手完成的 TCP 数据包被识别为异常数据包, 进而被 Drop, 导致 网络连接状态异常
- 这也就可以解释为什么重启一次服务后, 又能正常, 因为此次 conntrack 规则已经生效中
- 这也就可以解释为什么nova-compute服务异常后, 还能有正常的心跳反馈出去(因为这只是出去的包, 无限制)
-
通过开启iptables的 LOG, 进行debug, 确认该猜测, 原因明确
root@cld-acc162-32:/etc/rcS.d# dmesg | grep 'DROP' | grep '10.200.12.102'
[ 140.173826] INPUT:DROP IN=eth0 OUT= MAC=9c:dc:71:64:9e:b0:5c:b9:01:d0:9e:c0:08:00 SRC=10.200.12.102 DST=10.200.13.135 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=47100 DF PROTO=TCP SPT=5672 DPT=40445 WINDOW=59 RES=0x00 ACK PSH URGP=0
[ 140.381274] INPUT:DROP IN=eth0 OUT= MAC=9c:dc:71:64:9e:b0:5c:b9:01:d0:9e:c0:08:00 SRC=10.200.12.102 DST=10.200.13.135 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=47101 DF PROTO=TCP SPT=5672 DPT=40445 WINDOW=59 RES=0x00 ACK PSH URGP=0
[ 140.589186] INPUT:DROP IN=eth0 OUT= MAC=9c:dc:71:64:9e:b0:5c:b9:01:d0:9e:c0:08:00 SRC=10.200.12.102 DST=10.200.13.135 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=47102