前幾天準備把線上一批機器添加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 問題後,如何找到故障點。