Linux 跟蹤連接netfilter 調優


Netfilter介紹

    linux內核中的netfilter是一款強大的基於狀態的防火牆,具有連接跟蹤(conntrack)的實現。conntrack是netfilter的核心,許多增強的功能,例如,地址轉換(NAT),基於內容的業務識別(l7, layer-7 module)都是基於連接跟蹤。

    nf_conntrack模塊在kernel 2.6.15(2006-01-03發布) 被引入,支持ipv4和ipv6,取代只支持ipv4的ip_connktrack,用於跟蹤連接的狀態,供其他模塊使用。


主要參數介紹

# 哈希表大小(只讀)(64位系統、8G內存默認 65536,16G翻倍,如此類推)
net.netfilter.nf_conntrack_buckets

# 最大跟蹤連接數,默認 nf_conntrack_buckets * 4
net.netfilter.nf_conntrack_max
net.nf_conntrack_max
  • 注:跟蹤的連接用哈希表存儲,每個桶(bucket)里都是1個鏈表,默認長度為4KB
  • 注:netfilter的哈希表存儲在內核空間,這部分內存不能swap
  • 注:哈希表大小 64位 最大連接數/8  32 最大連接數/4
  • 注:32位系統一條跟蹤幾率約為300字節。
  • 注:在64位下,當CONNTRACK_MAX為 1048576,HASHSIZE 為 262144 時,最多占350多MB

狀態查看

1、查找:buckets哈希表大小,max最大幾率的連接條數

# netfilter模塊加載時的bucket和max配置:
sudo dmesg | grep conntrack
[6010550.921211] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
結果

2、查找:哈希表使用情況

# 前4個數字分別為:當前活動對象數、可用對象總數、每個對象的大小(字節)、包含至少1個活動對象的分頁數
grep conntrack /proc/slabinfo
nf_conntrack_ffffffff81ad9d40    865    918    320   51    4 : tunables    0    0    0 : slabdata     18     18      0
結果

3、查找:當前跟蹤的連接數

sudo sysctl net.netfilter.nf_conntrack_count
cat /proc/net/nf_conntrack | wc -l

4、跟蹤連接詳細信息

cat /proc/net/nf_conntrack
ipv4     2 tcp      6 2 CLOSE src=100.116.203.128 dst=172.16.105.212 sport=62226 dport=8080 src=172.16.105.212 dst=100.116.203.128 sport=8080 dport=62226 [ASSURED] mark=0 zone=0 use=2

------------------------------------------------------

# 記錄格式
# 網絡層協議名、網絡層協議編號、傳輸層協議名、傳輸層協議編號、記錄失效前剩余秒數、連接狀態(不是所有協議都有)

------------------------------------------------------

# 之后都是key=value或flag格式,1行里最多2個同名key(如 src 和 dst),第1次出現的來自請求,第2次出現的來自響應

------------------------------------------------------
結果說明

連接跟蹤調優

  • 計算公式
  • CONNTRACK_MAX(最大幾率的連接條數) = 內存個數*1024*1024*1024/16384/2 = ***
  • Buckets(哈希表大小) = CONNTRACK_MAX/4 = ***(Byte字節)
  • 跟蹤數暫用最內存大小 = CONNTRACK_MAX * 300(Byte字節)= ***(Byte字節)

注:如果不能關掉防火牆,基本思路就是,調大nf_conntrack_buckets和nf_conntrack_max,調小超時時間。
注:除了有關聯的參數,盡量一次只改一處,記下默認值,效果不明顯或更差就還原。

1、哈希表桶大小 調優

注:net.netfilter.nf_conntrack_buckets 不能直接改(報錯)

# 臨時生效
echo 262144 > /sys/module/nf_conntrack/parameters/hashsize
------------------------------------------------------
# 重啟永久生效 新建文件:/etc/modprobe.d/iptables.conf options nf_conntrack hashsize = 32768

2、最大追蹤連接數修改 調優

# 臨時生效
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
suod sysctl -w net.nf_conntrack_max=1048576

------------------------------------------------------

# 永久生效
# 添加修改內核配置文件(/etc/sysctl.conf) 
net.netfilter.nf_conntrack_max=1048576
net.nf_conntrack_max=1048576

# 如果要馬上應用配置文件里的設置:
sudo sysctl -p /etc/sysctl.conf

3、響應時間 調優

# 臨時生效

# 主動方的最后1個狀態。默認120秒
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

# CLOSE_WAIT是被動方收到FIN發ACK,然后會轉到LAST_ACK發FIN,除非程序寫得有問題,正常來說這狀態持續時間很短。#默認 60 秒
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=15

# 理論上不用這么長,不小於 net.ipv4.tcp_keepalive_time 就行了。默認 432000 秒(5天)
sudo sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300

-----------------------------------------------------

# 永久生效
# 修改內核配置文件(/etc/sysctl.conf) 
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.netfilter.nf_conntrack_tcp_timeout_close_wait=15
net.netfilter.nf_conntrack_tcp_timeout_established=300

# 如果要馬上應用配置文件里的設置:
sudo sysctl -p /etc/sysctl.conf

禁用連接跟蹤模塊

注:只要iptables還有規則用到nat和state模塊,就不適合關掉netfilter,否則這些規則會失效。

# 條件舉例
# 關掉netfilter會拿不到狀態,導致每個請求都要從頭到尾檢查一次,影響性能:
# 例如這條默認規則(通常寫在第1條或很靠前的位置):
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

禁用步驟

1、整理確認關閉該模塊后不會影響功能

# 1
# 查找相關模塊
sudo lsmod | egrep "ip_table|iptable|nat|conntrack"

# 2
# 把帶 -t nat 、-m state 的規則都干掉
# 或刪掉 /etc/sysconfig/iptables 里相應內容
# 查看iptables規則
sudo iptables-save

# 3
# 編輯 iptables 配置文件
# 找到 IPTABLES_MODULES ,刪掉跟conntrack有關的模塊(如果有)
sudo vim /etc/sysconfig/iptables-config

# 4
# 停掉iptables
# Centos 6
sudo service iptables stop
# Centos 7
sudo systemctl stop iptables

2、移除相關模塊

sudo rmmod iptable_nat
sudo rmmod ip6table_nat
sudo rmmod nf_defrag_ipv4
sudo rmmod nf_defrag_ipv6
# 移除相關模塊
sudo rmmod nf_nat
sudo rmmod nf_nat_ipv4
sudo rmmod nf_nat_ipv6
sudo rmmod nf_conntrack
sudo rmmod nf_conntrack_ipv4
sudo rmmod nf_conntrack_ipv6
sudo rmmod xt_conntrack

--------------------------

# 開啟相關模塊 
sudo modprobe iptable_nat
sudo modprobe ip6table_nat
sudo modprobe nf_defrag_ipv4
sudo modprobe nf_defrag_ipv6
sudo modprobe nf_nat
sudo modprobe nf_nat_ipv4
sudo modprobe nf_nat_ipv6
sudo modprobe nf_conntrack
sudo modprobe nf_conntrack_ipv4
sudo modprobe nf_conntrack_ipv6
sudo modprobe xt_conntrack

 


免責聲明!

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



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