天天看點

linux下iptables防火牆詳解

linux下iptables防火牆詳解

Linux網絡防火牆基礎知識

工作在主機或網絡的邊緣,對于進出的資料封包按照事先定義好的規則中的比對标準進行檢查,并做出對應的處理辦法的機制稱作防火牆。

 IP封包首部:主要包含源IP,目标IP

 TCP封包首部:主要包含源端口,目标端口,标志位SYN,ACK,RST,FIN

比對标準解釋:

 IP: 源IP,目标IP

 TCP: 源端口,目标端口         

 TCP三向交握三個階段表示:     

   第一階段:  SYN=1,FIN=0,RST=0,ACK=0;  

   第二階段: SYN=1,ACK=1,FIN=0,RST=0; 

   第三階段: ACK=1,SYN=0,RST=0,FIN=0(ESTABLISHED)

 UDP: 源端口,目标端口 

 ICMP:icmp-type  0 表示echo-reply, 8 表示echo-request

2.Iptables防火牆分為四個表五個鍊

 四個表:filter,nat,mangle,row

 五個鍊:PREROUTING,INPUT,FORWORD,OUTPUT,POSTROUTING

 filter(過濾表):可應用于此3個規則鍊INPUT,OUTPUT,FORWARD

 nat(位址轉換表):可應用于此3個規則鍊PREROUTING,OUTPUT,POSTROUTING

 mangle(拆開/修改/封裝等表):可應用于此5個規則鍊,如下:                               PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

 raw(與mangle相反保留資料封包源有格式):可應用于此2個規則鍊PREROUTING,OUTPUT

 注意:iptabels :可以使用自定鍊,但隻在被調用時才能發揮作用

          可以删除自定義的空鍊,但預設鍊無法删除

          每個規則鍊都有兩個内置的計數器:被比對的封包個數和被比對的封包大小之和

3.iptables指令:

 格式:  iptables [-t 表] 指令 鍊 [num] 比對标準 -j 處理辦法

3.1.比對标準:分為通用比對和擴充比對,而擴充比對又分為隐含擴充和顯式擴充

(1).通用比對:

  -s, --src: 指定源位址

  -d, --dst:指定目标位址

  -p {tcp|udp|icmp}:指定協定

  -i 網絡接口: 指定資料封包流入的接口

  -o 網絡接口: 指定資料封包流出的接口

(2).擴充比對:

 (2.1).隐含擴充:不用特别指明由哪個子產品進行的擴充,因為此時使用-p {tcp|udp|icmp}

 -p tcp

   --sport PORT[-PORT]: 源端口

   --dport PORT[-PORT]: 目标端口

   --tcp-flags mask comp: 隻檢查mask指定的标志位(逗号分隔),comp清單中出現的标記位必須為                   1,comp中沒出現,而mask中出現的,必須為0;例如:

        --tcp-flags SYN,FIN,ACK,RST SYN = --syn

   --syn

 -p icmp  --icmp-type  [0: echo-reply  8: echo-request]

 -p udp  --sport 或 --dport

 (2.2).顯式擴充: 必須指明由哪個子產品進行的擴充,在iptables中使用-m選項可完成此功能

     格式:-m 擴充 指定擴充類型 其他選項值

   (2.2.1).狀态擴充: -m state 結合ip_conntrack追蹤會話的狀态

     NEW: 新連接配接請求

     ESTABLISHED:已建立的連接配接

     INVALID:非法連接配接

     RELATED:相關聯的

    例如: -m state --state NEW,ESTABLISHED -j ACCEPT

   (2.2.2).離散的多端口比對擴充:-m multiport

   --source-ports      #将多個不連續源端口寫在一條iptables語句中

   --destination-ports  #将多個不連續目标端口寫在一條iptables語句中

    --ports将多個不連續端口(含源端口和目标端口)寫在一條iptables語句中

    例如:-m multiport --destination-ports 21,22,80 -j ACCEPT

   (2.2.3).連續的IP位址範圍擴充:-m iprange

    --src-range

    --dst-range

    例如: -m iprange --src-range 1.1.1.2-1.1.1.9 --dport 22  -j ACCEPT

iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.3-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

    (2.2.4).連接配接數限制:-m connlimit

     ! --connlimit-above n :通常用戶端達到連接配接數上限n拒絕,取反小于n才放行

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 2 -j ACCEPT

    (2.2.5).機關時間響應限制:-m limit

         --limit RATE: 每個機關時間内響應的平均個數

         --limit-burst n :首次第一批響應個數

      例如:-m limit --limit 5/miniute --limit-burst 10

    (2.2.6).比對字元串限制:-m string

     --algo {bm|kmp}

     --string "STRING"

    例如:-m string --algo kmp --sting "abcd" -j REJECT

iptables -I OUTPUT -d 1.1.1.19 -m string --algo kmp --sting "abcd" -j REJECT

條件取反:!  例如:-s ! 172.16.1.1,表示比對除172.16.1.1外所有源IP位址

3.2.指令:

管理規則

 -A:附加一條規則,添加在鍊的尾部

 -I CHAIN [num]: 插入一條規則,插入為對應CHAIN上的第num條;

 -D CHAIN [num]: 删除指定鍊中的第num條規則;

 -R CHAIN [num]: 替換指定的規則;

例如:iptables -D INPUT 2 #删除INPUT鍊中第2條規則

管理鍊:

 -F [CHAIN]:flush,清空指定規則鍊,如果省略CHAIN,則可以實作删除對應表中的所有鍊

 -P CHAIN: 設定指定鍊的預設政策;

 -N:自定義一個新的空鍊

 -X: 删除一個自定義的空鍊

 -Z:清除指定鍊中所有規則的計數器;

 -E: 重命名自定義的鍊;

例如:iptables -P INPUT DROP #将INPUT鍊預設政策為拒絕

檢視類:

 -L: 顯示指定表中的規則;

 -n: 以數字格式顯示主機位址和端口号;

 -v: 顯示鍊及規則的詳細資訊,或用-vv,-vvv

 -x: 顯示計數器的精确值

 --line-numbers: 顯示規則号碼

例如:iptables -L -n #檢視目前INPUT鍊中現有規則

3.3.處理辦法: -j (TARGET)

 ACCEPT:放行

 DROP:丢棄

 REJECT:拒絕,彈回資訊

 DNAT:目标位址轉換,常應用于PREROUTING

 SNAT: 源位址轉換, 常應用于POSTROUTING

 REDIRECT:端口重定向

 MASQUERADE:位址僞裝,常應用于ADSL撥号等動态擷取IP場景

 MARK:打标記

 RETURN:新增鍊傳回主鍊處理

 CHAIN:主鍊調用新增鍊

 LOG:日志

   --log-prefix "STRING"

例如:iptables -I INPUT -d 1.1.1.19 -p icmp  -j LOG --log-prefix "firewall log--"

4.iptables不是服務,但有服務腳本,主要作用在于管理儲存的規則

# service iptables save  并儲存在此檔案中:/etc/sysconfig/iptables

 service iptables stop  清除并移除iptables相關子產品

 service iptatbles start 加載iptables相關子產品

# iptables-save > /etc/sysconfig/iptables.bak

# iptables-restore < /etc/sysconfig/iptables.bak

裝載及移除iptables/netfilter相關的核心子產品;

iptables_nat, iptables_filter, iptables_mangle, iptables_raw, ip_nat, ip_conntrack

5.僅允許1.1.1.0/24網段上能ssh通路1.1.1.19主機,請在1.1.1.19linux主機上寫出對應iptables

 iptables -t filter -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p tcp --dport 22 -j ACCEPT

 iptables -t filter -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p tcp --sport 22 -j ACCEPT

 iptables -P INPUT DROP

 iptables -P OUTPUT DROP

 iptables -P FORWORD DROP    

