案列分享-因netfilter包过滤规则配置错误造成datax数据同步作业运行失败
大数据作业运行失败的原因多种多样,在复杂环境中的网络问题也是屡见不鲜。 本文分享一个因linux的netfilter 包过滤规则配置错误造成的datax任务失败问题的排查案列,希望大家有所收获。
1. 问题概述
某客户现场,datax 数据同步作业运行失败。
经排查,该 datax 作业会采集 oracle 数据并同步到 CDH 大数据集群的 hive 中,其中 CDH 集群开启了 kerberos 认证(使用的是 freeipa),且 CDH 集群的系列节点和 KDC 节点是 CO-LOCATED 共同部署的。
2 问题分析
- 排查发现,CDH系列节点都使用了 iptables 防火墙服务(systemctl status iptables可以查看服务状态);
- 进一步,通过命令 iptables -L 可以发现,cdh/kdc 系列节点通过配置 netfilter 中表和链的系列规则,限制了某些节点(如datax作业节点)对 cdh/kdc 的tcp 链接,所以 datax 作业会因为无法获取到 NAMENODE/DATANODE/KDC节点的tcp链接而报错。
- 通过命令 ping ip-xxx 测试到目标机器的网路连接,并通过 tcpdump/tshark 抓包,可以发现错误原因:“IP XXX > XXX: ICMP xxx Destination unreachable (host administratively prohibited),这验证了上述猜测:
3. 问题解决
在cdh/kdc系列节点,通过命令 iptables -t filter -A input -s xxx -j ACCEPT 添加规则(注意所有规则的生效顺序),开通 datax 作业节点对这些CDH节点和KDC节点的tcp网络链接,问题解决。
- 可以通过 ping ip-xxx, telnet ip-xxx port-xxx 等命令,验证网络连通性,正常情况下命令输出如下:
4. 技术背景
- 在 RHEL7/CENTOS7 里,预装了多种防火墙服务,即 firewalld/iptables,但同一时间只能启动一个,且默认启用的是 firewalld (老版本 linux 只有iptables防火墙服务);
- firewalld/iptables 这些防火墙服务运行在用户态,其自身并不具备防火墙的功能,而是需要通过内核的 netfilter 子系统来实现,也就是说 firewalld 和 iptables 都是用于维护表/链/规则,而真正使用规则进行包过滤的是内核的 netfilter;
- firewalld 相比 iptables 功能更全面,可以在不丢失现有连接状态的情况下(conntrack),在正常的系统操作期间更改规则;
- 「在后台,firewalld 和 iptables 这两个防火墙服务,都通过相同的接口来与内核中的 netfilter 子系统交互,即它们都通过 iptables 命令来与 netfilter 交互」;
- 「iptables-services 防火墙服务,和 iptables 命令,不是同一个概念,前者是和 firewalld一样的用户态的防火墙服务,后者是用来跟内核态的 netfilter 子系统交互的一个命令」;
- 由于真正起到包过滤作用的是内核态的 netfilter底层的表和链底层的系列包过滤规则,而不是 firewalld/iptables 这些用户态的防火墙服务,所以「即使关闭防火墙服务firewalld/iptables,已经配置在 netfilter 中的 表/链/规则也仍然起作用,所以不能简单地认为,关闭了防火墙服务就没有任何网络问题」;
- You need to distinguish between the iptables service and the iptables command. Although firewalld is a replacement for the firewall management provided by iptables service, it still uses the iptables command for dynamic communication with the kernel packet filter (netfilter). So it is only the iptables service that is replaced, not the iptables command. That can be a confusing distinction at first.
- The "admin prohibited filter" seen in the tcpdump output means there is a firewall blocking a connection. It does it by sending back an ICMP packet meaning precisely that: the admin of that firewall doesn't want those packets to get through. It could be a firewall at the destination site. It could be a firewall in between. It could be iptables on the Linux system.
- The default ports used by Kerberos are port 88 for the KDC1 and port 749 for the admin server. You can, however, choose to run on other ports, as long as they are specified in each host's /etc/services and krb5.conf files, and the kdc.conf file on each KDC.
5. 相关命令
- systemctl status firewalld/iptables: 排查 linux 防火墙状态(防火墙有多种类型:硬件/软件/源端/目标端/网关防火墙,以及 linux 自带的 firewalld/iptables 防火墙);
- yum info iptables/iptables-services/firewalld:查看是否安装了 iptables 命令,iptables/firewalld防火墙服务;
- iptables -L: 排查 linux 防火墙配置(默认查看 filter 表);
- traceroute xxx/ip route:排查网络和路由配置;
- ping xxx/telnet xxx 10000/nc -z -v -u xxx 88:排查网络和端口联通性;
- tcpdump -i any -n icmp/tcpdump -i eth0 port 2181 or arp: tcpdump 抓包并分析;
- tshark -i ens160 dst 192.168.168.65 or arp -w /tmp/tshark.src.pcap: tshark 抓包并导出,后续可以通过wireshark分析;
- tcpdump -i ens160 port 10000 or arp -w /tmp/tcpdump.dst.pcap: tshark 抓包并导出,后续可以通过wireshark分析;
- iptables -t filter -A INPUT -s 10.20.39.254/24 -j DROP:添加一条规则到 filter 表的input链的末尾;
- iptables -t filter -D INPUT -s 10.20.39.254/24 -j REJECT:删除 filter 表的input链中的某条规则;
- iptables 规则的 target 目标策略,配置为 DROP 代表中断过滤,会直接丢弃数据包不给任何回应;而配置为 REJECT 同样代表中断过滤,但拒绝数据包通过的同时会返回响应信息,并可以通过 --reject-with tcp-reset|port-unreachable|echo-reply 指定返回的具体的响应信息,以下截图分别展示了配置为 DROP/REJECT时,客户端 ping 服务器时获得的不同的响应: