iptables防火牆規則整理
iptables是組成Linux平台下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡位址轉換(NAT)等功能。在日常Linux運維工作中,經常會設定iptables防火牆規則,用來加強服務安全。以下對iptables的規則使用做了總結性梳理:
iptables由兩部分組成:
1.framework:netfilter hooks function鈎子函數,實作網絡過濾器的基本架構。
2.rule utils:iptables 規則管理工具
總體說來,iptables就是由“四表五鍊”組成。
四表:
filter:過濾,防火牆
nat :network address translation 網絡位址轉換
mangle:拆解封包,作出修改,封裝封包
raw: 關閉nat表上啟用的連結追蹤機制
五鍊:
PREROUTING 資料包進入路由之前
INPUT 目的位址為本機
FORWARD 實作轉發
OUTPUT 原位址為本機,向外發送
POSTROUTING 發送到網卡之前
<a href="https://s2.51cto.com/wyfs02/M01/07/75/wKiom1nKCOaTRK7SAADROJlJ-cs392.jpg" target="_blank"></a>
------------------------------------------------------------------------------------------
一、iptables首先需要了解的:
1)規則概念
規則(rules)其實就是網絡管理者預定義的條件,規則一般的定義為“如果資料標頭符合這樣的條件,就這樣處理這個資料包”。規則存儲在核心空間的資訊 包過濾表中,這些規則分别指定了源位址、目的位址、傳輸協定(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。
當資料包與規則比對時,iptables就根據規則所定義的方法來處理這些資料包,如放行(accept),拒絕(reject)和丢棄(drop)等。配置防火牆的主要工作是添加,修改和删除等規則。
其中:
比對(match):符合指定的條件,比如指定的 IP 位址和端口。
丢棄(drop):當一個包到達時,簡單地丢棄,不做其它任何處理。
接受(accept):和丢棄相反,接受這個包,讓這個包通過。
拒絕(reject):和丢棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動産生。
目标(target):指定的動作,說明如何處理一個包,比如:丢棄,接受,或拒絕。
跳轉(jump):和目标類似,不過它指定的不是一個具體的動作,而是另一個鍊,表示要跳轉到那個鍊上。
規則(rule):一個或多個比對及其對應的目标。
2)iptables和netfilter的關系:
Iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables隻是Linux防火牆的管理工具而已,位于/sbin/iptables。真正實作防火牆功能的是 netfilter,它是Linux核心中實作包過濾的内部結構。
3)iptables的規則表和鍊
表(tables):提供特定的功能,iptables内置了4個表,即filter表、nat表、mangle表和raw表,分别用于實作包過濾,網絡位址轉換、包重構(修改)和資料跟蹤處理。
鍊(chains):是資料包傳播的路徑,每一條鍊其實就是衆多規則中的一個檢查清單,每一條鍊中可以有一 條或數條規則。當一個資料包到達一個鍊時,iptables就會從鍊中第一條規則開始檢查,看該資料包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該資料包;否則iptables将繼續檢查下一條規則,如果該資料包不符合鍊中任一條規則,iptables就會根據該鍊預先定 義的預設政策來處理資料包。
Iptables采用“表”和“鍊”的分層結構,在Linux中現在是四張表五個鍊。下面羅列一下這四張表和五個鍊。
<a href="https://s5.51cto.com/wyfs02/M00/A6/27/wKioL1nKC9CBg5YkAAE0Flvwx5Y128.png" target="_blank"></a>
規則表:
1)filter表——三個鍊:INPUT、FORWARD、OUTPUT
作用:過濾資料包 核心子產品:iptables_filter.
2)Nat表——三個鍊:PREROUTING、POSTROUTING、INPUT、OUTPUT
作用:用于網絡位址轉換(IP、端口) 核心子產品:iptable_nat
3)Mangle表——五個鍊:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改資料包的服務類型、TTL、并且可以配置路由實作QOS核心子產品:iptable_mangle(别看這個表這麼麻煩,咱們設定政策時幾乎都不會用到它)
4)Raw表——兩個鍊:OUTPUT、PREROUTING
作用:決定資料包是否被狀态跟蹤機制處理 核心子產品:iptable_raw
規則鍊:
1)INPUT——進來的資料包應用此規則鍊中的政策
2)OUTPUT——外出的資料包應用此規則鍊中的政策
3)FORWARD——轉發資料包時應用此規則鍊中的政策
4)PREROUTING——對資料包作路由選擇前應用此鍊中的規則
(記住!所有的資料包進來的時侯都先由這個鍊處理)
5)POSTROUTING——對資料包作路由選擇後應用此鍊中的規則
(所有的資料包出來的時侯都先由這個鍊處理)
iptables資料包封包的處理過程分為三種類型:
流入本機通路某程序的資料封包:
PREROUTING --> INPUT
由本機某程序發送出去的資料封包:
PREROUTING --> OUTPUT --> POSTROUTING
經由本機轉發的資料封包:
PREROUTING --> FORWARD --> POSTROUTING
二、接下來說下iptables,chain規則設定用法及擴充比對條件
1)iptables的基本文法格式
iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]
iptables [-t 表名] 指令選項 [鍊名] [條件比對] [-j 目标動作或跳轉]
說明:
表名、鍊名:用于指定iptables指令所操作的表和鍊;
指令選項:用于指定管理iptables規則的方式(比如:插入、增加、删除、檢視等;)
條件比對:用于指定對符合什麼樣 條件的資料包進行處理;
目标動作或跳轉:用于指定資料包的處理方式(比如允許通過、拒絕、丢棄、跳轉(Jump)給其它鍊處理。)
2)iptables指令的管理控制選項
鍊的操作指令:
-P:policy,政策,定義指定鍊的預設政策;一般有兩種選擇,即:ACCEPT或DROP;
-N:new chain,建立一條自定義的規則鍊;隻有被内建鍊上的規則調用才能使自定義規則鍊上的規則生效;-j chain_name
-X:drop chain,删除被内建鍊引用次數為0的自定義鍊;
-F:flush,清除指定鍊上的所有規則;
-E:重命名被内建鍊引用次數為0的自定義鍊;
規則的操作指令:
-A:append,追加,在指定的鍊的尾部追加一條規則;
-I [#]:insert,插入,在指定的位置插入一條規則,省略了數字表示将規則插入到鍊的第一條;
-D [#]:delete,删除,删除指定的規則
-R:replace,替換,用指定的規則去替換目标鍊中的原有規則;不能僅修改規則中的某一部分,而是整條規則完全替換;
檢視規則的指令:
-L:list,列出指定表指定鍊上的所有規則;
-n:numeric,将規則中的資訊數字化顯示,主要指:主機名和端口号;
-v:verbose,顯示詳細格式的資訊,還有-vv,-vvv;
-x:exactly,精确的顯示計數器的結果;
--line-numbers:顯示規則鍊中的規則編号;
每條規則都有兩個計數器:
1.比對的封包的個數;
2.比對的封包的總的位元組數;
重置規則計數器(将計數器計數歸零):
-Z:zero,将指定表指定鍊上的規則的計數器置0;
3)chain
1.内建鍊:
2.自定義鍊:
基本比對條件:
預設情況下,多個條件之間是邏輯"與"的關系;
!:指對比對的條件取反;有除了...之意;
[!] -s, --source address[/mask][,...]
檢查封包中的源IP位址是否符合此條件指定的位址或範圍;
[!] -d, --destination address[/mask][,...]
檢查封包中的目标IP位址是否符合此條件指定的位址或範圍;
[!] -p, --protocol protocol
檢查封裝封包的協定是否符合此條件指定的協定;
protocol:tcp, udp, ip, icmp, arp, ...
隻要是TCP/IP協定棧中,傳輸層和網絡層的協定均可;
tcp:
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
指明此次比對的源端口或目的端口;
[!] --tcp-flags mask comp
mask:要檢查的标志位的清單,各标志位之間使用逗号分隔;
comp:必須置1的标志位清單,其餘的在mask清單中的标志位必須為0;
TCP協定首部中的标志位:SYN,FIN,ACK,RST,PSH,URG
如:--tcp-flags SYN,ACK,FIN,RST SYN 相當于 --syn
udp:
icmp:
[!] --icmp-type {type[/code]|typename}
8: echo-request
0: echo-reply
[!] -i, --in-interface name
檢查資料封包入站的接口是否對應此條件中指定的接口;
[!] -o, --out-interface name
檢查資料封包出站的接口是否對應此條件中指定的接口;
注意:在INPUT鍊上指定出站接口沒有意義;在OUTPUT鍊上指定入站接口沒有意義;
4)防火牆處理資料包的四種方式ACCEPT 允許資料包通過
DROP 直接丢棄資料包,不給任何回應資訊
REJECT 拒絕資料包通過,必要時會給資料發送端一個響應的資訊。
LOG在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則
5)iptables防火牆規則的儲存與恢複
iptables-save把規則儲存到檔案中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動裝載使用指令iptables-save來儲存規則。一般用:iptables-save > /etc/sysconfig/iptables生成儲存規則的檔案/etc/sysconfig/iptables,也可以用:service iptables save它能把規則自動儲存在/etc/sysconfig/iptables中。
當計算機啟動時,rc.d下的腳本将用指令iptables-restore調用這個檔案,進而就自動恢複了規則。
6)擴充比對條件:
隐式擴充:
-p tcp
顯示擴充:
1.multiport擴充:
以離散或連續的方式定義多個端口比對條件:
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
21,22,23,80,1000:2000
示例:
~]# iptables -I INPUT -d 172.16.72.1 -s 172.16.0.0/16 -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT
2.iprange擴充:
以連續的IP位址範圍指明連續的多個位址的比對條件;
[!] --src-range from[-to]
[!] --dst-range from[-to]
172.16.50.1-172.16.72.254
~]# iptables -I INPUT 4 -m iprange --src-range 172.16.0.1-172.16.72.254 -p tcp -m multiport --dports 21,22,80 -j ACCEPT
3.string擴充:
對封包中的應用層資料做字元串比對檢測;
--algo {bm|kmp}:選擇處理字元串的算法;
[!] --string pattern:指明要檢查比對的字元串;
~]# iptables -A OUTPUT -s 172.16.72.1 -d 172.16.0.0/16 -m string --string "admin" --algo kmp -j DROP
4.time擴充:
根據封包到達的時間與指定的時間範圍進行比對度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
~]# iptables -I INPUT -d 172.16.72.1 -p tcp -m multiport --dports 21,23,80 -m time --timestart 09:00:00 --timestop 17:00:00 --weekdays Sat,Sun --kerneltz -j ACCEPT
5.connlimit擴充:
根據每個用戶端IP做并發連接配接數的比對;
--connlimit-upto n:連接配接數數量小于等于n,此時規則應設定為允許;
--connlimit-above n:連接配接數數量大于n,此時規則應設定為拒絕;
~]# iptables -I INPUT -d 172.16.72.1 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
6.limit擴充:
基于收發封包的速率進行比對;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
~]# iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 8 -j ACCEPT
7.state擴充:
狀态檢測:基于連接配接追蹤機制實作;conntrack
狀态:
INVALID:無法識别的狀态;無效狀态;
ESTABLISHED:已建立連接配接的狀态;連接配接态;
NEW:尚未建立連接配接的狀态,新連接配接态;
RELATED:與其他已建立的連接配接相關聯的狀态;關聯态或衍生态;
UNTRACKED:未追蹤的連接配接;
追蹤到的連接配接儲存的位置:
/proc/net/nf_conntrack
能夠被追蹤到的最大連接配接數的定義:
/proc/sys/net/nf_conntrack_max
注意:此最大連接配接數的數值,建議必要時可以調整到足夠大;
不同協定的連接配接追蹤的逾時時間:
/proc/sys/net/netfilter/*timeout
~]# iptables -I INPUT -d 172.16.72.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
~]# iptables -I INPUT 2 -d 172.16.72.1 -p tcp -m multiport --dports 21,22,23,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP
注意:預設的規則或最後一條規則拒絕所有主機通路;
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP
放行FTP被動模式的資料連接配接:
1.裝載追蹤FTP協定的子產品:
# modprobe nf_conntrack_ftp
也可以編輯vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
-----------------------------------------------------------------------------------------
三、IPtables中可以靈活的做各種網絡位址轉換(NAT)
網絡位址轉換主要有兩種:SNAT和DNAT
1)SNAT是source network address translation的縮寫,即源位址目标轉換。
比如,多個PC機使用ADSL路由器共享上網,每個PC機都配置了内網IP。PC機通路外部網絡的時候,路由器将資料包的報頭中的源位址替換成路由器的ip,當外部網絡的伺服器比如網站web伺服器接到通路請求的時候,它的日志記錄下來的是路由器的ip位址,而不是pc機的内網ip,這是因為,這個伺服器收到的資料包的報頭裡邊的“源位址”,已經被替換了。是以叫做SNAT,基于源位址的位址轉換
2)DNAT是destination network address translation的縮寫,即目标網絡位址轉換。
典型的應用是,有個web伺服器放在内網中,配置了内網ip,前端有個防火牆配置公網ip,網際網路上的通路者使用公網ip來通路這個網站。
當通路的時候,用戶端發出一個資料包,這個資料包的報頭裡邊,目标位址寫的是防火牆的公網ip,防火牆會把這個資料包的報頭改寫一次,将目标位址改寫成web伺服器的内網ip,然後再把這個資料包發送到内網的web伺服器上。這樣,資料包就穿透了防火牆,并從公網ip變成了一個對内網位址的通路了。
SNAT:
--to-source [ipaddr[-ipaddr]][:port[-port]]
注意:在RHEL系或CentOS系作業系統上,SNAT中指定ipaddr必須為目前主機已經配置的IP位址;
示例:
~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.50
MASQUERADE
--to-ports port[-port]
~]# iptables -t nat -R POSTROUTING 1 -s 192.168.100.0/24 -j MASQUERADE
DNAT:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
~]# iptables -t nat -A PREROUTING -d 172.16.72.50 -j DNAT --to-destination 192.168.100.2
~]# iptables -t nat -A PREROUTING -d 172.16.72.50 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:8077
REDIRECT:端口重定向
--to-ports port[-port]
~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8077
LOG:
僅僅是開啟核心對比對的資料包做額外的日志記錄;
--log-level level
--log-prefix prefix
--log-ip-options
本文轉自Vincent一馬 51CTO部落格,原文連結:http://blog.51cto.com/mazhenbo/1983394,如需轉載請自行聯系原作者