Linux --- firewalld 1
一、概要
1. 环境
(1) CentOS 7
(2) Rocky Linux 9.3
2. 承上启下
二、firewalld服务
1. 查看状态
systemctl status firewalld
2. 开启
sudo systemctl start firewalld
3. 设置开机启动
sudo systemctl enable firewalld
4. 同时开启并设置开机启动
sudo systemctl enable --now firewalld
5. 重启
sudo systemctl restart firewalld
6. 关闭
sudo systemctl stop firewalld
7. 禁用
sudo systemctl disable firewalld
8. 同时关闭并禁用
sudo systemctl disable --now firewalld
三、firewall-cmd
1. 查看
(1) 状态
firewall-cmd --state
(2) 版本
firewall-cmd --version
(3) 默认Zone的信息
sudo firewall-cmd --list-all
2. 重新加载规则
修改firewalld的配置后,务必执行该命令,新配置才会生效:
sudo firewall-cmd --reload
3. 端口操作
(1) 查询8080端口规则
firewall-cmd --query-port=8080/tcp
(2) 临时(重启无效)开放8080端口
sudo firewall-cmd --add-port=8080/tcp
(3) 永久开放8080端口
sudo firewall-cmd --permanent --add-port=8080/tcp
(4) 移除(永久)8080端口规则
sudo firewall-cmd --permanent --remove-port=8080/tcp
4. 服务操作
(1) 查看所有服务
sudo firewall-cmd --get-services
(2) 添加服务,会自动放开该服务的接口
sudo firewall-cmd --permanent --zone={Zone Name} --add-service={Service Name}
例子:
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service={http,https}
sudo firewall-cmd --permanent --zone=trusted --add-service=ssh
(3) 移除服务
sudo firewall-cmd --zone=public --remove-service=http --permanent
四、Zone
1. 查看
(1) 列出所有Zone的详细信息
sudo firewall-cmd --list-all-zones
(2) 列出所有Zone的名称
sudo firewall-cmd --get-zones
(3) 查看某个Zone的信息
sudo firewall-cmd --zone={Zone Name} --list-all
(4) 查看当前活跃的Zone
sudo firewall-cmd --get-active-zones
2. 默认Zone
(1) 查看默认zone
sudo firewall-cmd --get-default-zone
(2) 设置默认zone
sudo firewall-cmd --set-default-zone={Zone Name}
3. 编辑
(1) 创建Zone
sudo firewall-cmd --permanent --new-zone={Zone Name}
(2) 删除Zone
sudo firewall-cmd --permanent --delete-zone={Zone Name}
(3) 将网卡添加到某个Zone
sudo firewall-cmd --permanent --zone={Zone Name} --change-interface={Interface name}
例:将虚拟网卡tun0添加到trusted Zone
sudo firewall-cmd --permanent --zone=trusted --change-interface=tun0
4. Target
(1) 概念
对于每个Zone,Linux都有一个target属性,它决定如何处理入站流量,RHEL目前有以下Target:
default: 默认的target,此时将由firewalld的配置其他规则来处理入站流量;
ACCEPT: 接受所有的流量,除非定义了特定规则,属于黑名单模式;
REJECT: 拒绝所有流量,除非定义了特定规则,属于白名单模式。此种模式会回复请求方并告知数据包被拒绝;
DROP: 丢弃所有流量,除非定义了特定规则,属于白名单模式。此种模式不会回复请求方,直接丢弃。
(2) 配置
sudo firewall-cmd --permanent --zone=<zone-name> --set-target=<default|ACCEPT|REJECT|DROP>
(3) 测试
a. 备份nft表
sudo nft list ruleset > before.nft
b. “public”Zone的默认target是default,将其target改为ACCEPT:
sudo firewall-cmd --permanent --zone=public --set-target=ACCEPT sudo firewall-cmd --reload
c. 再次备份nft表
sudo nft list ruleset > after.nft
d. 此时对比两个nft文件,发现:
在public zone的所有chain中,移除了rule,并新增了accept
reject with icmpx admin-prohibited
五、端口转发
1. NAT (Network Address Translation)
NAT包括SNAT和DNAT:
(1) SNAT (source networkaddress translation)
又称为源地址转换,比如内网中有多台机器,各自有内网的IP(多数是192.168.x.x),访问web服务器的时候,路由器可以将报头中的内网IP替换成路由器的公网IP。
(2) DNAT(destination networkaddress translation)
又称为目的地址转换,比如集群内有多台服务器(网段为192.168.0.1 ~ 192.168.0.200),我们需要访问www.test.com, 它位于Server A(192.168.0.66),而www.test.com的公网IP为(8.8.8.8),这其实是www.test.com的网关地址。当对www.test.com的请求到达网关后,网关会将请求头中目的地IP变为Server A的内网地址192.168.0.66,然后再转发。
2. IP伪装
(1) 查看防火墙是否允许伪装IP
sudo firewall-cmd --query-masquerade
(2) 允许防火墙伪装IP
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --permanent --zone=public --add-masquerade
(3) 禁止防火墙伪装IP
sudo firewall-cmd --permanent --remove-masquerade
sudo firewall-cmd --permanent --zone=public --remove-masquerade
六、direct
1. direct规则文件
通过firewall-cmd命令创建的防火墙direct规则都存储在:
/etc/firewalld/direct.xml
添加防火墙规则时,firewall-cmd不会对规则参数进行校验,而是会直接存到规则文件中,当运行firewall-cmd reload命令时会进行检验,如果配置有误就会报错,例如:
此时,你可以编辑规则文件,然后再执行reload命令。
七、参考
1. 官方
https://firewalld.org/documentation/
https://docs.rockylinux.org/guides/security/firewalld-beginners/
2. Zone
https://www.answertopia.com/rocky-linux/rocky-linux-firewall-configuration-with-firewalld/
3. 其他
https://www.linode.com/docs/guides/introduction-to-firewalld-on-centos/