linux下的防火牆

Firewall是一種隔離工具,工作於主機或網絡的邊緣,對經由的報文根據預先定義的規則(識別條件)進行檢測,對於能夠被規則匹配到的報文實行某預定義的處理機制的一套組件,主要有以下四種:

硬件防火牆:在硬件級別能部分防火牆,另一部分功能基於軟件實現; 
軟件防火牆:應用軟件處理邏輯運行通用硬件實現的防火牆;
主機防火牆:服務範圍爲當前主機;
網絡防火牆:服務範圍爲局域網;

本文將介紹的是防火牆工具iptables。

1.iptables結構

iptables由五個表和五個鏈以及一些規則組成:
五個表table:filter、nat、mangle、raw、security:

filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包,filter表是默認規則表
nat表:network address translation 地址轉換規則表
mangle:修改數據標記位規則表
raw:關閉NAT表上啓用的連接跟蹤機制,加快封包穿越防火牆速度
security:用於強制訪問控制(MAC)網絡規則,由Linux安全模塊(如SELinux)實現
優先級由高到低的順序爲:security -->raw-->mangle-->nat-->filter

五個內置鏈chain:

INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

對於網絡中的報文,分爲兩種,一種是到本主機的報文,一種是經由本主機的轉發報文,對於到本主機的報文,在內核中的傳輸過程是這樣的,首先數據包會PREROUTING進入主機,在內核中進入tcp/ip協議棧,在這裏會檢查這個數據包的目的ip,查看是否是發送給本主機的,如果是發送給本主機的,會進入INPUT鏈,

2.iptables基本語法匹配規則

iptables的語法主要有三部分,第一部分是定義操作,第二不會是檢查條件,第三步是是處理動作。
首先說一下對鏈的操作:

-P 定義某張表的某條鏈的默認策略
-N 新建一條自定義的規則鏈,但自定義規則鏈只有在被主鏈調用時才能生效
-X 刪除引用數爲0的自定義規則鏈
-F 清空某張表的某條鏈,不指定是清空某張表的所有的表規則
-E 重命名某條引用爲0的自定義規則鏈
-L 列出某張表某條鏈的所以規則,不指定時列出所有的表規則
-v 詳細顯示錶規則
-n 不進行地址解析

操作有以下幾個選項:

-A 追加,在某一表的某一條鏈上追加一條規則
-I 插入,在某一張表的某一條鏈的特定位置插入一條規則
-D 刪除,刪除某一個表的某一條鏈的規則
-R 替換,用某一條規則替換掉某張表的某條規則

檢查條件有一下幾項:

-s 檢查報文中的源ip地址是否符合此處指定的ip地址範圍
-d 檢查報文中的目的ip地址是否符合此處指定的ip地址範圍
-i 檢查報文的流入藉口
-o 檢查報文的流出藉口
-p 檢查報文的協議是否符合此處指定的協議

1.主鏈
可以看下面這些例子:
查看filter表的表規則:
linux下的防火牆
我們先保證ssh能夠連接,這樣不管我們怎麼修改,都不會讓我們的xshell連接不上,命令如下:

 iptables -t filter -A INPUT 1 -d 192.168.123.44/24 -p tcp -i ens34 --dport 22 -j ACCEPT
 iptables -t filter -A OUTPUT -s 192.168.123.44/24 -p tcp -o ens34 --sport 22 -j ACCEPT

執行結果如下:
linux下的防火牆
然後把默認規則設置爲DROP,表的默認規則只能是DROP和ACCEPT,不能是REJECT,命令如下:

 iptables -t filter -P INPUT DROP
 iptables -t filter -P OUTPUT DROP
 iptables -t filter -P FORWARD DROP

執行結果如下:
linux下的防火牆
然後訪問本機的http服務,命令如下:

curl http://192.168.123.44/hello.html

執行結果如下:
linux下的防火牆
因爲防火牆只允許通往192.168.123.44的ssh服務通過,默認策略又是拒絕的,這裏訪問http服務的包會被丟掉。
我們修改防火牆策略,將http服務設置爲允許,命令如下:

iptables -t filter -A INPUT -p tcp -d 192.168.123.44 --dport 80 -j ACCEPT 
iptables -t filter -A OUTPUT -p tcp -s 192.168.123.44 --sport 80 -j ACCEPT 

分別在centos6(192.168.123.22)和本機(192.168.123.44)訪問,結果如下:
centos6:
linux下的防火牆
centos7:
linux下的防火牆
然後開放允許本機訪問,命令如下:

iptables -A  INPUT  -p tcp -s 192.168.123.44 -d 192.168.123.44  -j ACCEPT 
iptables -A  OUTPUT  -p tcp -d 192.168.123.44  -s 192.168.123.44 -j ACCEPT 

執行結果如下:
linux下的防火牆
防火牆策略入下:
linux下的防火牆
對於訪問本機的http服務,數據流是這樣的,請求報文開一個隨機端口,從OUTPUT鏈流出,出POSTROUTING鏈出,從PREROUTING進到INPUT80端口,然後從80出進入隨機端口。所有本機訪問時要把本機對本機的隨機端口的訪問打開。
雖然對於白名單和黑名單來說,白名單相對來說安全的多,但是當我們的服務是一個開放的文件共享服務如samba或者http服務,那麼白名單就不適合了,黑名單更加實用,而且我們不要把鏈的默認規則設置爲禁止訪問,如果這樣做,當我們清空防火牆時,會發現我們的ssh也連接不上了。
2.自建鏈
自建鏈單獨自己是不能生效的,必須要主鏈調用才能生效,我們可以用下面命令來創建一條自定義鏈,並且調用他:

iptables -t filter -N can
iptables -A can -j REJECT
iptables -A INPUT -j can

結果如下:
linux下的防火牆
然後本機訪問自己的http服務:
linux下的防火牆
一條被調用的自定義鏈不能被刪除,一條有規則的鏈也不能被刪除,只有刪除所有的調用,並且清空規則的自定義才能被刪除:
linux下的防火牆

3.iptables擴展匹配

基本的擴展規則在對一條普通的報文還可行,但是對於ftp數據包無能爲力,同時如果本機有多重服務,每個服務都有大量的訪問量時,一條一條的規則匹配會浪費大量的時間,使用擴展匹配條件能夠幫助我們減少規則數,提高用戶的訪問速率。

1.隱式擴展

不用-m選項指出matchname即可使用此match的專用選項進行匹配
1.tcp擴展
--source-port,--sport 端口,--destination-port,--dport 端口,在這裏指定-p tcp時隱含包括了-m tcp ;--sport匹配傳輸層源端口,--dport匹配傳輸層目的端口,例如:

iptables -t filter -A INPUT -p tcp --dport 20:80 -d 192.168.123.44 -j REJECT

這樣20到80的所有端口都不能被訪問了,結果如下:
linux下的防火牆
使用ssh和http在centos6(192.168.123.22)上測試,結果如下:
linux下的防火牆
--tcp-flags 標誌位列表 必須爲1的標誌位列表,餘下出現在前面的標誌位列表必須爲0
tcp的幾個標誌位:SYN,ACK,FIN,RST,URG,PSH;
SYN表示請求序列
ACK迴應的序列
FIN表示開始斷開
RST復位標誌
URG緊急標誌位
PSH標誌置位時,接收端不將該數據進行隊列處理,而是儘可能快將數據轉由應用處理。
例如阻斷tcp連接的首次連接:

iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT 

結果如下:
linux下的防火牆
用本機測試http服務:
linux下的防火牆
--syn:
相當於--tcp-flags SYN,ACK,FIN,RST SYN
2.udp擴展
--source-port,--sport port 端口,匹配報文中傳輸層的源端口
--destination-port,--dport port 端口匹配報文中傳輸層的目標端口,這裏是使用UDP協議時隱含包括了-m udp
3.icmp擴展
icmp擴展,指定-p icmp時,隱含了-m icmp,語法是--icmp-type 報文類型,請求報文類型是8,響應報文類型是0,例如:
在centos7上的INPUT鏈關閉請求報文,命令如下:

 iptables -t filter -A INPUT -p icmp --icmp-type 8 -j REJECT 