6.允許所有用戶端通路1.1.1.19網站伺服器,請在1.1.1.19linux主機上寫出對應iptables

 iptables -t filter -A INPUT -d 1.1.1.19 -p tcp --dport 80 -j ACCEPT

 iptables -t filter -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -j ACCEPT

 iptables -P FORWORD DROP 

7.允許1.1.1.19能夠ping通所有主機,但其他主機不能ping1.1.1.19

 iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 8 -j ACCEPT

 iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 0 -f ACCEPT

 注意:0代表echo-reply響應封包,8代表echo-request請求封包

    -t fliter沒有寫,iptables指令預設不寫就是指filter表

    預設政策确認是拒絕,否則測試不到效果,拒絕政策如上已給出

8.通過狀态擴充,追蹤連接配接方式,允許所有主機能ssh通路1.1.1.19伺服器,但伺服器不能ssh連出去

iptables -L -n  #檢視現有的iptables filter表現有規則

iptables -F    #清空iptables filter表所有規則

iptables -A INPUT -d 1.1.1.19 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT DROP

9.通過狀态擴充,追蹤連接配接方式,允許所有主機能通路1.1.1.19伺服器網站,但伺服器不能上網

iptables -A INPUT -d 1.1.1.19 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

iptstate #檢視系統tcp/udp/icmp等連接配接狀态指令

10.通過狀态擴充,追蹤連接配接方式,允許所有主機能PING通1.1.1.19伺服器,但伺服器不能PING出去

iptables -A INPUT -d 1.1.1.19 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT

11.将OUTPUT鍊中都是ESTABLISHED規則條目.精減彙總成一個條目

iptables -L -n --line-numbles  #檢視現有規則

Chain OUTPUT (policy DROP)

num  target    prot opt source       destination         

1    ACCEPT   tcp  --  1.1.1.19    0.0.0.0/0  tcp spt:22 state ESTABLISHED 

2    ACCEPT   tcp  --  1.1.1.19    0.0.0.0/0  tcp spt:80 state ESTABLISHED 

3    ACCEPT   icmp --  1.1.1.19     0.0.0.0/0  icmp type 0 state ESTABLISHED 

iptables -I OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED -j ACCEPT

再删除原有3條OUTPUT規則

iptables -D OUTPUT 4

iptables -D OUTPUT 3

iptables -D OUTPUT 2

iptables -L -n #檢視現有OUTPUT規則,隻剩一條剛插入的彙總規則

12.通過狀态擴充,追蹤連接配接方式,允許所有主機能連到1.1.1.19 FTP伺服器

 首先加載iptables ftp子產品,即vim /etc/sysconfig/iptables-config

 添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

 service iptables save 

 service iptables restart

iptables -I INPUT -d 1.1.1.19 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -d 1.1.1.19 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -m state --state ESTABLISHED,RELATED -j ACCEPT

13.允許1.1.1.0内用戶端通過1.1.1.19 DNS伺服器解析

解析内網主機:

iptables -A INPUT -s 1.1.1.0/24 -d 1.1.1.19 -p udp --dport 53 -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -d 1.1.1.0/24 -p udp --sport 53 -j ACCEPT

通過根疊代解析外部DNS上網:

iptables -A INPUT -d 1.1.1.19 -p udp --sport 53 -j ACCEPT

iptables -A OUTPUT -s 1.1.1.19 -p udp --dport 53 -j ACCEPT

14.将INTPUT鍊中都是多個不連續的端口規則條目.精減彙總成一個條目

Chain INPUT (policy DROP)

num  target   prot opt source     destination         

1    ACCEPT   all  -- 0.0.0.0/0   1.1.1.19   state RELATED,ESTABLISHED 

2    ACCEPT   tcp  -- 0.0.0.0/0   1.1.1.19   tcp dpt:22 state NEW,ESTABLISHE

3    ACCEPT   tcp  -- 0.0.0.0/0   1.1.1.19   tcp dpt:80 state NEW,ESTABLISHED 

