iptables 添加raw提高服務器性能之路


前幾天准備把線上一批機器添加iptables。於是梳理出幾個需要通外網的端口,80,81等。

防火牆規則如下:

#### 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條,業務正常恢復。

周一到公司后,准備啟用raw 表 來過濾到常用的nginx請求。因為nf_conntrack數目大了之后,會消耗CPU去翻查整張表,為了提高性能,所以使用raw表。

規則如下:

# 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包來跟蹤為什么通不了。配置如下

# 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查看內核的跟蹤信息如下圖

重點講一下路由跟蹤的分析。

1、第一次我到達物理機匹配raw:PREROUTING:rule:2 這個規則,這些規則的行數使用iptables -t tablename -L -n的行數來的,如下圖。

2、在匹配到raw表的第三行策略,為不標記因為是80 所以會匹配到。然后就直接匹配到 filter表的ONPUT鏈的第11行,經過3次循環的TPC SYN 然后就離開了。因為我們11行的策略為,如果上述filter表的inPUT鏈中沒有匹配到的就會全部拒絕

3、后來思考了一下,為什么沒有匹配到filter表的中間dport=80的這條規則,原因思考了一下,因為有一個-m state --state NEW 因為這條規則為 一條新連接且端口為80就放行,那么怎么定義這條新連接呢,就是在nf_conntrack表中來查詢這個是不是新進來的連接。但是我們在80進來的時候已經進行了notrack了,所以就直接匹配到11行了。

4、修改后的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 問題后,如何找到故障點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM