iptables防火牆的應用和SNAT/DNAT策略

上周去廣州藍盾公司參加了一個企業培訓,其中講了一個iptables防火牆和SNAT/DNAT策略的應用,個人覺得非常有用,把培訓資料整理出來分享一下。

0x00 iptables簡介

n

netfilter/iptables(簡稱為iptables)組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案。

Linux防火牆體系主要工作在網路層,針對TCP/IP數據包實施過濾和限制,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能,屬於典型的包過濾防火牆(也稱網路層防火牆)。其基於內核編碼實現,具有非常穩定的性能和高效率,因此被廣泛的應用。

1.Netfilter和iptables的區別:

n

  • Netfilter:指的是Linux內核中實現包過濾防火牆的內部結構,不以程序或文件的形式存在,屬於「內核態」(KernelSpace,又稱內核空間)的防火牆功能體系;

    n

  • Iptables:指的是用來管理Linux防火牆的命令程序,通常位於/sbin/iptables,屬於「用戶態」(UserSpace,又稱用戶空間)的防火牆管理體系;

    n

所以其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 nnetfilter,它是Linux內核中實現包過濾的內部結構。

2.規則(rules)

規則(rules)其實就是網路管理員預定義的條件,規則一般的定義為「如果數據包頭符合這樣的條件,就這樣處理這個數據包」。

規則存儲在內核空間的信息n n包過濾表中,這些規則分別指定了源地址目的地址傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)拒絕(reject)丟棄(drop)等。

配置防火牆的主要工作就是添加、修改和刪除這些規則。

3.包過濾的工作層次:

n

主要是網路層,針對IP數據包。體現在對包內的IP地址、埠等信息的處理上。

4.iptables 的表、鏈結構:

n

iptables作用:為包過濾機制的實現提供規則(或策略),通過各種不同的規則,告訴netfilter對來自某些源、前往某些目的或具有某些協議特徵的數據包應該如何處理。

iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾網路地址轉換包重構(修改)數據跟蹤處理。n鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 n條或數條規則。

當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據n n該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定n 義的默認策略來處理數據包。

規則鏈

n

  • 規則的作用:對數據包進行過濾或處理

    n
  • 鏈的作用:容納各種防火牆規則

    n
  • 鏈的分類依據:處理數據包的不同時機

    n

默認包括5種規則鏈

n

  • INPUT:處理入站數據包

    n
  • OUTPUT:處理出站數據包

    n

  • FORWARD:處理轉發數據包

    n
  • POSTROUTING鏈:在進行路由選擇後處理數據包(對數據鏈進行源地址修改轉換)

    n
  • PREROUTING鏈:在進行路由選擇前處理數據包(做目標地址轉換)

    n

INPUT、OUTPUT鏈主要用在「主機型防火牆」中,即主要針對伺服器本機進行保護的防火牆;而FORWARD、PREROUTING、POSTROUTING鏈多用在「網路型防火牆」中。

n

規則表

n

  • 表的作用:容納各種規則鏈

    n
  • 表的劃分依據:防火牆規則的作用相似

    n

默認包括4個規則表:

n

  • raw表:確定是否對該數據包進行狀態跟蹤;對應iptable_raw,表內包含兩個鏈:OUTPUT、PREROUTING

    n
  • mangle表:為數據包的TOS(服務類型)、TTL(生命周期)值,或者為數據包設置Mark標記,以實現流量整形、策略路由等高級應用。其對應iptable_mangle,表內包含五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

    n

  • nat表:修改數據包中的源、目標IP地址或埠;其對應的模塊為iptable_nat,表內包括三個鏈:PREROUTING、POSTROUTING、OUTPUT

    n
  • filter表:確定是否放行該數據包(過濾);其對應的內核模塊為iptable_filter,表內包含三個鏈:INPUT、FORWARD、OUTPUT

    n

Iptables採用「表」和「鏈」的分層結構。注意一定要明白這些表和鏈的關係及作用。

5.鏈、表的優先順序

  • 規則表之間的優先順序
    • Raw==》mangle==》nat==》filter

  • 規則鏈之間的順序
    • 入站:PREROUTING==》INPUT
    • 出站:OUTPUT==》POSTROUTING
    • 轉發:PREROUTING==》FORWARD==》POSTROUTIN
  • 規則鏈內的匹配順序
    • 按順序依次檢查,匹配即停止(LOG策略例外)
    • 若找不到相匹配的規則,則按該鏈的默認策略處理

