防火牆——NAT與iptables

一、Iptables

1、Linux Kernel中的包過濾防火牆

(1)Ipfw/ipfwadm

   2.0.*中使用移植於BSD的ipfw
   缺點:包過濾、NAT等代碼混雜在整個網絡相關代碼中

(2)Ipchains

   2.2.*中使用

(3)Netfilter/iptables

   2.4.*iptables

   可以從 www.netfilter.org 下載
   模塊化,支持狀態跟蹤

2、Netfilter/iptables

(1)可以實現完整的基於連接跟蹤的包過濾防火牆
(2)Netfilter is the framework in Linux 2.4 kernels that allow for firewalling, NAT.
(Netfilter是Linux kernel 中對數據包進行處理的框架)
(3)Iptables is the userspace tools that works with the Netfilter framework

3、iptables結構示意圖



4、表和鏈

(1)表

       
filter:實現數據報過濾
       
nat:網絡地址轉換 (NAT:Network Address Translator)
       
Mangle:  數據報處理

(2)鏈

       
INPUT:位於 filter 表,匹配目的 IP 是本機的數據包
       
FORWARD:位於 filter 表,匹配穿過本機的數據包
       
PREROUTING:位於 nat 表,用於修改目的地址(DNAT)
       
POSTROUTING:位於 nat 表,用於修改源地址  (SNAT)


5、Iptables 語法


iptables [-t 要操作的表]
          
<操作命令>
          
[要操作的鏈]
          
[規則號碼]
          
[匹配條件]
          
[-j 匹配到以後的動作]


6、命令概述

操作命令(-A、-I、-D、-R、-P、-F)

查看命令(-[vnx]L)


(1)-A <鏈名>

   
 APPEND,追加一條規則(放到最後)
例如:
    iptables -t filter -A INPUT -j DROP

在 filter 表的 INPUT 鏈裏追加一條規則(作爲最後一條規則),匹配所有訪問本機 IP 的數據包,匹配到的丟棄


(2)-I <鏈名> [規則號碼]

    
INSERT,插入一條規則
例如:
    iptables -I INPUT -j DROP
    
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 1 條)

    
    iptables -I INPUT 3 -j DROP
    
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 3 條)


注意:
       
1、-t filter 可不寫,不寫則自動默認是 filter 表
      
2、-I 鏈名 [規則號碼],如果不寫規則號碼,則默認是 1
       
3、確保規則號碼 ≤ (已有規則數 + 1),否則報錯


(3)-D <鏈名> <規則號碼 | 具體規則內容>

    
DELETE,刪除一條規則
例如:
    iptables -D INPUT 3(按號碼匹配)
    
刪除 filter 表 INPUT 鏈中的第三條規則(不管它的內容是什麼)

    
    iptables -D INPUT -s 192.168.0.1 -j DROP(按內容匹配)
    
刪除 filter 表 INPUT 鏈中內容爲“-s 192.168.0.1 -j DROP”的規則(不管其位置在哪裏)

注意:
    
1、若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條
    
2、按號碼匹配刪除時,確保規則號碼 ≤ 已有規則數,否則報錯
    
3、按內容匹配刪除時,確保規則存在,否則報錯


(4)-R <鏈名> <規則號碼> <具體規則內容>

    
REPLACE,替換一條規則
例如:
    iptables -R INPUT 3 -j ACCEPT
    
將原來編號爲 3 的規則內容替換爲“-j ACCEPT”

注意:
    確保規則號碼 ≤ 已有規則數,否則報錯

(5)-P <鏈名> <動作>

    
POLICY,設置某個鏈的默認規則
例如:
    iptables -P INPUT DROP
    
設置 filter 表 INPUT 鏈的默認規則是 DROP

注意:
    當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動作前面不能加 –j,這也是唯一一種匹配動作前面不加 –j 的情況。


(6)-F [鏈名]

    
FLUSH,清空規則
例如:
    iptables -F INPUT
    
清空 filter 表 INPUT 鏈中的所有規則

    iptables -t nat -F PREROUTING
    
清空 nat 表 PREROUTING 鏈中的所有規則

注意:
    
1、-F 僅僅是清空鏈中規則,並不影響 -P 設置的默認規則
    
2、-P 設置了 DROP 後,使用 -F 一定要小心!!!
    
3、如果不寫鏈名,默認清空某表裏所有鏈裏的所有規則


