iptables的詳細介紹及配置方法

Firewall(防火牆):組件,工作在網絡邊緣(主機邊緣),對進出網絡數據包基於一定的規則檢查,並在匹配某規則時由規則定義的處理進行處理的一組功能的組件。

防火牆類型:根據工作的層次的不同來劃分,常見的防火牆工作在OSI第三層,即網絡層防火牆,工作在OSI第七層的稱爲應用層防火牆,或者代理服務器(代理網關)。

網絡層防火牆又稱包過濾防火牆,在網絡層對數據包進行選擇,選擇的依據是系統內設置的過濾邏輯,被稱爲訪問控制列表(ACL),通過檢查數據流中每個數據的源地址,目的地址,所用端口號和協議狀態等因素,或他們的咋喝來確定是否允許該數據包通過。

優點:對用戶來說透明,處理速度快且易於維護。

缺點:一旦***突破防火牆,就可以輕易地僞造數據包的源地址,目的地址和IP的端口號,即“IP地址僞造”。

wps_clip_p_w_picpath-32645

包過濾防火牆圖示

代理服務型防火牆(Proxy Service)將所有跨越防火牆的網絡通信鏈路分爲兩段。當代理服務器接收到用戶對某個站點的訪問請求後會檢查該請求是否符合控制規則。如果規則允許,則代理服務器會替用戶去那個站點取回所需要的信息,轉發給用戶。內外網用戶的訪問都是通過代理服務器上的“鏈接”來實現的,從而起到了隔離防火牆內外計算機系統的作用。特點:在應用層對數據進行檢查,比較安全。但是會增加防火牆的負載。

wps_clip_p_w_picpath-13449

代理服務型防火牆圖示

現實生產環境中所使用的防火牆一般都是二者結合體。即先檢查網絡數據,通過之後再送到應用層去檢查。

netfilter組件稱爲內核空間,它被集成在linux內核中。netfilter是一種內核中用於擴展各種網絡服務的結構化底層框架。它是在內核中選取五個位置放了五個hook function,而這五個hook function向用戶開放,用戶可以通過一個工具(iptables)向其寫規則。

netfilter 主要由信息過濾表(table)組成,包含了控制IP包處理的規則集(rules)。根據規則所處理的IP包的類型,規則被分組放在鏈(chain)中,從而使內核對來自某些源,前往某些目的地或具有某些協議類型的信息包處置方法,如完成信息包的處理、控制和過濾等工作。

iptables也稱爲用戶空間,是一個工作在用戶層用來寫規則的工具,寫好的規則被送往netfilter。這些規則告訴內核中的netfilter組件如何去處理信息包。

五個hook function(規則鏈):Input ,Output,Forward,prerouting,postrouting。

filter:Input,Output,Forward

四種處理機制(表):過濾(filter) 主要用於過濾數據包,該表根據管理員預定義的一組規則過濾符 

                    合條件的數據包。filter表是iptables默認的表。

l INPUT:主要與想要進入我們 Linux 本機的數據包有關;

l OUTPUT:主要與我們 Linux 本機所要送出的數據包有關;

l FORWARD:與 Linux 本機比較沒有關係, 他可以傳遞數據包到後臺的計算機中,與下列 nat table 相關性較高。

                    地址轉換(NAT) 主要用於網絡地址轉換,該表可實現一對一。一對多,多對多               

                    等工作,iptables就是使用該表實現共享上網功能。

l PREROUTING:在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)

l POSTROUTING:在進行路由判斷之後所要進行的規則(SNAT/MASQUERADE)

l OUTPUT:與發送出去的數據包包有關

                    包重構(mangle)對指定的數據包進行修改,例如更改TTL和TOS等,實際中很

                    少使用。

                    RAW  很少使用

一條鏈可以包含一條或者數條規則。

nat:prerouting,postrouting,output

mangle:Input ,Output,Forward,prerouting,postrouting。

RAW:prerouting,output