0x01 編寫防火牆規則

iptables 的基本語法、控制類型

n

iptables [ -t 表名] 選項 [鏈名] [條件] [ -j 控制類型] n

注意事項:

n

  • 不指定表名時,-t 默認指filter表

    n
  • 不指定鏈名時,默認指表內的所有鏈

    n

  • 除非設置鏈的默認策略,否則必須指定匹配條件

    n
  • 選項、鏈名、控制類型使用大寫字母,其餘均為小寫

數據包的常見控制類型

  • ACCEPT:允許通過
  • DROP:直接丟棄,不給出任何回應
  • REJECT:拒絕通過,必要時會給出提示
  • LOG:在/var/log/messages文件中記錄日誌信息,然後傳給下一條規則繼續匹配(匹配即停止對LOG操作不起作用,因為LOG只是一種輔助動作,並沒有真正的處理數據包)

iptables命令的管理控制選項

  • -A 在指定鏈的末尾添加(append)一條新的規則 -D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除

  • -I 在指定鏈中插入(insert)一條新的規則,默認在第一行添加-R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換
  • -L 列出(list)指定鏈中所有的規則進行查看
  • -E 重命名用戶定義的鏈,不改變鏈本身
  • -F 清空(flush)
  • -N 新建(new-chain)一條用戶自己定義的規則鏈
  • -X 刪除指定表中用戶自定義的規則鏈(delete-chain)
  • -P 設置指定鏈的默認策略(policy)
  • -Z 將所有表的所有鏈的位元組和數據包計數器清零
  • -n 使用數字形式(numeric)顯示輸出結果
  • -v:以更詳細的方式顯示規則信息n
  • n--line-numbers:查看規則時,顯示規則的序號-X:刪除自定義的規則鏈 eg:將filter表中FORWARD鏈中的默認策略設為丟棄,OUTPUT鏈的默認策略設為允

規則的匹配條件

  • 通用匹配
    • 協議匹配: -p [協議名]
    • 地址匹配
      • -s [源地址]
      • -d [目標地址]

    • 介面匹配
      • -i [入站網卡]
      • -o [出站網卡]

  • 隱含匹配
    • 埠匹配
      • -sport [源埠]
      • -dport [目標埠]
    • TCP標記匹配:--tcp-flags [檢查範圍] [被設置的標記]
    • ICMP類型匹配:--icmp-type [ICMP類型]
  • 顯式匹配
    • 多埠匹配:-m multiport --sport | --dport [埠列表]
    • IP範圍匹配:-m iprange --src-range [IP範圍]
    • MAC地址匹配:-m mac --mac-range [MAC地址]
    • 狀態匹配:-m state --state [連接狀態]

常見的通用匹配條件:

  1. 協議匹配:-p [協議名]

(eg:tcpudpicmpall(針對所有IP數據包)),可用的協議類型存放於Linux系統的/etc/procotols文件中;

n

eg:丟棄通過icmp協議訪問防火牆本機的數據包、允許轉發經過防火牆的除icmp協議以外的數據包:

n

[root@iptables ~]# iptables -I INPUT -p icmp -j DROPn[root@iptables ~]# iptables -A FORWARD -p ! icmp -j ACCEPTn

【!】表示取反

2. 地址匹配:-s [源地址]、 -d [目標地址]

n

可以是IP地址、網段地址,但不建議使用主機名、域名地址,因為解析過程會影響效率

n

eg:拒絕轉發源地址為192.168.10.100的數據、允許轉發源地址位於192.168.1.0/24網段的數據:

n

[root@iptables ~]# iptables -A FORWARD -s 192.168.10.100 -j REJECTn[root@iptables ~]# iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPTn

當遇到小規模的網路掃描或攻擊時,封IP地址是比較有效的方式。

n

eg:添加防火牆規則封鎖來自172.16.16.0/24網段的頻繁掃描、登錄窮舉等不良企圖:

n

[root@iptables ~]# iptables -I INPUT -s 172.16.16.0/24 -j DROPn[root@iptables ~]# iptables -I FORWARD -s 172.16.16.0/24 -j DROPn

3. 介面匹配-i [入站網卡]、-o [出站網卡]

n

eg:丟棄從外網介面eth0訪問防火牆本機且源地址為私有地址的數據包:

n

[root@iptables ~]# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROPn

常用的隱含匹配條件:n

1. 埠匹配--sport [源埠]、--dport [目的埠]

n