結果如下:
linux下的防火牆
在centos6(192.168.123.22)上pingcentos7(192.168.123.44)結果如下:
linux下的防火牆
顯示到達不了目標主機,可以證明防火牆生效了。

2.顯式擴展

必須使用-m選項指出matchname,有的match可能存在專用的選項
1.multiport擴展
multiport擴展的目的是以離散或連續的方式定義多端口匹配條件,語法如下:
--source-ports,--sports port[,port|,port:port]...:指定多個源端口;
--destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
--ports port[,port|,port:port]...:指定多個端口;
例如指定目的端口爲centos7的20到80還有3306端口,命令如下:

iptables -A INPUT -p tcp -m multiport --dports 20:80,3306 -j ACCEPT
iptables -A INPUT -j REJECT

結果如下:
linux下的防火牆
在centos6(192.168.123.22)上分別訪問centos7(192.168.123.44)上的ssh服務和http服務:
ssh:
linux下的防火牆
http:
linux下的防火牆
2.iprange擴展
iprange以連續的ip地址範圍指明連續的多地址匹配條件,語法如下:
--src-range 地址範圍 -------------------用來匹配源IP地址;
--dst-range 地址範圍 -------------------用來匹配目標IP地址;
例如允許192.168.123.1-192.168.123.33的地址訪問centos7的http服務,命令如下:

iptables -t filter -I INPUT 2 -p tcp -m iprange --src-range 192.168.123.1-192.168.123.33 --dport 80 -j ACCEP

結果如下:
linux下的防火牆
分別在centos6(192.168.123.22)上分別訪問centos7(192.168.123.44)上訪問centos7的http服務:
centos6:
linux下的防火牆
centos7:
linux下的防火牆
3.set擴展
set擴展依賴於ipset命令行工具,set擴展的目的就是解決離散型ip地址的匹配問題,首先是利用ipset生成一個ip地址表,命令如下:

ipset create httplist hash:net maxelem 1000
ipset add httplist 192.168.123.22

執行結果如下:
linux下的防火牆
然後將這張表添加進防火牆規則,命令如下:

iptables -I INPUT 2 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT

-m指定擴展的模塊,--match-set指定ip地址表,src/dst指定是源海市目的地址列表
結果如下:

linux下的防火牆
分別在centos6(192.168.123.22)上分別訪問centos7(192.168.123.44)上訪問centos7的http服務:
centos6:
linux下的防火牆
centos7:linux下的防火牆
4.string擴展
string擴展是對報文中的應用層數據做字符串匹配檢測,語法爲:
--string pattern:要檢測字符串模式;
--algo {bm|kmp}
例如我們對centos7上的hello.html網站進行過濾,命令如下:

iptables -I INPUT 2 -p tcp -m string --algo bm --string hello -j REJECT

結果如下:
linux下的防火牆
使用本機訪問hello.html:
linux下的防火牆
5.time擴展
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...]

--kerneltz:使用內核中配置的時區
6.connlimit擴展
--connlimit-upto n:連接數數量小於等於n,此時應該允許;
--connlimit-above n:連接數數量大於n,此時應該拒絕;
7.limit擴展
--limit rate[/second|/minute|/hour|/day]:平均速率
--limit-burst number:峯值速率
8.state擴展

4.保存,重載和優化

iptables-save > /PATH/TO/SOME_RULE_FILE
iptables-restore < /PATH/FROM/SOME_RULE_FILE

CentOS 6:
        保存規則:
                service iptables save
                自動保存規則至/etc/sysconfig/iptables文件中;
        重載規則:
                server iptables restore
                從/etc/sysconfig/iptables文件中重載規則; 
規則優化:
        (1) 可安全放行所有入站及出站,且狀態爲ESTABLISHED的連接;
        (2) 服務於同一類功能的規則,匹配條件嚴格的放前面,寬鬆放後面;
        (3) 服務於不同類功能的規則,匹配報文可能性較大擴前面,較小放後面;
        (4) 設置默認策略;
        (a) 最後一條規則設定;
        (b) 默認策略設定; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章