4    ACCEPT   tcp  -- 0.0.0.0/0   1.1.1.19   tcp dpt:21 state NEW,ESTABLISHED 

linux下iptables防火牆詳解

iptables -I INPUT 2 -d 1.1.1.19 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT

iptables -D INPUT 3

iptables -L -n --line-numbles  #再檢視現有規則

linux下iptables防火牆詳解

15.自定義一條鍊Deny_in,拒絕接收ping廣播包,拒絕tcp标志位全為1和全為零,最後傳回INPUT鍊,并讓INPUT鍊調用Deny_in鍊,繼續處理

iptables -N Deny_in

iptables -A Deny_in -d 255.255.255.255 -p icmp -j DROP

iptables -A Deny_in -d 172.16.255.255 -p icmp -j DROP

iptables -A Deny_in -p tcp ! --syn -m state --state NEW -j DROP

iptables -A Deny_in -p tcp --tcp-flags ALL ALL -j DROP

iptables -A Deny_in -p tcp --tcp-flags ALL NONE -j DROP

iptables -A Deny_in -d 1.1.1.19 -j RETURN 

iptables -I INPUT -j Deny_in

16.利用iptables的recent子產品來抵禦DOS攻擊,

 利用connlimit子產品将單IP的并發設定為10;可以根據實際情況增大該值;

 利用recent和state子產品限制單IP在120s内隻能與本機建立3個新連接配接。否則會被限制2分鐘,

  2分鐘後才能恢複通路連接配接。

iptables -I INPUT 2 -p tcp --dport 22 -m connlimit --connlimit-above 10 -j DROP

iptables -I INPUT 3 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT 4 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 120 --hitcount 3 --name SSH -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 120 --hitcount 3 -j LOG --log-prefix "SSH Attack"  #記錄日志

 說明:上面第二句是記錄通路tcp 22端口的新連接配接,記錄名稱為SSH

        --set 記錄資料包的來源IP,如果IP已經存在将更新已經存在的條目

    上面第三句是指SSH記錄中的IP,120s内發起超過3次連接配接則拒絕此IP的連接配接。

        --update 是指每次建立連接配接都更新清單;

        --seconds必須與--rcheck或者--update同時使用

        --hitcount必須與--rcheck或者--update同時使用

17.利用SNAT技術:linux防火牆主機有兩塊網卡,内網卡IP為192.168.1.1,外網卡公網位址為         202.98.7.10,讓192.168.1.0/24所有用戶端上網,實作源位址靜态轉換

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.98.7.10

 注意要開啟ip_forward路由功能,回包目标位址轉換将會是自動進行,無需人工幹預

18.利用MASQUERADE技術,如果是ADSL撥号上網,linux防火牆主機有兩塊網卡,内網卡IP為192.168.1.1,外   網卡公網位址為動态擷取,讓192.168.1.0/24所有用戶端上網,實作源位址動态轉換

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE #下面一條指令功能一樣

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

 注意:如果是ADSL撥号上網,需安裝rp-pppoe撥号軟體

19.Forward轉發功能:讓内網1.1.1.0/24所有用戶端能通路外部網站,但外網不能通路内網用戶端

iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

iptables -P FORWARD DROP

20.Forward轉發功能:讓内網1.1.1.0/24所有用戶端能PING通外部,但外網不能PING内部

iptables -A FORWARD -s 1.1.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

21.Forward轉發功能:讓内網1.1.1.0/24所有用戶端能連接配接外部FTP,但外網不能FTP内部

iptables -A FORWARD -s 1.1.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEPT

iptables -A FORWARD -m state --state RELATED ESTABLISHED -j ACCEPT

注意:加載iptables ftp子產品,即vim /etc/sysconfig/iptables-config

   添加如下一行:IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"

22.利用DNAT技術:linux防火牆主機有兩塊網卡,内網卡IP為1.1.1.1,外網卡公網位址為202.98.7.10,讓外網可通路内通路1.1.1.18網站,實作目标位址轉換

iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18

