问题描述
在安装kubernetes过程中,一直打开防火墙配置,并配置coredns,但在node节点遇到解释超时问题,怀疑是防火墙的问题。
诊断过程
关闭防火墙进行测试
systemctrl stop firewalld
关闭防火墙后,coredns解释正常,因此确定是防火墙的问题。
查看iptables的包拒绝情况,发现FORWARD链最后有REJECT了一些包。
# iptables -nvL --line | head -25
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 135K 16M KUBE-FIREWALL all -- * * 0.0.0.0/0 0.0.0.0/0
2 138K 17M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 1048 62566 INPUT_direct all -- * * 0.0.0.0/0 0.0.0.0/0
5 1048 62566 INPUT_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
6 1048 62566 INPUT_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
7 146 5840 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
8 40 3754 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 4003 1060K KUBE-FORWARD all -- * * 0.0.0.0/0 0.0.0.0/0 /* kubernetes forwarding rules */
2 1795 961K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
3 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 2208 99435 FORWARD_direct all -- * * 0.0.0.0/0 0.0.0.0/0
5 2208 99435 FORWARD_IN_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
6 2208 99435 FORWARD_IN_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
7 2208 99435 FORWARD_OUT_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
8 2208 99435 FORWARD_OUT_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
9 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
10 2208 99435 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
...
开启iptables日志定位ash
# iptables -I FORWARD 10 -j LOG --log-prefix "FORWARD"
# tail -f /var/log/messages
Jul 23 11:45:07 node2 kernel: FORWARDIN=flannel.1 OUT=docker0 MAC=7a:97:e0:cf:94:b9:5e:40:16:d4:91:8c:08:00 SRC=172.30.59.0 DST=172.30.32.2 LEN=60 TOS=0x10 PREC=0x00 TTL=63 ID=32595 DF PROTO=TCP SPT=48864 DPT=53 WINDOW=28200 RES=0x00 SYN URGP=0
Jul 23 11:45:08 node2 kernel: FORWARDIN=docker0 OUT=ens33 PHYSIN=vethb838c46 MAC=02:42:56:97:34:61:02:42:ac:1e:20:02:08:00 SRC=172.30.32.2 DST=192.168.5.2 LEN=45 TOS=0x00 PREC=0x00 TTL=63 ID=43751 DF PROTO=UDP SPT=37873 DPT=53 LEN=25
Jul 23 11:45:08 node2 kernel: FORWARDIN=docker0 OUT=ens33 PHYSIN=vethb838c46 MAC=02:42:56:97:34:61:02:42:ac:1e:20:02:08:00 SRC=172.30.32.2 DST=192.168.5.2 LEN=45 TOS=0x00 PREC=0x00 TTL=63 ID=43767 DF PROTO=UDP SPT=56901 DPT=53 LEN=25
可以看出,源地址为SRC=172.30.32.2发出访问目标端口DPT=53(DNS)的包被拦截了。
解决问题
修改防火墙规则,再进行测试后DNS成功。然后修改docker的服务配置,在重新启动时加载规则。
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -s 172.30.0.0/16 -j ACCEPT
# vim /usr/lib/systemd/system/docker.service
[Service]
ExecStartPost=/usr/bin/firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -s 172.30.0.0/16 -j ACCEPT
...
最后,清除上面添加的日志跟踪:
# iptables -nvL --line #找出FORWARD链的LOG所在的行数
# iptables -D FORWARD 10