iptables防火牆指南


防火牆概念

  1. 從邏輯上將,防火牆大體可以分爲主機防火牆和網絡防火牆。
    主機防火牆:針對於單個主機進行防護
    網絡防火牆:往往處於網絡入口或邊緣,針對於網絡入口進行防護,服務於防火牆背後的本地局域網

  2. 從物理上講,防火牆可以分爲硬件防火牆和軟件防火牆
    硬件防火牆:在硬件級別實現部分防火牆功能,另一部分功能基於軟件實現,性能高,成本高
    軟件防火牆:應用軟件處理邏輯運行與通用硬件平臺上的防火牆,性能低,成本低

iptables

iptables並不是真正的防火牆,我們可以把它理解成一個客戶端代理,用戶通過iptables這個代理,將用戶的安全設定執行到對應的“安全框架”中,這個“安全框架”纔是真正的防火牆,而這個框架的名字叫做netfilter。
netfilter纔是防火牆真正的安全框架,它位於內核空間。
然而,iptables只是一個命令行工具,位於用戶空間,我們藉助這個工具操作真正的框架。

iptables基礎

我們知道iptables是按照規則來辦事的,而規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義爲“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作就是添加、修改和刪除這些規則。

防火牆存在着“四表五鏈”,下面我們來談談表和鏈的概念

  1. 當客戶端訪問服務器的web服務時,客戶端發送報文到網卡,而tcp/ip協議棧是屬於內核的一部分,所以,客戶端的信息會通過內核的TCP協議傳輸到用戶空間中的web服務中,而此時,客戶端報文的目標終點爲web服務所監聽的套接字(IP:port)上,當web服務需要響應客戶端請求時,web服務發出的響應報文的目標重點則爲客戶端,這個時候,web服務所監聽的IP與端口反而變成了原點。所以,如果我們想要防火牆能夠達到“防火”的目的,則需要在內核中設置關卡,所有進出的報文都要通過這個關卡,經過檢查後,符合放行條件的才能放行,符合阻攔條件的則需要被阻止。於是,就出現了INPUT關卡和OUTPUT關卡,而這些關卡在iptables中被稱之爲“鏈”。
  2. 另一種情況,客戶端發來的報文訪問的目標地址可能並不是本機,而是其他服務器,當本機的內核支持IP_FORWARD時,我們可以將報文給其他服務器,所以這個時候,我們就會提到iptables中的其他“關卡”,也就是其他“鏈”,他們就是“路由前”、“轉發”、“路由後”,他們的英文名稱爲:PREROUTING、FORWARD、POSTROUTING。
    總結:當我們啓用了防火牆功能時,報文需要經過關卡,也就是說,根據實際情況的不同,報文經過“鏈”可能不同。如果報文需要轉發,那麼報文則不會經過INPUT鏈發往用戶空間,而是直接在內核空間經過FORWARD鏈和POSTROUTING鏈轉發出去。

由此我們可以總結出報文的流向

  1. 到本機某進程的報文:PREROUTING --> INPUT
  2. 由本級轉發的報文:PREROUTING --> FORWARD --> POSTROUTING
  3. 有本機的某進程發出的報文(通常爲響應報文):OUTPUT --> POSTROUTING

當我們對每個“鏈”上都放置了一串規則,但是這些規則是有些很相似,比如,A類規則都是對IP或者端口的過濾,B類規則是修改報文,那麼這個時候,我們就需要把實現相同功能的規則放在一起。
我們把具有相同功能的規則的集合叫做“表”。所以說,不同功能的規則,我們可以放置在不同的表中進行管理。而iptables已經爲我們定義了4中表,每種表對應了不同的功能,而我們定義的規則也都逃脫不了這4中功能的範圍,也就是說,所有的規則都存在於這4張“表”中。
iptables爲我們提供的表的分類,如下:

  1. filter表:負責過濾功能,煩惱歌×××;內核模塊;iptables_filter
  2. nat表:網絡地址轉換功能;內核模塊;iptables_nat
  3. mangle表:拆解報文,做出修改,並重新封裝的功能;iptables_mangle
  4. raw表:關閉nat表上啓用的連接追蹤機制;iptables_raw

錶鏈關係

鏈的規則存放於哪些表中(從鏈到表的對應關係)

PREROUTING 的規則可以存在於:raw表、mangle表、nat表。
INPUT 的規則可以存在於:mangle表、filter表 (centos7中還有nat表,centos6中沒有)。
FORWARD 的規則可以存在於:mangle表、filter表。
OUTPUT 的規則可以存在於:raw表、mangle表、nat表、filter表。
POSTROUTING 的規則可以存在於:mangle表、nat表。

表中的規則可以被哪些鏈使用(從表到鏈的對應關係)

