firewalld 是一種動態防火牆管理解決方案。Centos 7 預設使用 firewalld。firewalld 是對 iptables 的一個封裝,可以讓你更容易地管理 iptables 規則。它並不是 iptables 的替代品,雖然 iptables 命令仍可用於 firewalld,但建... ...
firewalld 是一種動態防火牆管理解決方案。Centos 7 預設使用 firewalld。firewalld 是對 iptables 的一個封裝,可以讓你更容易地管理 iptables 規則。它並不是 iptables 的替代品,雖然 iptables 命令仍可用於 firewalld,但建議 firewalld 時僅使用 firewalld 命令。 與 iptables 相比,我覺得 firewalld 更好用
用一個例子說明下。比如要開放 8080 埠。
- firewalld
firewalld-cmd --zone=public --add-port=5000/tcp --permanent
firewalld-cmd --reload
- iptables
iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
service iptables save
systemctl iptables restart
相比之下 firewalld
更容易看懂,且步驟更少,又不用重啟服務。 另外 firewalld
還有分區的概念容易整理一系列的埠。Centos 7 預設防火牆使用 Firewalld 還覺得挺好的。
安裝 firewalld
Centos 7 會預設安裝 firewalld,若卸載了要重新安裝
yum -y install firewalld
基本管理
- 啟動
systemctl start firewalld
- 設置開機啟動
systemctl enable firewalld
- 重啟
systemctl restart firewalld
- 關閉開機啟動
systemctl disable firewalld
- 查看狀態
systemctl status firewalld
或者firewall-cmd --state
區域(zones)
Firewalld 有區域(zones)的概念。這有什麼用呢?比如說,公共 WIFI 是不可信任的網路類型,而家庭網路幾乎是完全可信任。如果這兩者都採取相同的安全策略,就會有很多策略是冗餘的。根據網路的類型,將防火牆分成不同的區域有它存在的價值。而在firewalld
中會,會預先為你設定了很多個區域。 用下麵的語句可以看到所有的區域
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
其中從不信任到信任的排序是:
- drop(丟棄):最低級別的信任。任何接收的網路數據包都被丟棄,沒有任何回覆。僅能有發送出去的網路連接。
- block(限制):和上面相似,任何接收的網路連接都被
IPv4
的 icmp-host-prohibited (ping 不到) 信息和IPv6
的 icmp6-adm-prohibited 信息所拒絕 - public(公共):在公共區域內使用,不能相信網路內的其他電腦不會對您的電腦造成危害,只能接收經過選取的連接。
- external(外部):特別是為路由器啟用了偽裝功能的外部網。您不能信任來自網路的其他計算,不能相信它們不會對您的電腦造成危害,只能接收經過選擇的連接。
- dmz(非軍事區用):於您的非軍事區內的電腦,此區域內可公開訪問,可以有限地進入您的內部網路,僅僅接收經過選擇的連接。
- work(工作):用於工作區。您可以基本相信網路內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連接。
- home(家庭):用於家庭網路。您可以基本信任網路內的其他電腦不會危害您的電腦。僅僅接收經過選擇的連接。
- internal(內部):用於內部網路。您可以基本上信任網路內的其他電腦不會威脅您的電腦。僅僅接受經過選擇的連接。
- trusted(信任):可接受所有的網路連接
區域命令
獲取預設區域
sudo firewall-cmd --get-default-zone
public
查看所有區域的信息
sudo firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
...
獲取與 public 區域相關的信息
sudo firewall-cmd --list-all
或
sudo firewall-cmd --zone=public --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
當前活動區域
sudo firewall-cmd --get-active-zones
預設是沒有活動區域的,主要原因是沒有為該區域設置網路介面,設置了網路介面後就可以了
為區域設置網路介面
sudo firewall-cmd --change-interface=eth0 --zone=public --permanent
sudo firewall-cmd --reload
其中 firewall-cmd --reload
可以在不用重啟的情況重新載入配置 而 --permanent
的意思是持久化的配置, 機器重啟後規則依然能生效 至於如果看網路介面,可以用 ip addr
命令去看,其中lo
是本地迴環介面,其餘的不是。 提示:要註意切換介面的區域,如果網路介面切入到一個drop區域什麼的,會馬上連 ssh 都連不上,謹慎切換 然後再
sudo firewall-cmd --get-active-zones
public
interfaces: eth0
設置預設區域
如果你所有介面都用單區域去處理,那麼只需選擇預設區域就可以,而設置預設區域的命令是
sudo firewall-cmd --set-default-zone=public
通過網路介面找區域
firewall-cmd --get-zone-of-interface=eth0
public
通過區域找介面
firewall-cmd --zone=public --list-interfaces
eth0
區域的服務
獲取能添加的所有服務
服務挺多的
sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine ...
對應的文件在 /usr/lib/firewalld/services/
的文件夾中,每個服務都有一個 xml 文件來定義。比如 :https.xml 的文件
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Secure WWW (HTTPS)</short>
<description>HTTPS is a modified HTTP used to serve Web pages when security is important. Examples are sites that require logins like stores or web mail. This option is not required for viewing pages locally or developing Web pages. You need the httpd package installed for this option to be useful.</description>
<port protocol="tcp" port="443"/>
</service>
添加服務
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --reload
查看區域服務
sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http
移除服務
sudo firewall-cmd --permanent --zone=public --remove-service=http
sudo firewall-cmd --reload
區域的埠
添加埠
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --reload
埠後的協議可以是tcp
或者udp
添一段埠
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
查看埠
sudo firewall-cmd --zone=public --list-port
80/tcp
移除埠
sudo firewall-cmd --permanent --zone=public --remove-port=80/tcp
sudo firewall-cmd --reload
最後
我常用的命令就是以上幾種、另外 firewall 也有埠轉發、白名單、黑名單的功能,只是這些功能都有更好的替代品了,nginx 之類的。如果你想瞭解更多你可以看 firewall的官方文檔_firewalld)