wps_clip_p_w_picpath-28430

                       iptables傳輸數據包的過程

  1   當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。

  2   如果數據包就是進入本機的,數據包就會沿着圖向下移動,到達INPUT鏈。數據包到達INPUT鏈後,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈,然後到達POSTROTING鏈輸出。

  3  如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右移動,經過FORWARD鏈,然後到達POSTROUTING鏈輸出。

wps_clip_p_w_picpath-16702

                      iptables中各表與鏈的相互關係            《鳥哥的私房菜》

書寫規則:

iptables [-t table] command CHAIN [NUM ]   match criteria -j TARGET

CHAIN:  對鏈進行的操作

            -N:new     新建一條鏈

            -X          刪除一條用戶自定義鏈(空鏈)

            -F:flush   清空一條鏈,默認清空表中所有鏈

            -Z:zero    清空計數器,iptables中每條規則默認有兩個計數器,用於記錄本條規則所匹配到的數據包的個數和本條規則所匹配到的數據包的總大小

            -P:policy  定義鏈的默認處理策略

            -E  重命名鏈

RULE:對規則進行的操作

      -A:append   追加,在鏈的最後加一條規則

       -I:insert  插入一條規則  一般使用-I CHAIN NUM 給規則加一個編號。

       -R:replace 替換某條規則,規則被替換並不會改變順序,必須要指定替換的規則編號:-R CHAIN NUM。

       -D:delete  刪除一條規則,可以輸入完整規則,或者直接指定標號加以刪除:-D CHAIN NUM。

LIST:查看

    -L:list 列出鏈中的所有規則

輔助性子命令:-n  numeric 以數字的形式來顯示地址,默認顯示主機名稱

-v  verbose 顯示詳細信息 ,支持-vv  -vvv格式,v越多,信息越詳細。

-x  顯示原有信息,不要做單位換算

--line-numbers  顯示規則的行號

Match Creteria(匹配規則):

基本匹配

     -s,--src,--source  匹配數據包的源地址

     -d,--dst,--destination 匹配數據包的目標地址

     -i, 指定數據包的流入接口(邏輯接口)

     -o, 指定數據包的流出接口

     -p, 做協議匹配 protocol,(tcp|udp|icmp)

擴展匹配:對某一種功能的擴展

      隱含擴展 :對某一種協議的擴展

      -p tcp

        --sport 指定源端口

        --dport 指定目的端口

        --tcp-flags(SYN,ACK,FIN,PSH,URG,RST,ALL,NONE)指定TCP的標誌位

         需要跟兩個標誌位列表,如:SYN,ACK,FIN,RST SYN 第一個列表表示要檢查的位,第二個    

         列表表示第一個列表中出現的位必須爲1,未出現的必須爲0

--syn  只允許新連接

     -p  udp  無連接協議

         --sport   指定源端口

         --dport   指定目的端口

      -p  icmp

          --icmp-type  echo-request,8(ping出去,請求迴應,) echo-reply,0(給予迴應)

     顯式擴展 :額外附加的更多的匹配規則,功能性地擴展

-m state   狀態檢測擴展

        NEW         用戶發起一個全新的請求

        ESTABLISHED 對一個全新的請求進行迴應

        RELATED   兩個完整連接之間的相互關係,一個完整的連接,需要依賴於另一個完整的連接

        INVALID   無法識別的狀態

-m multiport   --sports  22,80,443 指定多個源端口

                    --dports  22,80,443 指定多個目標端口

                    --ports    非連續端口

     -m connlimit   限定併發連接速率

             !--connlimit-above 5  高於五個將拒絕

     -m string   字符串匹配

             --algo bm|kmp 指定算法 

             --string pattern

     -m time  基於時間的匹配

        --timestart

        --timestop

        --days

-j  TARGET    處理動作

     ACCEPT    接受

     DROP      悄悄丟棄,請求端沒有任何迴應

     REJECT    明確拒絕

     SNAT      源地址轉換

     DNAT      目標地址轉換

     REDIRECT  端口重定向

     LOG       將訪問記錄下來

