iptables防火牆的應用和SNAT/DNAT策略
上周去廣州藍盾公司參加了一個企業培訓,其中講了一個iptables防火牆和SNAT/DNAT策略的應用,個人覺得非常有用,把培訓資料整理出來分享一下。
0x00 iptables簡介
n
netfilter/iptables(簡稱為iptables)組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案。
Linux防火牆體系主要工作在網路層,針對TCP/IP數據包實施過濾和限制,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能,屬於典型的包過濾防火牆(也稱網路層防火牆)。其基於內核編碼實現,具有非常穩定的性能和高效率,因此被廣泛的應用。
1.Netfilter和iptables的區別:
nNetfilter:指的是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種規則鏈
nINPUT:處理入站數據包
nOUTPUT:處理出站數據包
n
FORWARD:處理轉發數據包
nPOSTROUTING鏈:在進行路由選擇後處理數據包(對數據鏈進行源地址修改轉換)
nPREROUTING鏈:在進行路由選擇前處理數據包(做目標地址轉換)
n
INPUT、OUTPUT鏈主要用在「主機型防火牆」中,即主要針對伺服器本機進行保護的防火牆;而FORWARD、PREROUTING、POSTROUTING鏈多用在「網路型防火牆」中。
n規則表
n表的作用:容納各種規則鏈
n表的劃分依據:防火牆規則的作用相似
n
默認包括4個規則表:
nraw表:確定是否對該數據包進行狀態跟蹤;對應iptable_raw,表內包含兩個鏈:OUTPUT、PREROUTING
nmangle表:為數據包的TOS(服務類型)、TTL(生命周期)值,或者為數據包設置Mark標記,以實現流量整形、策略路由等高級應用。其對應iptable_mangle,表內包含五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
n
nat表:修改數據包中的源、目標IP地址或埠;其對應的模塊為iptable_nat,表內包括三個鏈:PREROUTING、POSTROUTING、OUTPUT
nfilter表:確定是否放行該數據包(過濾);其對應的內核模塊為iptable_filter,表內包含三個鏈:INPUT、FORWARD、OUTPUT
n
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 [連接狀態]
常見的通用匹配條件:
- 協議匹配:-p [協議名]
(eg:tcp、udp、icmp、all(針對所有IP數據包)),可用的協議類型存放於Linux系統的/etc/procotols文件中;
neg:丟棄通過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地址、網段地址,但不建議使用主機名、域名地址,因為解析過程會影響效率
neg:拒絕轉發源地址為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地址是比較有效的方式。
neg:添加防火牆規則封鎖來自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 [出站網卡]
neg:丟棄從外網介面eth0訪問防火牆本機且源地址為私有地址的數據包:
n
[root@iptables ~]# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROPn
常用的隱含匹配條件:n
1. 埠匹配:--sport [源埠]、--dport [目的埠]
n單個埠號或者以冒號「:」分隔的埠範圍都是可以接受的,但不連續的多個埠不能採用這種方式。
neg:允許為網段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的標記,多個標記之間以逗號進行分隔。
neg:拒絕從外網介面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類型
nICMP類型使用字元串或數字代碼表示:
n
Echo-Request代碼為8——表ICMP請求;
nEcho-Reply代碼為0——ICMP回顯;
nDestination-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 [目的埠列表]
neg:允許本機開放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範圍採用「起始地址—結束地址」的形式:
neg:禁止轉發源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地址的局限性,此類匹配一般只適用於內部網路。
neg:根據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策略概述:
nSNAT策略的典型應用環境
n區域網主機共享單個公網IP地址接入Internet
nSNAT策略的原理:
n源地址轉換(Source Network Address Translation)是linux防火牆的一種地址轉換操作,也是iptables命令中的一種數據包控制類型,並根據指定條件修改數據包的源IP地址。
n實驗環境拓撲:
nn實驗分析:
na:只開啟路由轉發,未做地址轉換的情況:
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這種訪問方式的優點:
nInternet中的伺服器並不知道區域網PC機的實際IP地址,中間的轉換完全由網關主機完成,起到了保護內部網路的作用。
n
SNAT策略的應用:
n前提條件:
n區域網各主機正確設置IP地址/子網掩碼
n區域網各主機正確設置默認網關地址
nLinux網關支持IP路由轉發
n
實現方法:
n編寫SNAT轉換規則
nSNAT共享固定IP地址上網:
n實驗環境描述:
nLinux網關伺服器兩塊網卡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
實驗步驟:
n1:打開網關的路由轉發(IP轉發是實現路由功能的關鍵所在):
n打開路由轉發的兩種方式:
n永久打開(修改/proc文件系統中的ip_forward,當值為1時表示開啟,為0表示關閉):
nnn臨時開啟,臨時生效:
nn2:正確設置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地址上網:
nMASQUERADE —— 地址偽裝
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公社
推薦閱讀: