Linux 跟蹤鏈接netfilter 調優

Netfilter介紹linux

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

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


主要參數介紹tcp

# 哈希表大小(只讀)(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

狀態查看ide

一、查找:buckets哈希表大小,max最大概率的鏈接條數性能

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

二、查找:哈希表使用狀況spa

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

3、查找:當前跟蹤的鏈接數.net

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

4、跟蹤鏈接詳細信息3d

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次出現的來自響應

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

鏈接跟蹤調優code

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

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

一、哈希表桶大小 調優

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

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

二、最大追蹤鏈接數修改 調優

# 臨時生效
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

三、響應時間 調優

# 臨時生效

# 主動方的最後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
# 查找相關模塊
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

二、移除相關模塊

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
相關文章
相關標籤/搜索