目标:一、一個SNAT和DNAT的執行個體。
二、SNAT和DNATIptables的原理和指令參數文法
1、IP說明:
eth0: 32.1.38.254(内網) eth1: 192.168.1.254(外網) ——主機名:iptables.wqmsl.com
32.1.38.88 ——防火牆後端客戶機
32.1.38.200——WEB伺服器
2、前期準備
更改主機名稱(更改三處):1、hostname更改,2、hosts更改,3、/etc/sysconfig/network
更改IP位址和dns位址資訊如下:
3、所需軟體包如下
一、下面我們來看一下實驗的總拓撲圖。
我們首先啟動iptables防火牆
設定防火牆為路由模式,編輯/etc/sysctl.conf内net.ipv4.ip_forward = 0值改成1
或者可以修改/proc/sys/net/ipv4/ip_forward的内容為1,但是重新開機之後失效,是以建議還是修改sysctl.conf的參數并更新核心。
更新系統核心參數sysctl -p(一定要用這個參數哦)
此時我們的防火牆已經有路由的功能了
我們直接來做實驗,暫時不講iptables的原理和指令文法了,在實驗結束再說這個。
删除政策
iptables -F:清空所選鍊中的規則,如果沒有指定鍊則清空指定表中所有鍊的規則
iptables -X:清除預設表filter中使用者自定鍊中的規則
iptables -Z:清除預設表filter中使用者自定鍊中的規則
設定預設政策
我使用的ssh連結的伺服器,是以我已經添加了22端口的政策
設定預設政策為關閉filter表的INPPUT及FORWARD鍊,開啟OUTPUT鍊,nat表的三個鍊PREROUTING、OUTPUT、POSTROUTING全部開啟。
下面我們配置SNAT,配置SNAT指令基本文法
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 192.168.1.254 外網接口為固定IP
iptables -t nat -A POSTROUTING -o eth1 -s 32.1.38.0/24 -j MASQUERADE ——用于外網接口為動态IP位址,如ppoe接入方式。
解析:
iptables 是指令本身
-t 是執行表,iptables有兩個表,一個是filter:過濾的表
一個是nat,就是NAT表
然後-A,-A的意思就是添加一條鍊
這裡添加的鍊是POSTROUTING鍊,就是源NAT
-o 是出去的公網的網卡裝置,我們使用的是eth1網卡
-s 是源位址,我們設定内網的192.168.8.0/24網段
-j是動作,MASQUERADE 動态源位址轉換(動态IP的情況下使用)
如果我們使用的靜态外網位址,就可以這樣寫
下面設定一下FORWARD的rule,允許後端主機查詢DNS和浏覽網頁,規則如下:
這是一個基本的上網規則,最後來年兩條我們在最後講解,它是一個跟蹤狀态的規則,主要是因為我們去用目的為53端口去查詢DNS記錄的時候,伺服器傳回的資訊并不是也是53端口,它是1024—65535直接的任意端口,是以使用跟蹤狀态會友善一些。
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
有時我們會進行網絡測試,這時我們要允許echo-reply(報頭代碼為0)進入我們的防火牆
這時我們從防火牆可以ping任意位址,但是其他主機是ping不通我們的防火牆,尤其是針對外網,讓外網使用者不知道我們的存在,一般我們是直接拒絕,或者是丢棄icmp封包代碼為8的icmp包,這樣就不回應外部主機的ping請求了。
内部ping一下防火牆,傳回逾時了。
我們在防火牆上面ping後端主機和外網主機,如下圖,完全是可以的
我們在外網主機上面ping一下防火牆試試,也是傳回逾時
因為後端主機屬于内網,我們經常會用來測試和網關是否已經連通,是以我們加一條政策,允許内部主機ping網關(eth0網卡),因為後端主機屬于可信賴區域,是以,你可以添加政策允許所有資料從eth0進入(INPUT),我這裡就開啟關鍵的幾個端口和協定,例如:22端口、icmp等其他的拒絕掉。
如上圖添加這條政策後,後端主機就可以去ping自己的網關了
以上的操作完成之後,後端主機應該是可以上網了,我們去試試
在後端主機是完全可以解析到網際網路位址的
如果需要接收郵件還需要開啟如下的端口,-m multiport 比對多個端口
iptables -A FORWARD -p tcp -m multiport --dport 25,110,143,993,995 -j ACCEPT
我更改一下POSTROUTING的規則,使其外接口為動态IP位址
為了模拟ppoe/dhcp的動态IP,我手動更改一下IP位址試試看後端主機是不是還能夠上網
IP 改為192.168.1.45,但還是沒有任何影響,可以正常上網
這裡有一點要注意的就是:MASQUERADE和SNAT作用一樣的,都是提供源位址轉換的操作,MASQUERADE是針對外部接口為動态IP位址來設定滴,不需要使用--to-source指定轉換的IP位址。如果網絡采用的動态擷取IP位址的連接配接,比如ADSL撥号、DHCP連接配接等,那麼建議使用MASQUERAD
還有需要注意的一點就是,我們使用ppoe和DHCP接入網際網路的時候不要在網絡接口的配置檔案、network檔案裡寫上網關,否則肯能會出現兩個網關,容易出錯。
下面要做的就是DNAT
我們内部有一個WEB伺服器,外網使用者需要通路,其實就是内網釋出伺服器到網際網路,此時就需要做DNAT了,一條指令就搞定哦
配置DNAT指令基本文法
iptables -t nat -A PREROUTING -i 網絡接口 -p 協定 --dport 端口 -j DNAT --to IP位址:端口
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 32.1.38.200:80
eth1為防火牆公網接口,這個規則必須在PREROUTING裡的
如果要求與 80 聯機的封包轉遞到 内網8080 這個 port的話,添加如下政策
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
例如:使用 8080 這個 port 來啟動 WWW ,但是别人都以 port 80 來聯機,是以,這樣可以使用上面的方式來将對方對您防火牆的聯機傳遞到内網的8080 端口WEB伺服器了。
添加政策後,看看現有的政策:
在内網客戶機通路内部WEB伺服器的網站,直接使用的是内部WEB伺服器的IP位址
我們在外網通路,這個時候我們通路的位址應該是防火牆的eth1(外部網卡)的位址,我們這裡不涉及DNS,是以就直接用IP位址來通路,如下:我在IP為192.168.1.88的主機上通路,可以成功的通路内部WEB伺服器,說明我的内部WEB伺服器釋出成功了
儲存iptables配置
iptables-save
重定向規則到nat.ipt檔案
iptables-save > nat.ipt
恢複iptables配置
iptables-restore < nat.ipt
服務或系統重新開機後依然生效
service iptables save
下面說一下icmp協定中的ping
ICMP類型:echo reply 響應應答——0 ping 其他主機的時候傳回來的資訊
echo request 響應請求——8 其他主機ping本機的時候對其他主機的響應回答,一般隐藏此類封包,公網主機不知道我們的存在
到這裡我們的DNAT和SNAT的實驗都做完了
*******************************************************************************
二、Iptables的原理和指令參數文法
以下内容來自網際網路資料進行整理合并,非本人原創
Iptables原理
現在防火牆主要分以下三種類型:包過濾、應用代理、狀态檢測
包過濾防火牆:現在靜态包過濾防火牆市面上已經看不到了,取而代之的是動态包過濾技術的防火牆
代理防火牆:因一些特殊的封包攻擊可以輕松突破包過濾防火牆的保護,比如大家知道的SYN攻擊、ICMP洪水攻擊,是以以代理伺服器作為專門為使用者保密或者突破通路限制的資料轉發通道的應用代理防火牆出現了哈~其使用了一種應用協定分析的新技術。
狀态檢測防火牆:其基于動态包過濾技術發展而來,加入了一種狀态檢測的子產品,進一點發展了會話過濾功能,會話狀态的保留是有時間限制的,此防火牆還可以對包的内容進行分析,進而避免開放過多的端口。
netfilter/iptables IP資料包過濾系統實際上由netfilter和iptables兩個元件構成。netfilter是內建在核心中的一部分,其作用是定義、儲存相應的規則,而iptables是一種工具,用來修改資訊的過濾規則及其他配置,我們可以通過iptables來設定一些适合我們企業需求環境的規則哈~,而這些規則會儲存在核心空間之中。
netfilter是Linux核心中的一個通用架構,其提供了一系列的表(tables),每個表由若幹個鍊(chains)組成,而每條鍊可以由一條或若幹條規則(rules)組成。實際上netfilter是表的容器,表是鍊的容器,而鍊又是規則的容器。
filter 表的系統 chain: INPUT,FORWAD,OUTPUT
<a href="http://img1.51cto.com/attachment/200903/28/27212_12382278846jlc.png"></a>
nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT
<a href="http://img1.51cto.com/attachment/200903/28/27212_1238227885nAwx.png"></a>
mangle 表的系統 chain: PREROUTING,OUTPUT
<a href="http://img1.51cto.com/attachment/200903/28/27212_1238227885jxF0.png"></a>
filter:主要跟 Linux 本機有關,這個是預設的 table !
INPUT:主要與封包想要進入我們 Linux 本機有關,過路由表後目的地為本機
OUTPUT:主要與我們 Linux 本機所要送出的封包有關;
FORWARD:這個咚咚與 Linux 本機比較沒有關系,他可以封包『轉遞』到後端的計算機中,與 nat 這個 table 相關性很高。
nat:這個表格主要在用作來源與目的之 IP 或 port 的轉換, 與 Linux 本機較無關,主要與 Linux 主機後的區域網路絡内的計算機較有相關。
PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT),就是資料包進入路由表之前
POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE),發送到出口網卡接口之前
OUTPUT:與發送出去的封包有關,:由本機産生,向外轉發
mangle:這個表格主要是與特殊的封包的路由旗标有關
早期僅有 PREROUTING 及 OUTPUT 鍊,不過從 kernel 2.4.18 之後加入了 INPUT 及 FORWARD 鍊。 由于這個表格與特殊旗标相關性較高,是以像咱們這種單純的環境當中,較少使用 mangle 這個表格。
各個與鍊的相關性可以使用下圖來表示:
mangle不常使用,是以我們去掉它之後的示意圖如下:
SNAT, DNAT 的封包傳送解析
SNAT 主要是應付内部 LAN 連接配接到 Internet 的使用方式,至于 DNAT 則主要用在内部主機想要架設可以讓 Internet 存取的伺服器,實際上就是釋出内網的伺服器到公網上。
下面看一下SNAT和DNAT的工作的原理和過程
SNAT封包傳出示意圖:
如上圖所示,在用戶端 192.168.1.100 這部主機要聯機到 http://tw.yahoo.com 去時,他的封包表頭會如何變化?
1. 用戶端所發出的封包表頭中,來源會是 192.168.1.100 ,然後傳送到 NAT 這部主機;
2. NAT 這部主機的内部接口 (192.168.1.2) 接收到這個封包後,會主動分析表頭資料, 因為表頭
資料顯示目的并非 Linux 本機,是以開始經過路由, 将此封包轉到可以連接配接到 Internet 的
Public IP 處;
3. 由于 private IP 與 public IP 不能互通,是以 Linux 主機透過 iptables 的 NAT table 内的
Postrouting 鍊将封包表頭的來源僞裝成為 Linux 的 Public IP ,并且将兩個不同來源
(192.168.1.100 及 public IP) 的封包對應寫入暫存記憶體當中, 然後将此封包傳送出去了。
SNAT封包接受(傳回)示意圖:
4. 在 Internet 上面的主機接到這個封包時,會将響應資料傳送給那個 Public IP 的主機;
5. 當 Linux NAT 主機收到來自 Internet 的響應封包後,會分析該封包的序号,并比對剛剛記錄到
記憶體當中的資料, 由于發現該封包為後端主機之前傳送出去的,是以在 NAT Prerouting 鍊中,
會将目标 IP 修改成為後端主機,亦即那部 192.168.1.100,然後發現目标已經不是本機 (public
IP), 是以開始透過路由分析封包流向;
6. 封包會傳送到 192.168.1.2 這個内部接口,然後再傳送到最終目标 192.168.1.100 機器上去!
DNAT封包傳送示意圖:
假設我的内部主機 192.168.1.210 啟動了 WWW 服務,這個服務的 port 開啟在 port
80 , 那麼 Internet 上面的主機 (61.xx.xx.xx) 要如何連接配接到我的内部伺服器呢?當然啦, 還是得要透過 Linux NAT 主機!是以這部 Internet 上面的機器必須要連接配接到我們的 NAT 的 public IP 才行。
1.外部主機想要連接配接到目的端的 WWW 服務,則必須要連接配接到我們的 NAT 主機上頭;
2.我們的 NAT 主機已經設定好要分析出 port 80 的封包,是以當 NAT 主機接到這個封包後, 會将目标 IP 由 public IP 改成 192.168.1.210 ,且将該封包相關資訊記錄下來,等待内部伺服器的響應;
3.上述的封包在經過路由後,來到 private 接口處,然後透過内部的 LAN 傳送到192.168.1.210 上頭!
4. 192.186.1.210 會響應資料給 61.xx.xx.xx ,這個回應當然會傳送到 192.168.1.2 上頭去;
5. 經過路由判斷後,來到 NAT Postrouting 的鍊,然後透過剛剛第二步驟的記錄,将來源 IP 由 192.168.1.210 改為 public IP 後,就可以傳送出去了!
下圖為iptables的文法圖:
IPTABLES 文法:
iptables從其使用的三個表(filter、nat、mangle)而得名,
對包過濾隻使用 filter 表, filter還是預設表,無需顯示說明.
操作指令: 即添加、删除、更新等。
鍊:對于包過濾可以針對filter表中的INPUT、OUTPUT、FORWARD鍊,也可以操作使用者自定義的鍊。
規則比對器:可以指定各種規則比對,如IP位址、端口、包類型等。
目标動作:當規則比對一個包時,真正要執行的任務,
常用的有: ACCEPT 允許包通過 、 DROP 丢棄包
一些擴充的目标還有:
REJECT 拒絕包,丢棄包同時給發送者發送沒有接受的通知
LOG 包有關資訊記錄到日志
TOS 改寫包的TOS值
常用操作指令:
-A 或 -append 在所選鍊尾加入一條或多條規則
-D 或 -delete 在所選鍊尾部删除一條或者多條規則
-R 或 -replace 在所選鍊中替換一條比對規則
-I 或 -insert 以給出的規則号在所選鍊中插入一條或者多條規則. 如果規則号為1,即在鍊頭部.
-L 或 -list 列出指定鍊中的所有規則,如果沒有指定鍊,将列對外連結中的所有規則.
-F 或 -flush 清除指定鍊和表中的所由規則, 假如不指定鍊,那麼所有鍊都将被清空.
-N 或 -new-chain 以指定名建立一條新的使用者自定義鍊,不能與已有鍊名相同.
-X 或 -delete-chain 删除指定的使用者定義簾,必需保證鍊中的規則都不在使用時才能删除,若沒有指定鍊,則删除所有使用者鍊.
-P 或 -policy 為永久簾指定預設規則(内置鍊政策),使用者定義簾沒有預設規則,預設規則也使規則鍊中的最後一條規則,用-L顯示時它在第一行顯示.
-C 或 -check 檢查給定的包是否與指定鍊的規則相比對.
-Z 或 -zero 将指定簾中所由的規則包位元組(BYTE)計數器清零.
-h 顯示幫助資訊.
******************************************************************************
常用比對規則器:
-p , [!] protocol 指出要比對的協定,可以是tcp, udp, icmp, all, 字首!為邏輯非,表示除該協定外的所有協定.
-s [!] address[/mask] 指定源位址或者位址範圍.
-sport [!] port[:port] 指定源端口号或範圍,可以用端口号也可以用/ETC/SERVICES檔案中的名子.
-d [!] address[/mask] 指定目的位址或者位址範圍.
-dport [!] port[:port] 指定目的端口号或範圍,可以用端口号也可以用/ETC/SERVICES檔案中
的名子.
-icmp-type [!] typename 指定比對規則的ICMP資訊類型(可以使用 iptables -p icmp -h 檢視有效的ICMP類型名)
-i [!] interface name[+] 比對單獨或某種類型的接口,此參數忽略時,預設符合所有接口,接口可以使用"!"來比對捕食指定接口來的包.參數interface是接口名,如 eth0, eht1, ppp0等,指定一個目前不存在的接口是完全合法的,規則直到接口工作時才起作用,折中指定對于PPP等類似連接配接是非常有用的."+"表示比對所有此類型接口.該選項隻針對于INPUT,FORWARD和PREROUTING鍊是合法的.
-o [!] interface name[+] 比對規則的對外網絡接口,該選項隻針對于OUTPUT,FORWARD,POSTROUTING鍊是合法的.
[!] --syn 僅僅比對設定了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP連接配接.阻止從接口來的這樣的包将會阻止外來的TCP連接配接請求.但輸出的TCP連接配接請求将不受影響.這個參數僅僅當協定類型設定為了TCP才能使用. 此參數可以使用"!"标志比對已存在的傳回包,一般用于限制網絡流量,即隻允許已有的,向外發送的連接配接所傳回的包.
如何制定永久規則集:
/etc/sysconfig/iptables 檔案是 iptables 守護程序調用的預設規則集檔案.
可以使用以下指令儲存執行過的IPTABLES指令:
/sbin/iptables-save > /etc/sysconfig/iptables
要恢複原來的規則庫,可以使用:
/sbin/iptables-restore &lt; /etc/sysconfig/iptables
iptables指令和route等指令一樣,重新開機之後就會恢複,是以:
[root@rhlinux root]# service iptables save
将目前規則儲存到 /etc/sysconfig/iptables: [ 确定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啟動腳本,是以:
[root@rhlinux root]# /etc/rc.d/init.d/iptables save
以上幾種方法隻使用某種即可.
若要自定義腳本,可直接使用iptables指令編寫一個規則腳本,并在啟動時執行:
例如若規則使用腳本檔案名/etc/fw/rule, 則可以在/etc/rc.d/rc.local中加入以下代碼:
if [-x /etc/fw/rule]; then /etc/fw/sule; fi;
這樣每次啟動都執行該規則腳本,如果用這種方法,建議NTSYSV中停止IPTABLES.
執行個體:
鍊基本操作:
# iptables -L -n
(列出表/鍊中的所有規則,包過濾防火牆預設使用的是filter表,是以使用此指令将列出filter表中所有内容,-n參數可加快顯示速度,也可不加-n參數。)
iptables -F
(清除預設表filter中所有規則鍊中的規則)
iptables -X
(清除預設表filter中使用者自定義鍊中的規則)
ptables -Z
(将指定鍊規則中的所有包位元組計數器清零)
設定鍊的預設政策,預設允許所有,或者丢棄所有:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
(以上我們在不同方向設定預設允許政策,若丢棄則應是DROP,嚴格意義上防火牆應該是DROP然後再允許特定)
向鍊中添加規則,下面的例子是開放指定網絡接口(信任接口時比較實用):
# iptables -A INPUT -i eth1 -j ACCEPT
# iptables -A OUTPUT -o eth1 -j ACCEPT
# iptables -A FORWARD -i eth1 -j ACCEPT
# iptables -A FORWARD -o eth1 -j ACCEPT
使用使用者自定義鍊:
# iptables -N brus
(建立一個使用者自定義名叫brus的鍊)
# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鍊中設定了一條規則)
# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向預設的INPUT鍊添加一條規則,使所有包都由brus自定義鍊處理)
基本比對規則執行個體:
比對協定:
iptables -A INPUT -p tcp
(指定比對協定為TCP)
iptables -A INPUT -p ! tcp
(指定比對TCP以外的協定)
比對位址:
iptables -A INPUT -s 192.168.1.1
(比對主機)
iptables -A INPUT -s 192.168.1.0/24
(比對網絡)
iptables -A FORWARD -s ! 192.168.1.1
(比對以外的主機)
iptables -A FORWARD -s ! 192.168.1.0/24
(比對以外的網絡)
比對接口:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(比對某個指定的接口)
iptables -A FORWARD -o ppp+
(比對所有類型為ppp的接口)
比對端口:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(比對單一指定源端口)
iptables -A INPUT -p ucp --dport 53
(比對單一指定目的端口)
iptables -A INPUT -p ucp --dport ! 53
(指定53端口以外)
iptables -A INPUT -p tcp --dport 22:80
(指定端口範圍,這裡我們實作的是22到80端口)
指定IP碎片的處理:
# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
設定擴充的規測比對:
(希望獲得比對的簡要說明,可使用: iptables -m name_of_match --help)
多端口比對擴充:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(比對多個源端口)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(比對多個目的端口)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(比對多個端口,無論是源還是目的端口)
TCP比對擴充:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的标志都要被檢查,但是隻有設定了SYN的才比對)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的标志都被檢查,但是隻有設定了SYN和ACK的才比對)
iptables -p tcp --syn
(選項--syn是以上的一種特殊情況,相當于“--tcp-flags SYN,RST,ACK SYN”的簡寫)
limit速率比對擴充:
# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時允許通過300個資料包)
# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(預設為5),用來比對瞬間大量資料包的數量。)
(上面的例子用來比對一次同時湧入的資料包是否超過十個,超過此上限的包将直接被丢棄)
# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻通過,平均每分鐘3個,那麼觸發值burst保持為3。如果每分鐘通過的包的數目小于3,那麼觸發值busrt将在每個周期(若每分鐘允許通過3個,則周期數為20秒)後加1,但最大值為3。每分鐘要通過的包數量如果超過3,那麼觸發值busrt将減掉超出的數值,例如第二分鐘有4個包,那麼觸發值變為2,同時4個包都可以通過,第三分鐘有6個包,則隻能通過5個,觸發值busrt變為0。之後,每分鐘如果包數量小于等于3個,則觸發值busrt将加1,如果每分鐘包數大于3,觸發值busrt将逐漸減少,最終維持為0)
(即每分鐘允許的最大包數量等于限制速率(本例中為3)加上目前的觸發值busrt數。任何情況下,都可以保證3個包通過,觸發值busrt相當于是允許額外的包數量)
基于狀态的比對擴充(連接配接跟蹤):
每個網絡連接配接包括以下資訊:源和目的位址、源和目的端口号,稱為套接字對(cocket pairs);協定類型、連接配接狀态(TCP協定)和逾時時間等。防火牆把這些叫做狀态(stateful)。能夠監測每個連接配接狀态的防火牆叫做狀态寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在自己的記憶體中維護一個跟蹤連接配接狀态的表,是以擁有更大的安全性。
其指令格式如下:
iptables -m state --state [!] state [,state,state,state]
state表示一個用逗号隔開的的清單,用來指定的連接配接狀态可以有以下4種:
NEW:該包想要開始一個連接配接(重新連接配接或将連接配接重定向)。
RELATED:該包屬于某個已經建立的連接配接所建立的新連接配接。例如FTP的資料傳輸連接配接和控制連接配接之間就是RELATED關系。
ESTABLISHED:該包屬于某個已經建立的連接配接。
INVALID:該包不比對于任何連接配接,通常這些包會被DROP。
例如:
# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(比對已經建立的連接配接或由已經建立的連接配接所建立的新連接配接。即比對所有的TCP回應包)
# iptables -A INPUT -m state --state NEW -i ! eth0
(比對所有從非eth0接口來的連接配接請求包)
下面是一個被動(Passive)FTP連接配接模式的典型連接配接跟蹤
# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP連接配接模式的典型連接配接跟蹤
# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
日志記錄:
格式為: -j LOG --log-level 7 --log-prefix "......"
# iptables -A FORWARD -m tcp -p tcp -j LOG
# iptables -A FORWARD -m icmp -p icmp -f -j LOG
# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"
本文轉自 wqmsl 51CTO部落格,原文連結:http://blog.51cto.com/wqmsl/404283,如需轉載請自行聯系原作者