iptables詳解

一: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


                

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章