一:iptables工作機制
iptables實際上是用戶空間上配置與修改過濾規則的命令,生成的規則保存在linux內核空間netfilter中,netfilter是Linux核心中的一個通用架構,其提供了一系列的表(tables),每個表由若干個鏈(chains)組成,而每條鏈可以由一條或若干條規則(rules)組成。實際上netfilter是表的容器,表是鏈的容器,而鏈又是規則的容器,netfilter有四張表:filter、nat、mangle、raw。filter表有INPUT、OUTPUT、FILTER三條鏈,nat表PREROUTING、OUTPUT、POSTROUTING三條鏈,mangle表有PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING五條鏈,raw表有PREROUTING、OUTPUT兩條鏈。
數據包經過網卡進入內核空間內TCP/IP協議棧(netfilter hook)時,由netfilter hook內部的五條規則鏈(PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING)進行匹配,然後路由決策
二:基本命令解釋(一定要注意大小寫)
1.命令格式:
iptables [-t 表] 命令 鏈名 [序號] 匹配標準 -j 處理方法
命令(大寫):
-A 新增 (不需要序號)
-D 刪除(如果未添加序號,則同-A用法,若添加了序號,則使用iptables -D 鏈名 序號)
-R 替代(此時需要添加序號)
-I 插入(如果添加序號則插入指定序號的規則,否則會插入爲第1條規則)
鏈名(大寫):PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
匹配標準(小寫):-s(源ip)、-d(目的ip)、-p(定義tcp/udp)、-i(進網卡名)、-o(出網卡名)等
處理方法(大寫):ACCEPT(接受)、DROP(丟棄)、REJECT(拒絕)、DNAT(目標地址轉換)、 SNAT(源地址轉換)、LOG(日誌)
2.鏈的管理:(如果沒有添加‘-t 表’,那麼iptables默認配置的是filter表)
-F[CHAIN]:flush 清空指定規則鏈,如果省略chain則清除對應表中的所有鏈
-X[CHAIN]:清除自定義鏈,默認鏈無法刪除,如果省略chain則清除對應表中的所有自定義鏈
-Z[CHAIN]:清除鏈匹配計數器
-P CHAIN ACCEPT/DROP:設定指定鏈的默認策略
-L [-n -vv -x --line-numbers] :顯示iptables規則鏈,具體解釋如下
-n: 以數字格式顯示主機地址和端口號;
-v: 顯示鏈及規則的詳細信息
-vv: 顯示鏈及規則的更詳細信息
-x: 顯示計數器的精確值
--line-numbers: 顯示規則號碼
三:常用配置實例
iptables -F
#清除nat表的規則鏈
iptables -X
#清除nat表的自定義鏈
iptables -Z
#清除nat表的計數器
iptables -P INPUT DROP
#配置nat表INPUT鏈默認處理方式爲丟棄
iptables -P OUTPUT ACCEPT
#配置nat表OUTPUT鏈默認處理方式爲放行
iptables -A INPUT -m limit --limit 30/minute --limit-burst 40-j DROP
#初始連接池有40個,使用完後限制每分鐘只能新增連接30個,
iptables -A INPUT -m connlimit --connlimit-above 10 -j DROP
#配置單個ip併發訪問數爲10,這樣會誤傷使用NAT上網的用戶
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
#配置單個端口訪問情況,需要添加-p參數
iptables -A INPUT -p tcp --dport 8080:8090 -j ACCEPT
#配置連續端口訪問情況,需要添加-p參數
iptables -A INPUT -p tcp -m multiport --destination-ports 21,22,80 -j ACCEPT
#配置多端口訪問情況,需要添加-p參數
iptables -A INPUT -m state --state established -j ACCEPT
#配置訪問狀態規則
四:配置路由轉換
當服務器只有一張網卡時,利用別名設置一外網ip與一內網ip共兩ip,可以不設置ip_forward ,直接爲兩網進行路由轉換,內網段的主機需要將默認網關設置爲此服務器對應的內網IP。
當服務器有兩種網卡時,分別設置兩IP(一網卡配置爲內網ip,一網卡配置爲外網ip),則需要設置ip_forward,內網主機將默認網關設置爲此服務器內網ip。
實例:
1.iptables -t nat -A POSTROUTING -s 172.16.100.0/24 -j SNAT --to-source 192.168.1.114
注:此條規則配置在表nat上的POSTROUTING鏈上,使用源地址轉換,將內網源地址爲172網段主機,映射到ip 192.168.1.114
2.iptables -t nat -A PREROUTING -d 192.168.1.114 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.7[:8080]
注:此條規則配置在表nat上的PREROUTING鏈上,使用目標地址轉換,將目標地址爲192.168.1.114,端口爲80的包轉發到內網172.16.100.7,端口爲8080的主機上
五:高併發網站下防火牆優化
ip_conntrack(centos5)與nf_conntrack(centos6)開啓時,即使用nat表或者使用state狀態規則,系統會在內存維持狀態跟蹤表來記錄每一個訪問ip的狀態,這對高併發網站很危險,可能會出現"table full, dropping packet",解決方式修改內核參數:
net.netfilter.nf_conntrack_max = 1048576
#狀態跟蹤表的最大行數的設定,理論最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
參考網址:
http://my.oschina.net/kisops/blog/150995