1. 程式人生 > >iptables防火墻規則整理

iptables防火墻規則整理

iptables防火墻規則整理

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 發送到網卡之前

技術分享

------------------------------------------------------------------------------------------

一、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中現在是四張表五個鏈。下面羅列一下這四張表和五個鏈。

技術分享

規則表:

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:

[!] --source-port,--sport port[:port]

[!] --destination-port,--dport port[:port]

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


本文出自 “12657170” 博客,請務必保留此出處http://12667170.blog.51cto.com/12657170/1968888

iptables防火墻規則整理