紅帽7 Iptables與Firewalld防火墻
1、防火墻管理工具
防火墻作為公網與內網之間的保護屏障,在保障數據的安全性方面起著至關重要的作用。相較於企業內網,外部的公網環境更加惡劣,罪惡叢生。在公網與企業內網之間充當保護屏障的防火墻雖然有軟件或硬件之分,但主要功能都是依據策略對穿越防火墻自身的流量進行過濾。防火墻策略可以基於流量的源目地址、端口號、協議、應用等信息來定制,然後防火墻使用預先定制的策略規則監控出入的流量,若流量與某一條策略規則相匹配,則執行相應的處理,反之則丟棄。這樣一來,就可以保證僅有合法的流量在企業內網和外部公網之間流動了。
RHEL 7系統中,firewalld防火墻取代了iptables防火墻。其實,iptables與firewalld都不是真正的防火墻,它們都只是用來定義防火墻策略的防火墻管理工具而已,或者說,它們只是一種服務。iptables服務會把配置好的防火墻策略交由內核層面的netfilter網絡過濾器來處理,而firewalld服務則是把配置好的防火墻策略交由內核層面的nftables包過濾框架來處理。
2、Iptables
(1)策略與規則鏈
防火墻會從上至下的順序來讀取配置的策略規則,在找到匹配項後就立即結束匹配工作並去執行匹配項中定義的行為(即放行或阻止)。如果在讀取完所有的策略規則之後沒有匹配項,就去執行默認的策略。一般而言,防火墻策略規則的設置有兩種:一種是“通”(即放行),一種是“堵”(即阻止)。當防火墻的默認策略為拒絕時(堵),就要設置允許規則(通),否則誰都進不來;如果防火墻的默認策略為允許時,就要設置拒絕規則,否則誰都能進來,防火墻也就失去了防範的作用。
iptables服務把用於處理或過濾流量的策略條目稱之為規則,多條規則可以組成一個規則鏈,而規則鏈則依據數據包處理位置的不同進行分類,具體如下:
在進行路由選擇前處理數據包(PREROUTING);
處理流入的數據包(INPUT);
處理流出的數據包(OUTPUT);
處理轉發的數據包(FORWARD);
在進行路由選擇後處理數據包(POSTROUTING)。
一般來說,從內網向外網發送的流量一般都是可控且良性的,因此我們使用最多的就是INPUT規則鏈。對於用什麽動作處理進來匹配的流量,這些動作對應到iptables服務的術語中分別是ACCEPT(允許流量通過)、REJECT(拒絕流量通過)、LOG(記錄日誌信息)、DROP(拒絕流量通過)。“允許流量通過”和“記錄日誌信息”都比較好理解,這裏需要著重講解的是REJECT和DROP的不同點。就DROP來說,它是直接將流量丟棄而且不響應;REJECT則會在拒絕流量後再回復一條“您的信息已經收到,但是被扔掉了”信息,從而讓流量發送方清晰地看到數據被拒絕的響應信息。
(2)基本的命令參數
ptables命令可以根據流量的源地址、目的地址、傳輸協議、服務類型等信息進行匹配,一旦匹配成功,iptables就會根據策略規則所預設的動作來處理這些流量。另外,再次提醒一下,防火墻策略規則的匹配順序是從上至下的,因此要把較為嚴格、優先級較高的策略規則放到前面,以免發生錯誤。
iptables中常用的參數以及作用
參數 | 作用 |
-P | 設置默認策略 |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I num | 在規則鏈的頭部加入新規則 |
-D num | 刪除某一條規則 |
-s | 匹配來源地址IP/MASK,加嘆號“!”表示除這個IP外 |
-d | 匹配目標地址 |
-i 網卡名稱 | 匹配從這塊網卡流入的數據 |
-o 網卡名稱 | 匹配從這塊網卡流出的數據 |
-p | 匹配協議,如TCP、UDP、ICMP |
--dport num | 匹配目標端口號 |
--sport num | 匹配來源端口號 |
在iptables命令後添加-L參數查看已有的防火墻規則鏈:
[root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere INPUT_direct all -- anywhere anywhere INPUT_ZONES_SOURCE all -- anywhere anywhere INPUT_ZONES all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-host-prohibited ………………省略部分輸出信息………………
在iptables命令後添加-F參數清空已有的防火墻規則鏈:
[root@localhost Desktop]# iptables -F [root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ………………省略部分輸出信息………………
把INPUT規則鏈的默認策略設置為拒絕:
[root@localhost Desktop]# iptables -P INPUT DROP [root@localhost Desktop]# iptables -L Chain INPUT (policy DROP) target prot opt source destination …………省略部分輸出信息………………
如前面所提到的防火墻策略設置無非有兩種方式,一種是“通”,一種是“堵”,當把INPUT鏈設置為默認拒絕後,就要往裏面寫入允許策略了,否則所有流入的數據包都會被默認拒絕掉,而且規則鏈的默認策略拒絕動作只能是DROP,而不能是REJECT。
向INPUT鏈中添加允許ICMP流量進入的策略規則:
在日常工作中,經常會使用ping命令來檢查對方主機是否在線,而向防火墻的INPUT規則鏈中添加一條允許ICMP流量進入的策略規則就默認允許了這種ping命令檢測行為。
沒有添加規則前,ping不通
[root@localhost Desktop]# ping -c 4 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. --- 192.168.10.10 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3000ms
添加規則後
[root@localhost Desktop]# iptables -I INPUT -p icmp -j ACCEPT //-j表示該做什麽處理,在INPUT的頭部添加一條允許ICMP流量進入的規則 [root@localhost Desktop]# ping -c 4 192.168.10.10 PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data. 64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.039 ms 64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.039 ms 64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.088 ms 64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.095 ms --- 192.168.10.10 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 0.039/0.065/0.095/0.026 ms
刪除INPUT規則鏈中剛剛加入的那條策略(允許ICMP流量),並把默認策略設置為允許:
[root@localhost Desktop]# iptables -D INPUT 1 [root@localhost Desktop]# iptables -P INPUT ACCEPT [root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination
………………省略部分輸出信息………………
將INPUT規則鏈設置為只允許指定網段的主機訪問本機的22端口,拒絕來自其他所有主機的流量:
[root@localhost Desktop]# iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT [root@localhost Desktop]# iptables -A INPUT -p tcp --dport 22 -j REJECT [root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
規則匹配是從上到下的,匹配到第一條後,下面的就不會匹配,因此一定要把允許動作放到拒絕動作前面,否則所有的流量就將被拒絕掉,從而導致任何主機都無法訪問我們的服務。
在設置完上述INPUT規則鏈之後,我們使用IP地址在192.168.10.0/24網段內的主機訪問服務器(即前面提到的設置了INPUT規則鏈的主機)的22端口。
[root@localhost Desktop]# ssh 192.168.10.10 root@192.168.10.10‘s password: Last login: Wed Sep 19 18:18:51 2018 from 192.168.10.10 [root@localhost ~]# exit logout Connection to 192.168.10.10 closed. [root@localhost Desktop]#
然後,我們再使用IP地址在192.168.20.0/24網段內的主機訪問服務器的22端口(雖網段不同,但已確認可以相互通信),效果如下,就會提示連接請求被拒絕了(Connection failed):
向INPUT規則鏈中添加拒絕所有人訪問本機12345端口的策略規則:
[root@localhost Desktop]# iptables -I INPUT -p tcp --dport 12345 -j REJECT [root@localhost Desktop]# iptables -I INPUT -p udp --dport 12345 -j REJECT [root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable
………………省略部分輸出信息………………
向INPUT規則鏈中添加拒絕192.168.10.5主機訪問本機80端口(Web服務)的策略規則:
[root@localhost Desktop]# iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT [root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- 192.168.10.5 anywhere tcp dpt:http reject-with icmp-port-unreachable REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable ………………省略部分輸出信息………………
向INPUT規則鏈尾部中添加拒絕所有主機訪問本機1000~1024端口的策略規則:
[root@localhost Desktop]# iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT [root@localhost Desktop]# iptables -A INPUT -p udp --dport 1000:1024 -j REJECT [root@localhost Desktop]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination REJECT tcp -- 192.168.10.5 anywhere tcp dpt:http reject-with icmp-port-unreachable REJECT udp -- anywhere anywhere udp dpt:italk reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpt:italk reject-with icmp-port-unreachable ACCEPT tcp -- 192.168.10.0/24 anywhere tcp dpt:ssh REJECT tcp -- anywhere anywhere tcp dpt:ssh reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere tcp dpts:cadlock2:1024 reject-with icmp-port-unreachable REJECT udp -- anywhere anywhere udp dpts:cadlock2:1024 reject-with icmp-port-unreachable
使用iptables命令配置的防火墻規則默認會在系統下一次重啟時失效,如果想讓配置的防火墻策略永久生效,還要執行保存命令:
[root@localhost Desktop]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
3.Firewalld
RHEL 7系統中集成了多款防火墻管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系統的動態防火墻管理器)服務是默認的防火墻配置管理工具,它擁有基於CLI(命令行界面)和基於GUI(圖形用戶界面)的兩種管理方式。firewalld支持動態更新技術並加入了區域(zone)的概念。簡單來說,區域就是firewalld預先準備了幾套防火墻策略集合(策略模板),用戶可以根據生產場景的不同而選擇合適的策略集合,從而實現防火墻策略之間的快速切換。
firewalld中常用的區域名稱及策略規則
區域 | 默認規則策略 |
trusted | 允許所有的數據包 |
home | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則允許流量 |
internal | 等同於home區域 |
work | 拒絕流入的流量,除非與流出的流量數相關;而如果流量與ssh、ipp-client與dhcpv6-client服務相關,則允許流量 |
public | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、dhcpv6-client服務相關,則允許流量 |
external | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
dmz | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
block | 拒絕流入的流量,除非與流出的流量相關 |
drop | 拒絕流入的流量,除非與流出的流量相關 |
(1)終端管理工具
命令行終端是一種極富效率的工作方式,firewall-cmd是firewalld防火墻配置管理工具的CLI(命令行界面)版本。它的參數一般都是以“長格式”來提供的。RHEL 7系統支持部分命令的參數補齊,除了能用Tab鍵自動補齊命令或文件名等內容之外,還可以用Tab鍵來補齊參數
firewall-cmd命令中使用的參數以及作用
參數 | 作用 |
--get-default-zone | 查詢默認的區域名稱 |
--set-default-zone=<區域名稱> | 設置默認的區域,使其永久生效 |
--get-zones | 顯示可用的區域 |
--get-services | 顯示預先定義的服務 |
--get-active-zones | 顯示當前正在使用的區域與網卡名稱 |
--add-source= | 將源自此IP或子網的流量導向指定的區域 |
--remove-source= | 不再將源自此IP或子網的流量導向某個指定區域 |
--add-interface=<網卡名稱> | 將源自該網卡的所有流量都導向某個指定區域 |
--change-interface=<網卡名稱> | 將某個網卡與區域進行關聯 |
--list-all | 顯示當前區域的網卡配置參數、資源、端口以及服務等信息 |
--list-all-zones | 顯示所有區域的網卡配置參數、資源、端口以及服務等信息 |
--add-service=<服務名> | 設置默認區域允許該服務的流量 |
--add-port=<端口號/協議> | 設置默認區域允許該端口的流量 |
--remove-service=<服務名> | 設置默認區域不再允許該服務的流量 |
--remove-port=<端口號/協議> | 設置默認區域不再允許該端口的流量 |
--reload | 讓“永久生效”的配置規則立即生效,並覆蓋當前的配置規則 |
--panic-on | 開啟應急狀況模式 |
--panic-off | 關閉應急狀況模式 |
與Linux系統中其他的防火墻策略配置工具一樣,使用firewalld配置的防火墻策略默認為運行時(Runtime)模式,又稱為當前生效模式,而且隨著系統的重啟會失效。如果想讓配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常設置防火墻策略時添加--permanent參數,這樣配置的防火墻策略就可以永久生效了。但是,使用它設置的策略只有在系統重啟之後才能自動生效。如果想讓配置的策略立即生效,需要手動執行firewall-cmd --reload命令。
查看firewalld服務當前所使用的區域:
[root@localhost Desktop]# firewall-cmd --get-default-zone public
查詢eno16777728網卡在firewalld服務中的區域:
[root@localhost Desktop]# firewall-cmd --get-zone-of-interface=eno16777728 public
把firewalld服務中eno16777728網卡的默認區域修改為external,並在系統重啟後生效。分別查看當前與永久模式下的區域名稱:
[root@localhost Desktop]# firewall-cmd --permanent --zone=external --change-interface=eno16777728 success [root@localhost Desktop]# firewall-cmd --get-zone-of-interface=eno16777728 public
重啟後
[root@localhost Desktop]# firewall-cmd --get-zone-of-interface=eno16777728 external [root@localhost Desktop]# firewall-cmd --permanent --get-zone-of-interface=eno16777728 external
把firewalld服務的當前默認區域設置為public:
[root@localhost Desktop]# firewall-cmd --set-default-zone=public success [root@localhost Desktop]# firewall-cmd --get-default-zone public
啟動/關閉firewalld防火墻服務的應急狀況模式,阻斷一切網絡連接(當遠程控制服務器時請慎用):
[root@localhost Desktop]# firewall-cmd --panic-on success [root@localhost Desktop]# firewall-cmd --panic-off success
紅帽7 Iptables與Firewalld防火墻