23.利用DNAT技術:linux防火牆主機有兩塊網卡,内網卡IP為1.1.1.1,外網卡公網位址為202.98.7.10,讓外網可通路内通路1.1.1.18:8080網站,實作目标位址轉換

iptables -t nat -A PREROUTING -d 202.98.7.10 -p tcp -dport 80 -j DNAT --to-destination 1.1.1.18:8080

24.Forward轉發功能:拒絕轉發含有非法字樣如"abcd"字元串内容資訊

iptables -A FORWARD -m string --algo kmp --string "abcd" -j DROP

25.利用iptables技術根據協定協定特征碼禁止内網用戶端使用qq,skype,msn,迅雷等七層協定軟體

要想使用七層協定,必須使linux系統達到以下條件

 25.1.給核心打更新檔,并重新編譯核心

 25.2.給iptables源碼打更新檔,并重新編譯iptables

 25.3.安裝l7proto,七層協定

 下載下傳:核心:linux-2.6.28.10.tar.gz,網絡過濾器:netfilter-layer7-v2.22.tar.gz以及

     協定特征碼:l7-protocols-2009-05-28

首先給核心打更新檔,并重新編譯核心

# tar zxvf  linux-2.6.28.10.tar.gz  -C  /usr/src

# tar zxvf  netfilter-layer7-v2.22.tar.gz  -C  /usr/src

# cd /usr/src

# ln –s  linux-2.6.28.10  linux

# cd /usr/src/linux/

# patch -p1  <  ../netfilter-layer7-v2.22/kernel-2.6.25-2.6.28-layer7-2.22.patch 

# cp /boot/config-2.6.18-164.el5  /usr/src/linux/.config

# make  menuconfig

主要編譯選項:

Networking support → Networking Options →Network packet filtering framework →Core Netfilter Configuration

<M>  Netfilter connection tracking support 

<M>  “layer7” match support

<M>  “string” match support

<M>  “time”  match support

<M>  “iprange”  match support

<M>  “connlimit”  match support

<M>  “state”  match support

<M>  “conntrack”  connection  match support

<M>  “mac”  address  match support

<M>   "multiport" Multiple port match support

Networking support → Networking Options →Network packet filtering framework → IP: Netfilter Configuration

<M> IPv4 connection tracking support (required for NAT)

<M>   Full NAT

<M>     MASQUERADE target support                                                                                   

<M>     NETMAP target support                                                                               

<M>     REDIRECT target support 

# make 

# make modules_install

# make install

給iptables源碼打更新檔,并重新編譯iptables

# cp /etc/init.d/iptables ~/iptables

# cp /etc/sysconfig/iptables-config ~/

# rpm  -e  iptables-ipv6  iptables  iptstate  --nodeps

# tar jxvf iptables-1.4.6.tar.bz2 –C  /usr/src

# cd /usr/src/iptables-1.4.6

cp ../netfilter-layer7-v2.22/iptables-1.4.3forward-for-kernel-2.6.20forward/libxt_layer7.*      ./extensions/

# ./configure  --prefix=/usr  --with-ksource=/usr/src/linux

# make

安裝七層協定特征碼:

# tar zxvf l7-protocols-2009-05-28.tar.gz

# cd l7-protocols-2009-05-28

# mv ~/iptables  /etc/rc.d/init.d/

注意:編譯的iptables的二進制檔案與rpm包安裝的路徑有所不同,如需運作iptables腳本服務,必須修改對應的腳本檔案裡的指令路徑

# service iptables start

七層協定相關iptables指令格式:

iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action] 

禁止内網192.168.1.0/24通過202.100.8.66外網口登入qq

iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 202.100.8.66

iptables -I FORWARD -s 192.168.1.0/24 -m layer7 --l7proto qq -j DROP

25.4.限制用戶端上網時間段iptables指令

iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 08:00:00-12:00:00 -j DROP

iptables -A FORWARD -s 192.168.1.0/24 -m time --timestart 14:00:00-17:00:00 -j DROP

繼續閱讀