linux下的防火墻
硬件防火墻:在硬件級別能部分防火墻,另一部分功能基於軟件實現;
軟件防火墻:應用軟件處理邏輯運行通用硬件實現的防火墻;
主機防火墻:服務範圍為當前主機;
網絡防火墻:服務範圍為局域網;
本文將介紹的是防火墻工具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表的表規則:
我們先保證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
執行結果如下:
然後把默認規則設置為DROP,表的默認規則只能是DROP和ACCEPT,不能是REJECT,命令如下:
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
執行結果如下:
然後訪問本機的http服務,命令如下:
curl http://192.168.123.44/hello.html
執行結果如下:
因為防火墻只允許通往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:
centos7:
然後開放允許本機訪問,命令如下:
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
執行結果如下:
防火墻策略入下:
對於訪問本機的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
結果如下:
然後本機訪問自己的http服務:
一條被調用的自定義鏈不能被刪除,一條有規則的鏈也不能被刪除,只有刪除所有的調用,並且清空規則的自定義才能被刪除:
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的所有端口都不能被訪問了,結果如下:
使用ssh和http在centos6(192.168.123.22)上測試,結果如下:
--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
結果如下:
用本機測試http服務:
--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
結果如下:
在centos6(192.168.123.22)上pingcentos7(192.168.123.44)結果如下:
顯示到達不了目標主機,可以證明防火墻生效了。
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
結果如下:
在centos6(192.168.123.22)上分別訪問centos7(192.168.123.44)上的ssh服務和http服務:
ssh:
http:
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
結果如下:
分別在centos6(192.168.123.22)上分別訪問centos7(192.168.123.44)上訪問centos7的http服務:
centos6:
centos7:
3.set擴展
set擴展依賴於ipset命令行工具,set擴展的目的就是解決離散型ip地址的匹配問題,首先是利用ipset生成一個ip地址表,命令如下:
ipset create httplist hash:net maxelem 1000
ipset add httplist 192.168.123.22
執行結果如下:
然後將這張表添加進防火墻規則,命令如下:
iptables -I INPUT 2 -p tcp --dport 80 -m set --match-set httplist src -j ACCEPT
-m指定擴展的模塊,--match-set指定ip地址表,src/dst指定是源海市目的地址列表
結果如下:
分別在centos6(192.168.123.22)上分別訪問centos7(192.168.123.44)上訪問centos7的http服務:
centos6:
centos7:
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
結果如下:
使用本機訪問hello.html:
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) 默認策略設定;
linux下的防火墻