raw 表中的規則可以被哪些鏈使用:PREROUTING、OUTPUT
mangle 表中的規則可以被哪些鏈使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的規則可以被哪些鏈使用:PREROUTING、OUTPUT、POSTROUTING(centos7中還有INPUT,centos6中沒有)
filter 表中的規則可以被哪些鏈使用:INPUT、FORWARD、OUTPUT

注意:當數據包經過一個“鏈”的時候,會將當前鏈的所有規則都匹配一遍,但是匹配時要按照順序,一條一條的去匹配。

處理動作

  ACCEPT:允許數據包通過
  DROP:直接丟棄數據包,不給任何迴應信息,這時候客戶端會感覺自己的請求石沉大海了,過了超時時間纔會有反應。
  REJECT:拒絕數據包通過,必要時會給數據發送端一個相應的信息,客戶端剛請求就會收到拒絕的信息。
  SNAT:源地址轉換,解決內網用戶用同一個公網地址上網的問題。
  MASQUERADE:是SNAT的一種特殊形式,適用於動態的、臨時會變的IP上。
  DNAT:目標地址轉換。
  REDIRECT:在本機做端口映射。
  LOG:在/var/log/messages文件中記錄日誌信息,然後將數據包傳遞給下一條數據,也就是說除了記錄以外不對數據包做任何其他操作,仍然讓下一條規則去匹配。

iptables命令參數

-n:以數字格式顯示地址和端口號
-v:顯示詳細信息
-vv:更詳細
-L:查看規則

[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 14412 packets, 1265K bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 22 packets, 1848 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 1154 packets, 139K bytes)
 pkts bytes target     prot opt in     out     source               destination

-t:指定表

