防火牆做爲保護服務器不受外部網絡流量影響的一種方式。可讓用戶定義一系列規則來控制外部網絡中流入的流量,從而達到容許或阻塞的效果。firewalld
是防火牆服務的一個守護程序,實現了動態修改擁有 D-Bus
接口基於主機的防火牆,也就是說在不須要重啓防火牆程序的基礎上,就能夠實現對防火牆規則,增、刪、改的操做。html
firewalld
提供了域(Zone)和服務(Services)的概念,來簡化流量的管理操做。在本篇文章中,會依次介紹這些概念,並記錄一些常見防火牆的操做方法。python
在閱讀後,應該掌握以下的概念:linux
其實 Zone 就是爲了方便預先定義好的一組規則,讓用戶根據當前服務器所在網絡中的位置(內網,公網)的受信任程度來選取不一樣 Zone 默認規則。但須要注意的是,一個網絡鏈接只能被一個 zone 處理,但一個 zone 能夠用於多個網絡鏈接。shell
預先定義的 zone 規則被放在 /usr/lib/firewalld/zones/
目錄下。當修改 zone 的規則時,這些 zone 會被拷貝到 /etc/firewalld/zones/
目錄下,實際生效的防火牆會在該目錄下的文件。centos
對於每個 zone 都有一個默認的行爲(target),來處理流入的流量。每一個 target 會有四個選項:default
, ACCEPT
, REJECT
和 DROP
.服務器
ACCEPT
除了被明確寫好的規則,會接受全部流入的數據包。網絡
REJECT
除了被明確寫好容許的規則,會拒絕全部流入的數據包, 會給發起鏈接的機器回覆被拒絕的消息。ssh
DROP
除了被明確寫好容許的規則,會拒絕全部流入的數據包, 不會給發起鏈接的機器回覆任何消息。tcp
下面是對常見 Zone 的一些描述:ide
Zone 名稱 | Zone 描述 |
---|---|
block | 全部進入的網絡鏈接都會被拒絕。對於 IPV4,回覆 icmp-host-prohibited 消息。對於 IPV6,回覆 icmp6-adm-prohibited 消息。只有由內部發起的網絡鏈接能夠通行。 |
dmz | 對於在非軍事區域的服務器,外部網絡能夠在受限制的狀況下進入內網,只有特定的網絡鏈接請求被接受。 |
drop | 全部的進入的網絡包都會被丟掉,而且沒有任何的迴應。只有向發起的鏈接請求能夠被放行。 |
external | 用於開始假裝的外部網絡,特別是做爲路由器。任務外部的網絡會損壞你的計算機,只有特定的網絡鏈接請求被接受。 |
home | 在家使用,信任網絡上的大多數計算機。只有特定的網絡鏈接請求被接受。 |
internal | 在內部網絡使用,信任當前網絡下其餘的計算機。只有特定的網絡鏈接請求被接受。 |
public | 在公共網絡使用,不信任網絡上的其餘計算機。只有特定的網絡鏈接請求被接受。 |
trusted | 全部的網絡鏈接都會被接受。 |
work | 在工做網絡中使用,信任網絡上的其餘計算機。只有特定的網絡鏈接請求被接受。 |
簡單看一下配置的具體內容,把上面 target 和 zone 的概念聯在一塊兒:
target 表示當發來的數據包,沒有匹配到任何的規則(好比端口號,服務等),採起的默認行爲。
short 表示對 zone 的一個簡短描述名字。
description 表示對 zone 的一段詳細描述。
# 獲取默認域 (base) [root@localhost zones]# firewall-cmd --get-default-zone public # 查詢存在的全部域 (base) [root@localhost zones]# firewall-cmd --get-zones block dmz drop external home internal public trusted work # 設置默認域 (base) [root@localhost zones]# firewall-cmd --set-default-zone=public # 查詢某個域下的配置 (base) [root@localhost zones]# firewall-cmd --zone=public --list-all # 查詢指定網卡的域 (base) [root@localhost zones]# firewall-cmd --get-zone-of-interface=ens192 public # 爲某個網卡指定域 (base) [root@localhost zones]# firewall-cmd --zone=public --add-interface=ens33 # 修改網卡的域 (base) [root@localhost zones]# firewall-cmd --zone=block --change-interface=ens37 # 刪除指定網卡的域 (base) [root@localhost zones]# firewall-cmd --zone=block --remove-interface=ens37 # 查詢系統中正在使用的域 firewall-cmd --get-active-zones
Services 在網絡通訊時,須要使用一個或者多個端口,地址。防火牆會基於端口來對通訊的內容進行過濾。若是一個服務想要容許網絡的流量進入,必須打開端口。firewalld
會默認的阻斷全部未被顯式打開的端口。換成本身的理解來講,在服務器提供的一些服務,經常須要打開不少端口,而且會限制一些源和目的 IP 甚至一些協議的訪問,若是把這些同時都定義在 zone 中,會形成最後的 zone 配置文件很大,提取成 services 至關因而解耦的概念,有利於後期的維護。
和 zone 相似,在 /usr/lib/firewalld/services/
目錄中存放着一些默認的 services 配置,在 services 被修改或者添加時,這裏的文件會被做爲參考。目前正被使用的 services 配置會在 /etc/firewalld/services/
目錄。
# 查看正在使用的服務: (base) [root@localhost firewalld]# firewall-cmd --list-services ssh dhcpv6-client http https # 查看服務的被使用狀況,能夠看到 zone 文件中引入了 services: (base) [root@localhost firewalld]# cat zones/public.xml <?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="http"/> <service name="https"/> <port protocol="tcp" port="8080"/> <port protocol="tcp" port="3306"/> </zone> # 使用 service: firewall-cmd --add-service=http --permanent # 查看預先定義的 services: firewall-cmd --get-services # 增長一個空 services: firewall-cmd --permanent --new-service=service-name.xml # 增長和某個 services 相同的配置: firewall-cmd --permanent --new-service-from-file=/etc/firewalld/services/service-name.xml --name service-name1.xml # 修改 services 配置: firewall-cmd --permanent --service=myservice --set-description=description firewall-cmd --permanent --service=myservice --set-short=description firewall-cmd --permanent --service=myservice --add-port=portid[-portid]/protocol firewall-cmd --permanent --service=myservice --add-protocol=protocol firewall-cmd --permanent --service=myservice --add-source-port=portid[-portid]/protocol firewall-cmd --permanent --service=myservice --add-module=module firewall-cmd --permanent --service=myservice --set-destination=ipv:address[/mask]
打開端口的方式,除了使用上面的 services ,也可使用 port 直接添加:
# 端口操做,直接在 zone 的級別進行更改 # 查看並無 http 端口 sudo firewall-cmd --list-ports # 增長 80 端口 sudo firewall-cmd --add-port=80/tcp # 永久增長 80 端口 firewall-cmd --add-port=80/tcp --permanent # 刪除端口 firewall-cmd --zone=public --remove-port=8080/tcp # 將修改後的某些配置持久化保存: firewall-cmd --runtime-to-permanent # 其餘查詢端口的一些方式 netstat -ap | grep 8080 lsof -i:6800 # centos 7 ss -ant # centos 7 before netstat -ant
防火牆的運行相關操做:
# 查詢防火牆狀態 systemctl status firewalld # 打開防火牆 systemctl start firewalld # 在修改配置後,重載防火牆 firewall-cmd --reload # 添加直接規則,例如 Keepalived。這裏須要注意的是,當使用 zone 和 services 都沒法知足要求時,再採用直接添加的方案。 firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface ens192 --destination 224.0.0.18 --protocol vrrp -j ACCEPT # 查詢配置的規則 firewall-cmd --direct --get-all-chains firewall-cmd --direct --get-all-rules
遇到緊急狀況的操做:
# 在遇到服務器正在被攻擊時,切斷全部網絡鏈接 firewall-cmd --panic-on # 恢復至正常的防火牆設置 firewall-cmd --panic-off # 查詢 panic mode 是否開啓 firewall-cmd --query-panic