iptables防火牆指南


防火牆概念

  1. 從邏輯上將,防火牆大致能夠分爲主機防火牆和網絡防火牆。
    主機防火牆:針對於單個主機進行防禦
    網絡防火牆:每每處於網絡入口或邊緣,針對於網絡入口進行防禦,服務於防火牆背後的本地局域網 node

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

iptables

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

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爲咱們提供的表的分類,以下: centos

  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 bash

注意:當數據包通過一個「鏈」的時候,會將當前鏈的全部規則都匹配一遍,可是匹配時要按照順序,一條一條的去匹配。

處理動做

  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

網絡防火牆實現

方法一:經過請求(--icmp-type=8)與響應包(--icmp-type=0)進行iptables策略的配置

[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT

方法二:經過報文狀態跟蹤進行判斷

[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@LVS ~]#iptables -vnL
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
   91  7644 ACCEPT     icmp --  *      *       192.168.36.0/24      0.0.0.0/0            icmptype 8
   16  1344 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

SNAT

SNAT解決局域網訪問互聯網,本地網絡中的主機經過某一特定的地址訪問外部網絡,實現地址假裝。請求報文:修改源IP---POSTROUTING

iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE

DNAT

DNAT解決內網私有地址能夠被互聯網訪問, 指數據包從網卡發送出去的時候,修改數據包中的目的IP,表現爲若是你想訪問A,但是由於網關作了DNAT,把全部訪問A的數據包的目的IP所有修改成B,那麼,你實際上訪問的是B。請求報文:修改目的IP---PREROUTING

iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22  -j DNAT --to-destination 10.0.1.22
相關文章
相關標籤/搜索