(7)-L [鏈名]

    
LIST,列出規則
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
    
x:在 v 的基礎上,禁止自動單位換算(K、M)
    
n:只顯示 IP 地址和端口號碼,不顯示域名和服務名稱


例如:

    iptables -L
    
粗略列出 filter 表所有鏈及所有規則

    iptables -t nat -vnL
    
用詳細方式列出 nat 表所有鏈的所有規則,只顯示 IP 地址和端口號

    iptables -t nat -vxnL PREROUTING
    
用詳細方式列出 nat 表 PREROUTING 鏈的所有規則以及詳細數字,不反解


7、匹配條件

流入、流出接口(-i、-o)

來源、目的地址(-s、-d)

協議類型    (-p)

來源、目的端口(--sport、--dport)



(1)按網絡接口匹配

-i <匹配數據進入的網絡接口>

例如:
    
-i eth0
    匹配是否從網絡接口 eth0 進來

    
-i ppp0
    匹配是否從網絡接口 ppp0 進來



-o 匹配數據流出的網絡接口

例如:
    
-o eth0
    
-o ppp0



(2)按來源目的地址匹配

-s <匹配來源地址>
    
可以是 IP、NET、DOMAIN,也可空(任何地址)

例如:
    
-s 192.168.0.1     匹配來自 192.168.0.1 的數據包
    
-s 192.168.1.0/24  匹配來自 192.168.1.0/24 網絡的數據包
    
-s 192.168.0.0/16  匹配來自 192.168.0.0/16 網絡的數據包



-d <匹配目的地址>
    可以是 IP、NET、DOMAIN,也可以空

例如:
    
-d 202.106.0.20    匹配去往 202.106.0.20 的數據包
    
-d 202.106.0.0/16  匹配去往 202.106.0.0/16 網絡的數據包
    
-d www.abc.com     匹配去往域名 www.abc.com 的數據包

(3)按協議類型匹配

-p <匹配協議類型>
    
可以是 TCP、UDP、ICMP 等,也可爲空

例如:
    
-p tcp
    
-p udp
    
-p icmp --icmp-type 類型
    
ping: type 8


(4)按來源目的端口匹配


--sport <匹配源端口>
    
可以是個別端口,可以是端口範圍

例如:
    
--sport 1000      匹配源端口是 1000 的數據包
    
--sport 1000:3000 匹配源端口是 1000-3000 的數據包(含1000、3000)
    
--sport :3000     匹配源端口是 3000 以下的數據包(含 3000)
    
--sport 1000:     匹配源端口是 1000 以上的數據包(含 1000)



--dport <匹配目的端口>
    
可以是個別端口,可以是端口範圍

例如:
    
--dport 80        匹配目的端口是 80 的數據包
    
--dport 6000:8000 匹配目的端口是 6000-8000 的數據包(含6000、8000)
    
--dport :3000     匹配目的端口是 3000 以下的數據包(含 3000)
    
--dport 1000:     匹配目的端口是 1000 以上的數據包(含 1000)

注意:--sport 和 --dport 必須配合 -p 參數使用


(5)匹配應用舉例


1、端口匹配
-p udp --dport 53

匹配網絡中目的端口是 53 的 UDP 協議數據包


2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16

匹配來自 10.1.0.0/24 去往 172.17.0.0/16 的所有數據包


3、端口和地址聯合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80

匹配來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協議數據包



注意:

1、--sport、--dport 必須聯合 -p 使用,必須指明協議類型是什麼

2、條件寫的越多,匹配越細緻,匹配範圍越小




8、動作(處理方式)

ACCEPT

DROP

SNAT

DNAT

MASQUERADE


(1)-j ACCEPT

    
通過,允許數據包通過本鏈而不攔截它
    
類似 Cisco 中 ACL 裏面的 permit


例如:
    
iptables -A INPUT -j ACCEPT
    
允許所有訪問本機 IP 的數據包通過


(2)-j DROP

    
丟棄,阻止數據包通過本鏈而丟棄它
    
類似 Cisco 中 ACL 裏的 deny


例如:
    
iptables -A FORWARD -s 192.168.80.39 -j DROP
     
阻止來源地址爲 192.168.80.39 的數據包通過本機


(3)-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 鏈)

    
源地址轉換,SNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
   (一組連續的 IP 地址)

例如:

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \-j SNAT --to 1.1.1.1