[root@CentOS7-2 ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 154 packets, 21417 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 139 packets, 20247 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

-A:添加規則
  -p:指定協議、--dport:指定目標端口、--sport:指定源端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.104 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.1 -j ACCEPT

--line-numbers:查看規則序列號

[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 REJECT     icmp --  *      *       192.168.36.100       0.0.0.0/0            reject-with icmp-port-unreachable
  120  8148 ACCEPT     all  --  *      *       192.168.36.1
....

-R:替換指定鏈上的指定規則編號

[root@CentOS7-2 ~]#iptables -R INPUT 1 -s 192.168.36.100 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 56 packets, 5013 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     icmp --  *      *       192.168.36.100       0.0.0.0/0            reject-with icmp-port-unreachable
....

-Z:置零,將計數器清零

[root@CentOS7-2 ~]#iptables -Z INPUT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 9 packets, 662 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     icmp --  *      *       192.168.36.100       0.0.0.0/0            reject-with icmp-port-unreachable
....

-S:以命令格式顯示

[root@CentOS7-2 ~]#iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N TEST
-A INPUT -s 192.168.36.100/32 -p icmp -j REJECT --reject-with icmp-port-unreachable

-I:插入,要指明插入至的規則編號

[root@CentOS7-2 ~]#iptables -I INPUT 3 -j REJECT

-D:刪除規則,要指明規則編號

規則刪除,後面的規則編號自動進行排序
[root@CentOS7-2 ~]#iptables -D INPUT 1
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1      193 13252 ACCEPT     all  --  *      *       192.168.36.1         0.0.0.0/0
2      679 62517 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

-N:new, 自定義一條新的規則鏈

[root@CentOS7-2 ~]#iptables -N TEST
[root@CentOS7-2 ~]#iptables -vnL
...
Chain TEST (0 references)
 pkts bytes target     prot opt in     out     source               destination

-X:delete,刪除自定義的空的規則鏈

[root@CentOS7-2 ~]#iptables -X TEST-M

-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:ACCEPT:接受、DROP:丟棄

[root@CentOS7-2 ~]#iptables -P INPUT DROP
[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)

-E:重命名自定義鏈;引用計數不爲0的自定義鏈不能夠被重命名,也不能被刪除

[root@CentOS7-2 ~]#iptables -E TEST TEST-M
[root@CentOS7-2 ~]#iptables -vnL
....
Chain TEST-M (0 references)
 pkts bytes target     prot opt in     out     source               destination

-F:清空指定的規則鏈,不指定鏈則清空當前表

[root@CentOS7-2 ~]#iptables -F -t filter

iptables的顯示擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制,要手動加載擴展模塊

multiport擴展

以離散方式定義多端口匹配,最多指定15個端口

  1. --source-ports,--sports port[,port|,port:port]... 指定多個源端口
  2. --destination-ports,--dports port[,port|,port:port]... 指定多個目標端口
  3. --ports port[,port|,port:port]... 多個源或目標端口

例題:拒絕192.1688.36.100主機訪問192.168.36.104(本機)的20,21,22,80端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -d 192.168.36.104 -p tcp -m multiport --dport 20:22,80 -j REJECT

iprange擴展

指明連續的(但一般不是整個網絡)ip地址範圍

  1. --src-range from[-to] 源IP地址範圍
  2. --dst-range from[-to] 目標IP地址範圍

例題:禁止192.168.36.90-192.168.36.101主機訪問192.168.36.104主機的80端口

[root@CentOS7-2 ~]#iptables -A INPUT -d 192.168.36.104 -p tcp --dport 80 -m iprange --src-range 192.168.36.90-192.168.36.101 -j REJECT

mac擴展

指明源MAC地址
適用於:PREROUTING, FORWARD,INPUT鏈

  1. --mac-source XX:XX:XX:XX:XX:XX

例題:指明源MAC地址,可以通過icmp協議訪問本機

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p icmp -m mac --mac-source 00:0C:29:5A:43:B7 -j ACCEPT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -j REJECT

string擴展

對報文中的應用層數據做字符串模式匹配檢測

  1. --algo {bm|kmp} 字符串匹配檢測算法
    bm:Boyer-Moore
    kmp:Knuth-Pratt-Morris
  2. --from offset 開始偏移
  3. --to offset 結束偏移
  4. --string pattern 要檢測的字符串模式
  5. --hex-string pattern要檢測字符串模式,16進制格式

例題1:對訪問的地址進行限制

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p tcp --dport 80 -m string --algo bm --string "mage" -j REJECT

例題2:對web站點頁面中任何包含magedu的字符串的頁面進行規則限制

請求報文中不會包含mage,一半來講只包含訪問某個頁面,那麼請求內容無非包含了請求某個鏈接而已。
響應報文中會封裝頁面的內容信息,因此網頁內容會出現在響應報文中,而不是請求報文。
所以,對web頁面內容進行規則限制需要在OUTPUT鏈進行規則設定

[root@CentOS7-2 ~]#iptables -A OUTPUT -d 192.168.36.100 -p tcp --sport 80 -m string --algo bm --string "magedu" -j REJECT

例題3:拒絕含有“OOXX”字樣的報文進入主機

[root@CentOS7-2 ~]#iptables -A INPUT -m string --algo bm --string "OOXX" -j REJECT

time擴展

根據將報文到達的時間與指定的時間範圍進行匹配

  1. --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
  2. --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
  3. --timestart hh:mm[:ss] 時間
  4. --timestop hh:mm[:ss]
    4.1 [!] --monthdays day[,day...] 每個月的幾號
    4.2 [!] --weekdays day[,day...] 星期幾,1 – 7 分別表示星期一到星期日
    4.3 [!] --kerneltz:內核時區,不建議使用,CentOS7系統默認爲UTC
    注意: centos6 不支持kerneltz ,--localtz指定本地時區(默認)

例題1:禁止192.168.36.0/24網段主機在08:00~18:00時間段內訪問主機80端口

[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.0/24 -d 192.168.36.104 -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --kerneltz -j DROP

例題2:週六日不能訪問80端口

[root@CentOS7-2 ~]#iptables -A OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j DROP

connlimit擴展模塊

使用connlimit擴展模塊,可以限制每個IP地址同時鏈接到server端的連接數量,注意:不需要指定IP,此模塊默認就是針對“每個客戶端IP”,即對單IP的併發連接數限制。

  1. --connlimit-upto #:連接的數量小於等於#時匹配
  2. --connlimit-above #:連接的數量大於#時匹配
  3. --connlimit-mask #:某網段範圍內的IP匹配

例題1:每個IP地址最多隻能佔用兩個ssh鏈接遠程到本機

[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j
REJECT

例題2:24網段的IP地址限制server端ssh最多連接10個

[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT

limit擴展模塊

限制單位時間內流入的包的數量,基於收發報文的速率做匹配

  1. --limit #[/second|/minute|/hour|/day]
  2. --limit-burst number :指出“空閒時可放行的包的數量”,默認值爲5

例題:每分鐘生成放行10個icmp包

[root@CentOS7-2 ~]#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
[root@CentOS7-2 ~]#iptables -t filter -A INPUT -p icmp -j REJECT

state擴展

conntrack機制:追蹤本機上的請求和響應之間的關係
狀態有如下幾種:

  1. NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求
  2. ESTABLISHED:NEW狀態之後,連接追蹤信息庫中爲其建立的條目失效之前期間內所進行的通信狀態
  3. RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關係
  4. INVALID:無效的連接,如flag標記不正確
  5. UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤

例題1:讓已經建立的連接允許通過

[root@node2 ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT

例題2:開啓連接追蹤放行響應的報文

[root@node2 ~]# iptables -I CLASS -m state --state ESTABLISHED,RELATED -j ACCEPT
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章