导读
firewalld作为iptables的前端控制器,底层使用内核的netfilter框架,用于实现持久的网络流量规则。firewalld的较大区别在于:
1.firewalld使用区域和服务而不像iptables使用链式规则。
2.firewalld可动态管理规则集,不会破坏现有会话和连接。
3.firewalld默认拒绝流量,设置规则集后才可放行。
CentOS7和Fedora 20+默认包含了firewalld组件,可使用systemd管理单元进行控制。
管理firewalld
- 启动服务并加入开机启动项
sudo systemctl enable --now firewalld.service
- 查看服务
sudo systemctl status firewalld.service sudo systemctl cat firewalld.service
区域
“区域”是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 FirewallD 后,public 将是默认区域。区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在 external区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。
1.查看默认区域
sudo firewall-cmd --get-default-zone
2.修改默认区域
sudo firewall-cmd --set-default-zone=internal
3.查看网络接口使用的区域
sudo firewall-cmd --get-active-zones
4.查看特定区域的所有配置
sudo firewall-cmd --zone=public --list-all
#查看所有区域的配置
sudo firewall-cmd --list-all
5.初始化区域
阻塞区域(block):任何传入的网络数据包都将被阻止;
工作区域(work):相信网络上的其他计算机,不会损害你的计算机;
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机;
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接;
隔离区域(DMZ):也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接;
信任区域(trueted):所有网络连接都可以接受;
丢弃区域(drop):任何传入的网络连接都被拒绝;
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只选择接受传入的网络连接;
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只选择接受传入的网络连接;
firewalld的默认区域是public。
服务
1.查看默认的可用服务规则
sudo firewall-cmd --get-services
2.启用或禁用HTTP服务
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --remove-service=http --permanent
端口
1.查看默认的可用端口规则
sudo firewalld-cmd --zone-public --list-ports
2启用或禁用8080端口的TCP流量
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
转发
1.查看转发状态
sudo firewall-cmd --zone=public --query-masquerade
2.激活转发状态
sudo firewall-cmd --zone=public --add-masquerade
3.添加转发规则
sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9
规则集
例如,以下是如何使用 FirewallD 为你的服务器配置基本规则(如果您正在运行 web 服务器)。
1、将 eth0的默认区域设置为 dmz。 在所提供的默认区域中,dmz(非军事区)是最适合于这个程序的,因为它只允许 SSH 和 ICMP。
sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0
2、把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中:
sudo firewall-cmd --zone=dmz --add-service=http --permanent
sudo firewall-cmd --zone=dmz --add-service=https --permanent
3、 重新加载 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区域是我们的默认区域,它被用于 eth0 接口中所有网络的源地址和端口。 允许传入 HTTP(端口 80)、HTTPS(端口 443)和 SSH(端口 22)的流量,并且由于没有 IP 版本控制的限制,这些适用于 IPv4 和 IPv6。 不允许IP 伪装以及端口转发。 我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有丰富Rich规则,允许所有出站流量。
富规则
1.允许来自主机 192.168.0.14 的所有 IPv4 流量。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=192.168.0.14 accept'
2.拒绝来自主机 192.168.1.10 到 22 端口的 IPv4 的 TCP 流量。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject'
3.允许来自主机 10.1.0.3 到 80 端口的 IPv4 的 TCP 流量,并将流量转发到 6532 端口上。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 source address=10.1.0.3 forward-port port=80 protocol=tcp to-port=6532'
4.将主机 172.31.4.2 上 80 端口的 IPv4 流量转发到 8080 端口(需要在区域上激活 masquerade)。
sudo firewall-cmd --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'
5.列出你目前的丰富规则:
sudo firewall-cmd --list-rich-rules
6.删除富规则
# 只需将--add-rich-rule替换为--remove-rich-rule
sudo firewall-cmd --zone=public --remove-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=8080 to-addr=172.31.4.2'
部分引用:https://linux.cn/article-8098-1.html