本節我們來講一講防火牆的知識。所謂防火牆指的是一個由軟件和硬件設備組合而成、在內部網和外部網之間、專用網與公共網之間的界面上構造的保護屏障.是一種獲取安全性方法的形象說法,它是一種計算機硬件和軟件的結合,使Internet與Intranet之間建立起一個安全網關(Security Gateway),從而保護內部網免受非法用戶的侵入。防火牆按照工作在不同TCP/IP層又可以分爲網絡層防火牆和應用層網關防火牆,二本節我們要講的內容爲網絡層防火牆,即iptables,組件爲netfilter/iptables。
netfilter 組件也稱爲內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱爲用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。
那麼下面我們就來講講netfilter的組成部分以及iptables命令的使用方法。
netfilter
netfilter由4表5鏈組成。
5條鏈即爲5個hook function(鉤子函數),可以理解爲數據包傳送到該計算機時的5個檢查點。分別爲:
PREROUTING:路由前
INPUT:到達本機內部的報文必經之路
FORWARD:由本機轉發的報文必經之路
OUTPUT:由本機發出的報文的必經之路
POSTROUTING:路由後
而4張表(即功能)分別爲:raw, mangle, nat, filter。
raw: 目標是關閉nat表上啓用的連接追蹤功能;
mangle:包重構,把包拆開來打上某些標記再送走
nat: 地址轉換,啓用connection_track;
SNAT
DNAT
PNAT
filter: 過濾,定義是否允許通過防火牆
注意這4張表是有優先級的概念的,這裏我是按照優先級排的。
表和鏈之間的對應關係。
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTING(DNAT),POSTROUTING(SNAT),OUTPUT
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw: PREROUTING, OUTPUT
數據報文流程:如下圖所示
跟本機內部進程通信:
進入:PREROUTING, INPUT
出去:OUTPUT, POSTROUTING
由本機轉發:
PREROUTING, FORWARD, POSTROUTING
數據報文的流向:
源IP和目標IP由流向決定;
iptables
當你要寫規則時,應該先確定功能(表),確定報文流向,確定要實現的目標,確定匹配件。
iptables規則定義原則:
1、同一類規則,儘量優化條目數量;
2、彼此不相關的規則匹配量大的規則,放在前面,匹配機會較多放在上面;
3、同一類規則,匹配規則更嚴格放在上面。
必須要注意的是:規則立即生效,所以當你使用iptables時需要先添加放行自己會話的規則,避免自己的會話被拒絕。
規則文件:/etc/sysconfig/iptables
保存啓用中的規則於規則文件中:
1、# iptables-save > /etc/sysconfig/iptables
2、# service iptables save
生效規則文件中的規則:
1、# iptables-restore < /etc/sysconfig/iptables
2、# service iptables restart
執行的操作:清空現有規則,讀取並生效規則文件中的規則
基本語法:
iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
下面對每一項進行解釋:
-t TABLE: 選擇哪個表
nat, mangle, raw, filter
默認爲filter
COMMAND:
鏈:
-F:flush, 清空規則鏈;
-N:new, 自建一條鏈
-X: delete, 刪除一條自定義的空鏈
-Z:zero,計數器歸零
-P:policy,設置默認策略,對filter表來講,默認規則爲ACCEPT或DROP;
-E:重命名自定義鏈
鏈中的規則:
-A 添加規則
-I 插入規則
-D 刪除規則
-R 修改規則
查詢:
-L
-n: 數字格式顯示主機地址和端口;
-v: 詳細格式,-vv, -vvv
-x: exactly,不要對計數器的計數結果做單位換算,而顯示其精確值
--line-numbers: 顯示規則編號
查看後得到的
pkts bytes target prot opt in out source destination
包數 字節數 目標 協議 流入的接口 流出的接口 源地址 目標地址
CHAIN:選定哪個鏈
添加規則
iptables [-t TABLE] -A 鏈名 匹配條件 -j 處理目標
匹配條件:
通用匹配
-s 地址:指定報文源IP地址匹配的範圍;可以是IP,也可以是網絡地址;可使用!取反;
--src, --source
-d 地址:指定報文目標IP地址匹配的範圍;
--dst, --destination
-p 協議:指定匹配報文的協議類型,一般有三種tcp, udp和icmp;
-i INTERFACE: 數據報文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 數據報文流出的接口;OUTPUT, FORWARD, POSTROUITING
擴展匹配:調用netfilter額外模塊實現特殊檢查機制,(使用到相關功能,要使用iptables命令的-m選項來指定調用哪個模塊)
隱式擴展:當使用-p {tcp|udp|icmp}中的一種時,可以直接使用擴展專用選項;
-p tcp:
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目標端口
--tcp-flags
要檢查標誌位列表(用逗號分隔) 必須爲1的標誌位列表(逗號分隔)
--syn
-p udp:
--sport
--dport
-p icmp [-m icmp]
--icmp-type
0: echo-reply, ping響應
8: echo-request, ping請求
顯式擴展:必須明確說明使用哪個模塊進行擴展,而後才能使用其擴展專用選項;
-m 擴展模塊名稱
multiport: 多端口匹配
可用於匹配非連續或連續端口;最多指定15個端口;
專用選項:
--source-ports, --sports port[,port,port:port]
--destination-ports, --dports
--ports
例子:開放22,80端口
# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT # iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange: 匹配指定範圍內的地址;
匹配一段連續的地址而非整個網絡時有用;
專用選項:
[!] --src-ragne IP[-IP]
[!] --dst-range
例子:限定一段連續地址可以通過telnet連接。
# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT # iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string: 字符串匹配,能夠檢測報文應用層中的字符串
專用選項:
--algo {kmp|bm} 2種不同的算法,選一種
--string "STRING" STRING爲你想要匹配的字符串
--hex-string "HEX_STRING": HEX_STRING爲編碼成16進制格式的字串;
例子:
# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
time: 基於時間做訪問控制
專用選項:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,..... 中間用逗號隔開
例子:
# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue -j ACCEPT
connlimit: 連接數限制,對每IP所能夠發起併發連接數做限制;
專用選項:
[!] --connlimit-above [n]
例子:限制同一IP ssh遠程連接數。
#iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit: 速率限制
專用選項:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:限制每分鐘只能ping20次
# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state: 狀態檢查
專用選項:
--state
連接追蹤中的狀態:
NEW: 新建立一個會話
ESTABLISHED:已建立的連接
RELATED: 有關聯關係的連接
INVALID: 無法識別的連接
例子:放行所有已建立連接的數據包。
[root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
處理目標:
1、DROP : 丟棄
2、REJECT: 拒絕
3、ACCEPT: 放行
4、自定義的鏈 : 根據自定義鏈中的規則進行匹配
創建自定義鏈:
iptables [-t table] -N chain
刪除自定義且0引用的空鏈
iptables [-t table] -X chain
重命名自定義鏈:
iptables [-t table] -E old_name new_name
5、DNAT:明確申明要做的是目的地地址轉換操作
6、SNAT:明確申明要做的是源地址轉換操作
7、REDIRECT:重定向:主要用於實現端口重定向
8、MARK:打防火牆標記的
9、RETURN:在自義鏈中無法匹配報文時,將其返回主鏈
調整連接追蹤功能所能容納的連接的最大數目:
/proc/sys/net/nf_conntrack_max
當前追蹤的所有連接
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的屬性:
/proc/sys/net/netfilter目錄:
下面我們以ftp服務爲例:
放行被動模式下的FTP服務:
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模塊:nf_conntrack_ftp
裝載命令:modprobe nf_conntrack_ftp
卸載:modprobe -r nf_conntrack_ftp
2、放行請求報文:
(1) 放行NEW狀態對21端口請求的報文;
[root@localhost ~]# iptables -A INPUT -d 172.16.106.1 -p tcp --dport 21 -m state --NEW -j ACCEPT
(2) 放行ESTABLISHED以及RELATED狀態的報文
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3、放行響應報文:
放行ESTABLISHED以及RELATED狀態的報文
[root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
這樣FTP服務就可以運行了。
iptables的路由轉發功能
所謂的轉發功能就是啓用forward功能,並且結合地址轉換功能,使得2個屬於不同網絡的主機或者服務器之間可以進行連接通信。(這裏默認INPUT,OUTPUT鏈的策略爲drop)
首先必須在配置文件中將路由轉發功能開啓:
#vim /etc/sysctl.conf net.ipv4.ip_forward = 1 #sysctl -p 重讀配置文件
上面的啓用之後就可以通過iptables命令來進行添加規則了。
下面我們通過下圖來解釋一下轉發時的地址轉換原理。
SNAT
假設中間的網關主機爲B:由2個地址,一個是內網地址172.16.0.1,一個外網地址192.168.1.1
當私網中的主機A想訪問公網中的WEB主機時,由於不能直接訪問,於是A就通過網關主機的路由發送請求,
假設不進行地址轉換,則網關主機允許路由轉發,於是請求到達了web主機,然而當web收到請求後,於是返回響應報文,但是WEB發現該請求的源地址是一個私網地址,因此WEB無法將響應報文送回到網關主機B;
因此在網關主機B中必須進行地址轉換,在報文將要離開主機B的之前將源地址改爲1.1.1.1(注意:在轉換完成之後,主機B會自動生成一張表,記錄了內網中的那個主機發起哪個請求,因此當該請求的響應報文從遠程主機返回之後,主機B會自動根據該表將響應報文中的IP地址改爲請求主機的IP),然後再將報文發送給WEB;當WEB收到報文後做出響應,發出響應報文,源地址爲2.2.2.2,目標地址問1.1.1.1,因此響應報文發送給了主機B,經過地址轉換之後,主機B又將響應報文送回給A,這樣才完成了整個通信過程。
由於上述完成的是一個SNAT的過程,即在請求的過程中目標地址始終沒變,變的只是源地址,因此在寫規則是,寫在POSTROUTING鏈中:
#iptables -t nat -A POSTROUTING -s 172.16.6.2 -j SNAT --to-source 1.1.1.1
DNAT
如果是一個DNAT的過程的話,寫規則時的鏈就不同,應該寫在PREROUTING鏈中:
該過程就可以看成是公網中的主機C來訪問B中的web的服務,然而B只是一臺代理服務器,它的web服務是他內網中的www服務器提供的,如下圖。
根據C發出的請求報文應該是,源地址爲2.2.2.2,目標地址爲1.1.1.1,而到了B主機之後呢?他收到請求之後發現目標地址爲自己,然而他請求的是web服務,應該將請求的目標地址改爲WWW主機的IP(172.16.6.2),那麼在哪個地方改呢?對,他只能在路由決策之前修改,不然的話請求就送給B主機本身處理了,而非轉發給內網中的WWW主機。因此,該規則只能在PREROUTING鏈中寫,IP修改完之後才能進行轉發(當然和上面一樣,修改完之後也會生成一張表,記錄相關信息,當該請求的響應返回時,主機B將會自動根據該表將響應報文中的源IP地址改爲1.1.1.1),然後再將報文發送給WWW,WWW收到請求後返回響應報文,源地址爲172.16.6.2,目標地址爲2.2.2.2,當B收到報文後自動將源地址改爲1.1.1.1,然後再返回給C主機。這樣通信過程纔算完成了。
命令:
#iptables -t nat -A PREROUTING -d 1.1.1.1 -j DNAT --to-destination 172.16.6.2
本節相關的內容就講到這裏,歡迎大家一起交流,講的不好不對的請批評指正,謝謝!