單個埠號或者以冒號「:」分隔的埠範圍都是可以接受的,但不連續的多個埠不能採用這種方式。

n

eg:允許為網段192.168.1.0/24轉發DNS查詢數據包:

n

[root@iptables ~]# iptables -A FORWARD -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPTn[root@iptables ~]# iptables -A FORWARD -d 192.168.1.0/24 -p udp --sport 53 -j ACCEPTn

eg:構建vsftpd伺服器時,開放20、21埠,以及用於被動模式的埠範圍24500~24600:

n

[root@iptables ~]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPTn[root@iptables ~]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPTn

2. TCP標記匹配--tcp-flags 檢查範圍 被設置的標記

n

針對協議為TCP、用來檢查數據包的標記位(--tcp-flags)

n

「檢查範圍」指出需要檢查數據包的哪幾個標記,「被設置的標記」則明確匹配對應值為1的標記,多個標記之間以逗號進行分隔。

n

eg:拒絕從外網介面eth0直接訪問防火牆本機的TCP請求,但允許其他主機發給防火牆的TCP等響應數據包請求:

n

[root@iptables ~]# iptables -P INPUT DROPn[root@iptables ~]# iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROPn[root@iptables ~]# iptables -I INPUT -i eth0 -p tcp --tcp-flags ! --syn -j ACCEPTn

3. ICMP類型匹配--icmp-type ICMP類型

n

ICMP類型使用字元串或數字代碼表示:

n

  • Echo-Request代碼為8——表ICMP請求;

    n
  • Echo-Reply代碼為0——ICMP回顯;

    n
  • Destination-Unreachable代碼為3——ICMP目標不可達;

    n

eg:禁止從其他主機ping本機,但是允許本機ping其他主機:

n

[root@iptables ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROPn[root@iptables ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPTn[root@iptables ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPTn[root@iptables ~]# iptables -A INPUT -p icmp -j DROPn

n

常用的顯式匹配條件:

1. 多埠匹配-m multiport --sports [源埠列表]

n

-m multiport --dports [目的埠列表]

n

eg:允許本機開放25、80、110、143埠,以便提供電子郵件服務:

n

[root@iptables ~]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPTn

2. IP範圍匹配-m iprange --src-range [IP範圍]

n

用來檢查數據包的源地址、目標地址,其中IP範圍採用「起始地址—結束地址」的形式:

n

eg:禁止轉發源IP地址位於192.168.1.10與192.168.1.20之間的TCP數據包:

n

[root@iptables ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.10-192.168.1.20 -j ACCEPTn

3. MAC地址匹配-m mac --mac-source [MAC地址]

n

因為MAC地址的局限性,此類匹配一般只適用於內部網路。

n

eg:根據MAC地址封鎖主機,禁止其訪問本機的任何應用:

n

[root@iptables ~]# iptables -A INPUT -m mac --mac-source 00:01:02:03:04:cc -j DROPn

4. 狀態匹配-m state --state [連接狀態]

n

  • 基於iptables的狀態跟蹤機制用來檢查數據包的連接狀態(State)

    n
  • 常見的連接狀態包括NEW(與任何連接無關的)、ESTABLISHED(響應請求或者已建立連接的)、RELATED(與已有連接有相關性的,eg:FTP數據連接)。

    n

eg:禁止轉發與正常TCP連接無關的非「--syn」請求數據包(如偽造的一些網路攻擊數據包):

n

[root@iptables ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROPn

eg:只開放本機的web服務(80埠),但對發給本機的TCP應答數據包予以放行,其他入站數據包均丟棄:

[root@iptables ~]# iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPTn[root@iptables ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPTn[root@iptables ~]# iptables -P INPUT DROPn

0x02 iptables防火牆規則的保存與恢復

n

1、保存iptables的規則,避免開機失效

iptables-save > /etc/iptables n

2、編輯網卡,寫入開機載入iptables規則

vi /etc/network/interfacesn

3、 在網卡配置文件中寫入載入 之前保存的規則文件 使其開機可以載入iptables的規則文件

iptables-restore < /etc/iptables n

0x03 SNAT和DNAT

SNAT是指在數據包從網卡發送出去的時候,把數據包中的源地址部分替換為指定的IP,這樣,接收方就認為數據包的來源是被替換的那個IP的主機。

DNAT就是指數據包從網卡發送出去的時候,修改數據包中的目的IP,表現為如果你想訪問A,可是因為網關做了DNAT,把所有訪問A的數據包的目的IP全部修改為B,那麼,你實際上訪問的是Bn因為,路由是按照目的地址來選擇的。

因此DNAT是在PREROUTING鏈上來進行的,而SNAT是在數據包發送出去的時候才進行,所以是在POSTROUTING鏈上進行的。n通過SNAT和DNAT可以使內網和外網進行相互通訊。

SNAT策略概述:

n

SNAT策略的典型應用環境

n

區域網主機共享單個公網IP地址接入Internet

n

SNAT策略的原理:

n

源地址轉換(Source Network Address Translation)是linux防火牆的一種地址轉換操作,也是iptables命令中的一種數據包控制類型,並根據指定條件修改數據包的源IP地址。

n

實驗環境拓撲:

nn

實驗分析:

n

a:只開啟路由轉發,未做地址轉換的情況:

nn

分析:

n

  • 從區域網PC機訪問Internet的數據包經過網關轉發後其源IP地址保持不變;

    n
  • 當Internet中的主機收到這樣的請求數據包後,響應數據包將無法正確返回,從而導致訪問失敗。

    n

b:開啟路由轉發,並設置SNAT轉換的情況:

nn

分析:

n

  • 區域網PC機訪問Internet的數據包到達網關伺服器時,會先進行路由選擇;

    n
  • 如果該數據包需要從外網介面eth0向外轉發,則將其源IP地址192.168.10.2修改為網關的外網介面地址210.106.46.151,然後發送給目標主機。

    n
  • 這種訪問方式的優點:

    n
  • Internet中的伺服器並不知道區域網PC機的實際IP地址,中間的轉換完全由網關主機完成,起到了保護內部網路的作用。

    n

SNAT策略的應用:

n

前提條件:

n

  • 區域網各主機正確設置IP地址/子網掩碼

    n
  • 區域網各主機正確設置默認網關地址

    n
  • Linux網關支持IP路由轉發

    n

實現方法:

n

編寫SNAT轉換規則

n

SNAT共享固定IP地址上網:

n

實驗環境描述:

n

  • Linux網關伺服器兩塊網卡eth0:210.106.46.151連接Internet、eth1:192.168.10.1連接區域網,開啟IP路由功能

    n
  • 區域網PC機的默認網關設為192.168.10.1,並設置正確的DNS伺服器。

    n
  • 內網和外網分別新建客戶機,分別指定對應的網關地址,在外網客戶機上開啟httpd服務,在內網客戶機中訪問httpd服務,最後查看httpd客戶機的訪問記錄;

    n
  • 要求:192.168.10.0/24網段的PC機能夠通過共享方式正常訪問internet。

    n

實驗步驟:

n

1:打開網關的路由轉發(IP轉發是實現路由功能的關鍵所在):

n

打開路由轉發的兩種方式

n

永久打開修改/proc文件系統中的ip_forward,當值為1時表示開啟,為0表示關閉):

nnn

臨時開啟,臨時生效:

nn

2:正確設置SNAT策略(若要保持SNAT策略長期有效,應將相關命令寫入rc.local中):

n

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 210.106.46.151n

nnnn

3:測試SNAT共享接入的結果:

n

上訴操作完成後,使用區域網PC就可以正常訪問Internet中的網站。

nn

對於被訪問的網站伺服器,在日誌文件中將會記錄以網關主機210.106.46.151訪問。

nn

共享動態IP地址上網

n

  • MASQUERADE —— 地址偽裝

    n
  • 適用於外網IP地址非固定的情況

    n
  • 對於ADSL撥號連接,介面通常為ppp0、ppp1

    n
  • 將SNAT規則改為MASQUERADE即可

    n

實例:

n

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j MASQUERADEn

nn

如果網關使用固定的公網IP地址,建議選擇SNAT策略而不是MASQUERADE策略,以減少不必要的系統開銷。

DNAT策略概述:

DNAT策略的原理:目標地址轉換,Destination Network Address Translation,是Linux防火牆的另一種地址轉換操作,也是iptables命令中的一種數據包控制類型,其作用是根據指定條件修改數據包的目標IP地址、目標埠。n

SNAT用來修改源IP地址,而DNAT用來修改目標IP地址、目標埠;SNAT只能用在nat表的POSTROUTING鏈,而DNAT只能用在nat表的PREROUTING鏈和OUTPUT鏈(或被其調用的鏈)中。

來源

[1] 藍盾學院培訓資料

[2] Linux公社


推薦閱讀:

如何為libvirt設置虛擬主機

TAG:iptables | 防火墙 |