[root@server27 ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination

下面我們寫兩條規則:

只允許192.168.0.0網段的主機通過SSH訪問該主機

允許本機通過SSH連接192.168.0.0網段的其他主機

[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 22 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -d 192.168.0.0/24 -p tcp --sport 22 -j ACCEPT

[root@server27 ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

ACCEPT     tcp  --  192.168.0.0/24       192.168.0.127       tcp dpt:22

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

ACCEPT     tcp  --  192.168.0.127        192.168.0.0/24      tcp spt:22

定義默認策略

[root@server27 ~]# iptables -t filter -P INPUT DROP

[root@server27 ~]# iptables -t filter -P OUTPUT DROP

PS:上面規則一定不要寫錯了,否則你將會把自己拒之門外。

允許本機PING本網段任何主機

[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT   //**出去的數據包

[root@server27 ~]# iptables -t filter -A INPUT -s 0.0.0.0/0.0.0.0 -d 192.168.0.127 -p icmp --icmp-type 0 -j ACCEPT   //** 回來的數據包

[root@server27 ~]# ping 192.168.0.236 -c 4

PING 192.168.0.236 (192.168.0.236) 56(84) bytes of data.

64 bytes from 192.168.0.236: icmp_seq=1 ttl=64 time=0.242 ms

64 bytes from 192.168.0.236: icmp_seq=2 ttl=64 time=0.249 ms

64 bytes from 192.168.0.236: icmp_seq=3 ttl=64 time=0.437 ms

64 bytes from 192.168.0.236: icmp_seq=4 ttl=64 time=0.204 ms

允許本網段任何主機PING本機

[root@server27 ~]# iptables -t filter -A OUTPUT -s 192.168.0.127 -d 0.0.0.0/0.0.0.0 -p icmp --icmp-type 0 -j ACCEPT 

[root@server27 ~]# iptables -t filter -A INPUT -d 192.168.0.127 -s 0.0.0.0/0.0.0.0 -p icmp --icmp-type 8 -j ACCEPT

wps_clip_p_w_picpath-23079

PS:當目標網絡指定爲任意主機時,應該爲0.0.0.0/0.0.0.0

凡是來自192.168.0.0/24網段的主機均使用一個自定義的新鏈

先開啓http服務

自定義一條鏈,拒絕192.168.0.0/24網段的主機對http服務的訪問

[root@server27 ~]# iptables -N attach-input

[root@server27 ~]# iptables -A attach-input -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DROP

[root@server27 ~]# iptables -L -n

wps_clip_p_w_picpath-25333

此時,自定義鏈依舊無法使用,我們只能在固定鏈上做轉發請求數據包到自定義鏈上,才能實現自定義鏈的功能。

[root@server27 ~]# iptables -A INPUT -s 192.168.0.0/24 -j attach-input

[root@server27 ~]# iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

attach-input  all  --  192.168.0.0/24       0.0.0.0/0 

此時已經無法訪問到網頁。

將INPUT鏈刪除之後,馬上又可以訪問了。

[root@server27 ~]# iptables -F INPUT

刪除自定義鏈,先清空鏈,再清空規則

[root@server27 ~]# iptables -F attach-input

[root@server27 ~]# iptables -X attach-input

PS:每條規則都可以使用“!”取反。如: -s '!' 192.168.0.0/24,加單引號防止被識別成其他字符。

下面我們來實現顯式擴展狀態檢測的功能:

先將默認策略置爲DROP

[root@server27 ~]# iptables -P INPUT DROP

[root@server27 ~]# iptables -P OUTPUT DROP

[root@server27 ~]# iptables -P FORWARD DROP

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 80 -j ACCEPT   //*進來的數據包

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 80 -j ACCEPT  //*出去的數據包

但是這兩條規則對於反彈式***是無效的。

我們可以基於顯式擴展寫這樣兩條規則:

[root@server27 ~]# iptables -I INPUT 1 -d 192.168.0.127 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT   //**進來的數據包

[root@server27 ~]# iptables -I OUTPUT  -s 192.168.0.127 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT     //**出去的數據包

刪除我們之前建立的那兩條規則:

[root@server27 ~]# iptables -D INPUT 2

[root@server27 ~]# iptables -D OUTPUT 2

wps_clip_p_w_picpath-2080

此時,已經可以正常訪問http服務。

我們試一下ftp服務:

先開啓ftp服務

先建立這樣四條規則,看看能不能達到效果,

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 20 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 21 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -s 192.168.0.127 -p tcp --sport 20 -j ACCEPT

客戶端請求是被動模式,實驗證明,我們僅僅開始21 20端口無法達到效果。這樣我們就得用到狀態檢測的RELATED機制。

PS:要想實現FTP的訪問需先手動加載額外的模塊:ip_conntrack_ftp,ip_conntrack_tftp,ip_nat_ftp,,ip_nat_tftp(and others)

[root@server27 ~]# modprobe ip_conntrack_ftp

[root@server27 ~]# modprobe ip_nat_ftp

[root@server27 ~]# modprobe ip_nat_tftp

[root@server27 ~]# modprobe ip_conntrack_tftp

實現自動加載的功能:編輯/etc/sysconfig/iptables-config文件,在“IPTABLES_MODULES=”後面寫上要添加的模塊就可以了。

wps_clip_p_w_picpath-27471

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp --dport 21 -j ACCEPT

[root@server27 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT

[root@server27 ~]# iptables -A INPUT -d 192.168.0.127 -p tcp -m state --state RELATED -j ACCEPT

[root@server27 ~]# iptables -R OUTPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT  //**修改上一條規則,增加RELATED狀態

[root@server27 ~]# iptables -R INPUT 3 -d 192.168.0.127 -p tcp  -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT    //**修改INPUT第三條規則,增加NEW,ESTABLISHED狀態

wps_clip_p_w_picpath-21860

此時ftp已經可以訪問了,要保證所有的規則能夠永久有效需要使用:service iptables save來保存。

基於字符串匹配的顯式擴展功能:

[root@server27 ~]# iptables -A  INTPUT  -d 192.168.0.127  -p  tcp  --dport 80 -m string  --algo  kmp  --string  'qq.com'   -j  REJECT 

PS:iptables工作在OSI第三層,第四層。默認情況下,iptables無法限定第七層的應用程序,要想實現限制七層某些應用程序的功能,需要重編譯內核,在內核上打上補丁 layer7。.

源地址換換和目標地址轉換:

PS:源地址轉換必須在POSTROUTING鏈上做。

    目標地址轉換必須在PREROUTING鏈上做。

下面我們來實現源地址的功能:

我們假設這樣一種場景:

wps_clip_p_w_picpath-31021

192.168.0.254是工作在外網的一臺WEB服務器,中間的那臺是企業裏的NAT服務器,我們在上面添加iptables的規則,使其實現地址轉換的功能,PC機是工作在企業內部。我們的最終目的是192.168.80.30這臺計算機通過NAT服務器可以訪問到192.168.0.254的WEB服務。

實驗環境搭建:192.168.0.254  192.168.0.127使用虛擬機網卡的橋接功能;

              192.168.80.129  192.168.080.130使用虛擬機網卡的僅主機功能;

爲PC機設置網關:

[root@station39 ~]# route add default gw 192.168.80.129

下面開始來配置NAT服務器:

首先要開啓NAT服務器的內核路由功能:

[root@server27 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

[root@server27 ~]# cat /proc/sys/net/ipv4/ip_forward

1

設置規則:

[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127

[root@server27 ~]# iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination        

SNAT       all  --  192.168.80.0/24      192.168.0.0/24      to:192.168.0.127

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

OK,我們用192.168.80.130這臺主機訪問一下192.168.0.254,看,已經可以了!

wps_clip_p_w_picpath-20711

只需一條規則就可以搞定,很方便吧!

PS:如果我們使用路由功能來訪問254這臺主機的話,WEB服務器的訪問日誌將記錄的訪問地址是192.168.80.130,而如果我們使用地址轉換的功能來訪問的話,訪問日誌記錄的訪問地址則是192.168.0.127。.

一般我們上網的時候,所獲得的IP都是動態的,怎麼辦?

做源地址轉換的時候,還有一個小功能MASQUERADE(地址僞裝),使用這個功能,我們不需要

指定目標地址,它會自動探測能夠上互聯網的地址,並自動將內網地址轉換過來。缺陷:比較耗費資源。

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

接下來開始實現目標地址轉換功能:

wps_clip_p_w_picpath-1256

場景:假設192.168.80網段爲一個提供WEB服務的網站的內網,中間的爲網站的NAT服務器,遠端的客戶端192.168.0.26想通過中間的NAT服務器來訪問內部的192.168.80.130提供的WEB服務,這裏就要用到目標地址轉換了。

環境搭設:192.168.80.130  192.168.80.129使用虛擬機網卡的僅主機功能

           192.168.0.26  192.168.0.127使用虛擬機網卡的橋接功能

設置192.168.80.130的網關:

[root@station39 ~]# route add default gw 192.168.80.129

開始在NAT服務器上設置規則:

這裏依然要打開內核的路由功能。

開始之前先將剛纔做的源地址轉換實驗的規則給清除了

[root@server27 ~]# iptables -t nat -F

開始寫規則:

[root@server27 ~]# iptables -t nat -A PREROUTING -s 192.168.0.0/24 -d 192.168.0.127 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.130

[root@server27 ~]# iptables -t nat -L -n

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination        

DNAT       tcp  --  192.168.0.0/24       192.168.0.127       tcp dpt:80 to:192.168.80.130

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination      

OK!規則已經寫好了,我們使用192.168.0.26來訪問一下192.168.0.127試試,已經可以訪問了,其實提供WEB服務的是192.168..80.130這臺主機,這就是目標地址轉換的功能。

wps_clip_p_w_picpath-27149

我們再查看一下192.168.80.130這臺WEB服務器的訪問日誌:

wps_clip_p_w_picpath-24338

看,源地址並沒有發生改變!只是訪問的目標地址被轉換到192.168.80.130上來了,這就是目標地址轉換。

l7-filter 七層過濾,對內核打補丁之後,能夠支持對應用層數據的過濾。

編譯過程相對繁瑣一些,也不是本文主要講述內容,所以就不在此詳細說明,有興趣的朋友可以去網上查找相關教程。

編譯完成並啓用內核之後,就可以使用l7filter的過濾功能了。

我們添加這樣兩條規則:

[root@server27 ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.127

[root@server27 ~]# iptables -t nat -A FORWARD -m layer7 --l7proto qq -j REJECT

這裏就不再演示效果了。

保存iptables規則:

/etc/init.d/iptables save

service iptables save

保存位置:在/etc/sysconfig/iptables文件內:

# Generated by iptables-save v1.3.5 on Fri Mar  4 19:44:47 2011

*filter

:INPUT DROP [33:2399]

:FORWARD DROP [0:0]

:OUTPUT DROP [7:540]

-A INPUT -d 192.168.0.127 -p tcp -m tcp --dport 21 -j ACCEPT

-A INPUT -d 192.168.0.127 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

COMMIT

# Completed on Fri Mar  4 19:44:47 2011                    

指定規則保存位置:

iptables-save > /etc/sysconfig/iptables/iptables.20110307

生效保存的規則

iptables-restore < /etc/sysconfig/iptables/iptables.20110307

避免在遠程連接寫規則的時候一不小心自己被防火牆拒之門外,可以寫一個小腳本:

#!/bin/bash

iptables -F

iptables -P  INPUT   ACCEPT

iptables -P  OUTPUT  ACCEPT

at now+10min

測試完成之後停掉腳本就可以了。

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