將內網 192.168.0.0/24 的原地址修改爲 1.1.1.1,用於 NAT


iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \-j SNAT --to 1.1.1.1-1.1.1.10

同上,只不過修改成一個地址池裏的 IP

(4)-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鏈)

    
目的地址轉換,DNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
   (一組連續的 IP 地址)

例如:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \-j DNAT --to 192.168.0.1

把從 ppp0 進來的要訪問 TCP/80 的數據包目的地址改爲 192.168.0.1


iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \-j DNAT --to 192.168.0.2:80

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \-j DNAT --to 192.168.0.1-192.168.0.10

(5)-j MASQUERADE


動態源地址轉換(動態 IP 的情況下使用)


例如:
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

將源地址是 192.168.0.0/24 據包進行地址僞裝


9、附加模塊


按包狀態匹配   (state)

按來源 MAC 匹配(mac)

按包速率匹配   (limit)

多端口匹配     (multiport)

(1)state

-m state --state 狀態

狀態:NEW、RELATED、ESTABLISHED、INVALID
      
NEW:有別於 tcp 的 syn
      
ESTABLISHED:連接態
      
RELATED:衍生態,與 conntrack 關聯(FTP)
      
INVALID:不能被識別屬於哪個連接或沒有任何狀態

例如:
    iptables -A INPUT -m state --state RELATED,ESTABLISHED \-j ACCEPT

(2)mac

-m mac --mac-source MAC

匹配某個 MAC 地址


例如:
   
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx \-j DROP
   
阻斷來自某 MAC 地址的數據包,通過本機

注意:
    
報文經過路由後,數據包中原有的 mac 信息會被替換,所以在路由後的 iptables 中使用 mac 模塊是沒有意義的


(3)limit

-m limit --limit 匹配速率 [--burst 緩衝數量]
    
用一定速率去匹配數據包

例如:
   
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s \-j ACCEPT
   
iptables -A FORWARD -d 192.168.0.1 -j DROP

注意:
 
limit 英語上看是限制的意思,但實際上只是按一定速率去匹配而已,要想限制的話後面要再跟一條 DROP

(4)multiport

-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]

一次性匹配多個端口,可以區分源端口,目的端口或不指定端口

例如:
   
iptables -A INPUT -p tcp -m multiport --dports \21,22,25,80,110 -j ACCEPT

注意:
    
必須與 -p 參數一起使用

10、iptables使用規則



所有鏈名必須大寫   INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING

所有表名必須小寫   filter/nat/mangle

所有動作必須大寫   ACCEPT/DROP/SNAT/DNAT/MASQUERADE

所有匹配必須小寫   -s/-d/-m <module_name>/-p


二、NAT

NAT:Network Address Translation

允許多個users使用Private IP Address並通過一個Public IP Address連接Internet

DNAT : Destination NAT,可用來改變Destination IP Address

SNAT : Source NAT,可用來改變Source IP Address

1、NAT



2、Private IP Address space


10.0.0.0     - 10.255.255.255

172.16.0.0   -172.31.255.255

192.168.0.0  -192.168.255.255

3、NAT實戰


4、Nat網關實例

#out eth0 192.168.22.134

#in eth1 192.168.0.254

#Refresh all chains

iptables –F

#############Open ip_forward ##############

echo “1” >/proc/sys/net/ipv4/ip_forward   #ip_forward=1,啓動封包轉送


#############加載必要的模塊 ############

/sbin/modprobe ip_tables    

/sbin/modprobe iptable_filter

/sbin/modprobe iptable_nat

/sbin/modprobe ip_conntrack         #IP連線追蹤模塊

/sbin/modprobe ip_conntrack_ftp     #FTP連線追蹤模塊

/sbin/modprobe ip_nat_ftp           #允許private side的主機使用ftp服務


5、Nat網關實例


#############Define nat ############

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE  #僞裝

#############FORWARD DEFAULT POLICY############

iptables -P FORWARD DROP


###############Define packets################

iptables -A FORWARD -p tcp  -i eth0 -j ACCEPT

iptables -A FORWARD -p udp  -i eth0 -j ACCEPT

iptables -A FORWARD -p tcp  -i eth1 -j ACCEPT

iptables -A FORWARD -p udp  -i eth1 -j ACCEPT


################Define fregment rule###########

iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT


###############Define icmp rule##############

iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT


6、Nat網關實例


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