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
狀態查看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
注:若是不能關掉防火牆,基本思路就是,調大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