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" encodi