sudo systemctl start firewalld
启动服务。
sudo systemctl enable firewalld
服务开机自启动。
sudo systemctl stop firewalld
停止服务。
sudo systemctl disable firewalld
取消开机自启动。
sudo systemctl status firewalld
查看 firewalld 守护进程的状态。
sudo firewall-cmd --state
检查防火墙状态。输出应该是 running 或者 not running 。
sudo firewall-cmd --reload
重新加载 firewalld 配置。
firewalld 使用 XML 进行配置,配置文件位于两个目录中:
firewalld 使用 runtime 和 persistent 两个配置集。系统重新启动或 firewalld-cmd --reload
时,不会保留 runtime 的配置更改,而对 persistent 配置集的更改不会应用于正在运行的系统。
默认情况下,firewall-cmd 命令适用于 runtime 配置,但在命令后加 --permanent 参数可以将配置保存到 persistent 配置中。要添加和激活 persistent 规则,可以使用下面两种方法之一。
将规则同时添加到 runtime 和 persistent 规则集中:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=http
将规则添加到 persistent 规则集中并重载 firewalld:
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload
--reload 命令会删除所有 runtime 配置并应用 persistent 配置。又因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。
zone ( 区域 ) 是针对给定位置或场景 ( 例如家庭、公共、受信任等 ) 可能具有的各种信任级别的预构建规则集。不同的 zone 允许不同的网络服务和入站流量类型,而拒绝其他任何流量。首次启用 firewalld 后, public 将是默认 zone。
zone 也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal zone 上允许 DHCP,但在 external zone 仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认 ( public ) zone。
sudo firewall-cmd --get-default-zone
会输出默认 zone。
sudo firewall-cmd --set-default-zone=internal
可以修改默认 zone。
sudo firewall-cmd --get-active-zones
查看网络接口使用的 zone。
sudo firewall-cmd --zone=public --list-all
显示特定 zone 的所有配置。
sudo firewall-cmd --list-all-zones
显示所有 zone 的配置。
firewalld 可以根据特定网络 service 的预定义规则来允许相关流量。用户可以创建自己的系统规则,并将它们添加到任何 zone。默认支持的 service 的配置文件位于 /usr/lib/firewalld/services,用户创建的服务文件要被放在 /etc/firewalld/services 中。
sudo firewall-cmd --get-services
查看默认的可用 service。
sudo firewall-cmd --zone=public --add-service=http --permanent
启用名为 http 的服务。
sudo firewall-cmd --zone=public --remove-service=http --permanent
禁用名为 http 的服务。
sudo firewall-cmd --list-ports
显示目前已经被允许连接的端口及对应协议。
sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent
允许 12345 端口的 TCP 流量。
sudo firewall-cmd --zone=public --add-port=12345/udp --permanent
允许 12345 端口的 UDP 流量。
sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent
禁用 12345 端口的 TCP 流量。
sudo firewall-cmd --zone=public --remove-port=12345/udp --permanent
禁用 12345 端口的 UDP 流量。
将本机 80 端口的流量转发到本机 12345 端口:
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345
将本机流量转发到另外一台服务器上:
在需要的区域中激活 masquerade:
sudo firewall-cmd --zone=public --add-masquerade
添加转发规则。比如,将本机 80 端口的流量转发到 IP 地址为 123.456.78.9 的服务器的 8080 端口上。
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9
删除规则,用 --remove 替换 --add 。比如: sudo firewall-cmd --zone=public --remove-masquerade
给一个例子,使用 firewalld 构建一个新的 zone 并配置其中的规则:
将 eth0 的默认区域设置为 dmz。在所提供的默认区域中,dmz ( 非军事区 ) 是最适合于这个程序的,因为它只允许 SSH 和 ICMP。
sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0
把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中:
sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent
重新加载 firewalld 让规则立即生效:
sudo firewall-cmd --reload
如果运行 firewall-cmd --zone=dmz --list-all
会有下面的输出:
dmz (default)
interfaces: eth0
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
输出显示,dmz zone 是默认 zone,它被用于 eth0 接口中所有网络的源地址和端口。允许传入 HTTP ( 端口 80 )、HTTPS ( 端口 443 ) 和 SSH ( 端口 22 ) 的流量,并且由于没有 IP 版本控制的限制,所以 IPv4 和 IPv6 流量都适用于这个 zone。不允许 IP 伪装以及端口转发。我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有 Rich rules,意思是允许所有出站流量。