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