前几天准备把线上一批机器添加iptables。因而梳理出几个须要通外网的端口,80,81等。nginx
防火墙规则以下:centos
#### filter table ############################################################# *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT # sshd service -A INPUT -m state --state NEW -m tcp -p tcp --dport 22022 -j ACCEPT # nginx service -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 81 -j ACCEPT # SSL -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT # IP range : 192.168.0.1 - 192.168.3.255 # The broadcast IP : 192.168.3.255 # No gateway IP for NAT, but usually 192.168.0.1 is reserved for NAT. -A INPUT -s 192.168.0.0/22 -j ACCEPT -A INPUT -s 10.10.0.0/20 -j ACCEPT -A INPUT -s 10.100.255.0/24 -j ACCEPT # -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited # COMMIT #### filter table #############################################################
2级的10台nginx 开启这个防火墙策略后,因为疏忽,忘了修改内核参数nf_conntrack 的值,致使周六周日时,观察公网带宽流量急剧降低,由于这个参数是监听iptables 状态的一个表的大小。默认为几W吧。因而临时调整为1KW条,业务正常恢复。bash
周一到公司后,准备启用raw 表 来过滤到经常使用的nginx请求。由于nf_conntrack数目大了以后,会消耗CPU去翻查整张表,为了提升性能,因此使用raw表。ssh
规则以下:tcp
# Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [10317:831488] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -s 192.168.0.0/22 -j ACCEPT -A INPUT -s 10.10.0.0/20 -j ACCEPT -A INPUT -s 10.100.255.0/24 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m state --state UNTRACKED -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Tue Sep 26 16:26:50 2017 # Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017 *raw :PREROUTING ACCEPT [52314:16887755] :OUTPUT ACCEPT [10317:831488] -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 81 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 443 -j NOTRACK -A PREROUTING -p udp -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 81 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 443 -j NOTRACK -A OUTPUT -p udp -j NOTRACK COMMIT
发现telnet 不通外网IP。性能
使用raw表target track 功能 标记80端口的tpc包来跟踪为何通不了。配置以下centos7
# Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [10317:831488] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 81 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -s 192.168.0.0/22 -j ACCEPT -A INPUT -s 10.10.0.0/20 -j ACCEPT -A INPUT -s 10.100.255.0/24 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m state --state UNTRACKED -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Tue Sep 26 16:26:50 2017 # Generated by iptables-save v1.4.21 on Tue Sep 26 16:26:50 2017 *raw :PREROUTING ACCEPT [52314:16887755] :OUTPUT ACCEPT [10317:831488] -A PREROUTING -s xxxxxxxxx/32 -p tcp -m tcp --dport 80 -j TRACE -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 81 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 443 -j NOTRACK -A PREROUTING -p udp -j NOTRACK -A OUTPUT -d xxxxxxxxx/32 -p tcp -m tcp --dport 80 -j TRACE -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 81 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 443 -j NOTRACK -A OUTPUT -p udp -j NOTRACK COMMIT
centos7.2 在/var/log/message查看内核的跟踪信息以下图spa
重点讲一下路由跟踪的分析。3d
一、第一次我到达物理机匹配raw:PREROUTING:rule:2 这个规则,这些规则的行数使用iptables -t tablename -L -n的行数来的,以下图。blog
二、在匹配到raw表的第三行策略,为不标记由于是80 因此会匹配到。而后就直接匹配到 filter表的ONPUT链的第11行,通过3次循环的TPC SYN 而后就离开了。由于咱们11行的策略为,若是上述filter表的inPUT链中没有匹配到的就会所有拒绝
三、后来思考了一下,为何没有匹配到filter表的中间dport=80的这条规则,缘由思考了一下,由于有一个-m state --state NEW 由于这条规则为 一条新链接且端口为80就放行,那么怎么定义这条新链接呢,就是在nf_conntrack表中来查询这个是否是新进来的链接。可是咱们在80进来的时候已经进行了notrack了,因此就直接匹配到11行了。
四、修改后的iptables rules(跟踪已去掉)
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [56910980:19947845130] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 81 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -s 192.168.0.0/22 -j ACCEPT -A INPUT -s 10.10.0.0/20 -j ACCEPT -A INPUT -s 10.100.255.0/24 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m state --state UNTRACKED -j ACCEPT -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Tue Sep 26 17:25:17 2017 # Generated by iptables-save v1.4.21 on Tue Sep 26 17:25:17 2017 *raw :PREROUTING ACCEPT [48348514:18391836111] :OUTPUT ACCEPT [56911513:19948023270] -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 81 -j NOTRACK -A PREROUTING -p tcp -m tcp --dport 443 -j NOTRACK -A PREROUTING -p udp -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 81 -j NOTRACK -A OUTPUT -p tcp -m tcp --sport 443 -j NOTRACK -A OUTPUT -p udp -j NOTRACK COMMIT # Completed on Tue Sep 26 17:25:17 2017
这条博文教你们遇到iptables 问题后,如何找到故障点。