Firewalld-使用

技巧积累

禁止其他主机 ping 本机

1
firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp reject'

配置源地址转换

源地址转换 (Source Network Address Translation, SNAT) 指, 内部服务器访问外网时, 数据包经过边界网关, 其源地址信息改为边界网关的 IP:

1
2
sysctl -w net.ipv4.ip_forward=1 # 开启路由转发
firewall-cmd --add-masquerade # 开启地址伪装

配置目的地址转换

目的地址转换 (Destination Network Address Translation, DNAT) 指, 外部服务器访问内网资源时, 通过访问边界网关的某个端口, 能够映射到内部服务器的 IP 和端口.

添加端口转发规则如:

1
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.0.86

这里为: 访问边界网关的 80 端口, 相当于访问内部 192.168.0.86:80. 多个参数之间用 : 隔离.

查看已存在的 zones

1
firewall-cmd --get-zones

查看现有的所有规则

1
firewall-cmd --list-all

查看指定 zone 的规则

1
firewall-cmd --zone<zone> --list-all

查看放行的服务列表

1
firewall-cmd --list-services

重新加载 firewalld

1
firewall-cmd --reload

获取 firewalld 运行状态

1
firewall-cmd --state

检查配置是否正确

1
firewall-cmd --check-config

向指定 zone 添加服务并永久生效

1
firewall-cmd --permanent --add-service http --zone=public

注意在使用了 --permanent 的配置后, 需要 --reload:

1
firewall-cmd --reload

放行某一个 ip

1
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="目标IP" accept'

移除一个 service

1
firewall-cmd --remove-service=cockpid

将一个 IP 加入到 drop zone

1
2
3
firewall-cmd --add-source=192.168.177.23 --zone=drop
firewall-cmd --reload
firewall-cmd --list-all --zone=drop

将一个 interface 添加到一个 zone

1
firewall-cmd --add-interface=nic --zone=zone_name

读取一个 zone 的 target

1
firewall-cmd --zone=drop --get-target

修改 zone 的 target

1
firewall-cmd --zone=public --set-target=<default|ACCEPT|REJECT|DROP>

查询一个 service 的放行情况

1
firewall-cmd --zone=trusted --query-service=ssh

设置端口转发

1
2
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.2.208
firewall-cmd --reload

不设置 toaddr 时表示转发到本机的另一个端口.

配置文件

  • /usr/lib/firewall/, 这个目录下为系统配置, 尽量不修改
  • /etc/firewalld/, 这个目录为用户配置

target

Target 表明数据包匹配到防火墙规则之后的处理方法, 常见有:

  • ACCEPT, 表示允许通过防火墙
  • DROP, 表示丢弃数据包
  • REJECT, 拒绝数据包并向发送方发送拒绝信息
  • LOG, 将匹配到的数据包记录到系统日志中
  • MASQUERADE, 用于 NAT
  • REDIRECT, 用于重定向
  • QUEUE, 将数据包发送到用户控件的防火墙队列

通常一个 zone 只能设置一个 target.

firewall-cmd –list-all 输出信息解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@openeuler2 firewalld]# firewall-cmd --list-all --zone=public
public (active)
target: default # 指当前zone使用默认规则,不同zone的target不同,比如drop zone为DROP
icmp-block-inversion: no # 是否阻止icmp
interfaces: enp1s0 enp7s0 # 关联的网卡接口
sources: 192.168.177.21/24 # 基于来源地址进行匹配
services: cockpit dhcpv6-client iscsi-target mdns nfs nfs3 rpc-bind ssh # 允许的服务
ports: 111/tcp 111/udp 2049/tcp 2049/udp # 开放的端口
protocols: # 允许通过的协议
forward: yes
masquerade: no # 是否开启 NAT
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.177.3/24" accept

Rich rule

参考

Rich rule, 取名自其丰富的功能以及精细的配置.

语法:

1
firewall-cmd [Option] [Rule]

Option 即对 Rule 的操作, 包括:

  • --add-rich-rule='[RichRule]', 添加 rich rule
  • --query-rich-rule='[RichRule]', 查询 rich rule 是否存在
  • --remove-rich-rule='[RichRule]', 移除一个 rich rule
  • --list-rich-rule, 列出所有 rich rule

[Rule] 的语法为:

1
2
3
4
[source] [destination]
{service|port|protocol|icmp-block|masquerade|forward-port}
[log] [audit]
[accept|reject|drop]

Rich Rule 的顺序

Firewalld 处理 incoming packets 的一些 rules:

  • 只有 incoming packets 会被处理
  • 如果 packets 匹配到了一个 rule 会被立即处理
  • 之后这个 packet 不会被继续处理

Firewalld 遵循的处理顺序为:

  • Direct rules
  • Port forwarding and masqueradinig rules
  • Logging rules
  • Allow rules
  • Deny rules

示例

查看 default zone

1
firewall-cmd --get-default-zone

查看 default zone 的所有配置

1
firewall-cmd --list-all

对一个 host 放行 telnet

这里的 requirement 为:

1
Allow Telnet connection only from 192.168.1.101/24. Limit this connection one per minute. Drop Telnet connection from remaining hosts

对应的 rich rule 为:

1
firewall-cmd --add-rich-rule-'rule family=ipv4 source address=192.168.1.101/32 service name=telnet limit value=1/m accept'
  • rule 关键字表明一个 rule 的开始, 开头一般都是 'rule ...'
  • family=ipv4, 指网络协议为 IPv4
  • source address=192.168.1.101/32 指源地址 IP 为 192.168.1.101/32 注意这里的 32 为 wildcard mask 而不是 subnet mask (用子网掩码 32 推出 wildcard mask 为 0.0.0.0 表示每一位都需要匹配)
  • service name=telnet, 指定服务名为 telnet
  • limit value=1/m, 设置规则的限制条件为每分钟 1 个数据包
  • accept 设置接受通过符合规则的数据包

对一个 host 开放 SSH 并作 log 记录

Requirement 为:

1
Allow SSH connection from network 192.168.1.0/24. Log each access with "SSH Access" prefix"

对应的 rich rule 可以写为:

1
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.0/32 service name=ssh log prefix="SSH Access" level="notice" accept'

对一个 host 开放 FTP

Requirement 为:

1
Allow FTP connection only from 192.168.1.2/24. Reject FTP connections from remaining systems

对应的 rich rule 为:

1
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.2/32 service name=ftp accept'

拒绝所有的 ICMP

Requirement 为:

1
Reject ping requests from all hosts with error message

对应的 rich rule 为:

1
firewall-cmd --add-rich-rule='rule protocol value=icmp reject'

移除一个 rich rule 的示例

如果有:

1
firewall-cmd --add-rich-rule='rule protocol value=icmp reject'

则对应的移除为:

1
firewall-cmd --remove-rich-rule='rule protocol value=icmp reject'

Timeout 选项

一般用于测试, 即此时设置的 rich rule 会在一段时间后清除.

1
firewall-cmd --add-rich-rule='rule protocol value="icmp" reject' --timeout=60

这条 rule 就会在 60s 后清除.

Zone

Firewalld 利用 “zone” 来组织和管理防火墙规则. 每一个 zone 有自己的防火墙规则集, 用于控制该 zone 中网络流量的访问权限.

Firewalld 中有预定义的 zone (包含预定义的规则集), 也可以自定义 zone.

一个网络接口在同一个时刻只能属于一个 zone.

预定义的 zone

在安装并运行 firewalld 之后, 默认所处的 zone 为 “public”, 其基本限制了大部分服务的连接.

预定义的 zone 有:

  • trusted, 放行一切流量, 等同于关闭防火墙
  • home, 由本地向外发起的连接的回程数据包允许通过, 默认放行 ssh, mdns, ipp-client 等服务
  • internal, 等同于 home
  • work, 由本地向外发起的连接的回程数据包允许通过, 默认放行 ssh, dhcp6-client 服务
  • external, 由本地向外发起的连接的回程数据包允许通过, 默认放行 ssh, 开启地址伪装功能
  • dmz, 由本地向外发起的连接的回程数据包允许通过, 默认放行 ssh
  • block, 由本地向外发起的连接的回程数据包允许通过
  • drop, 由本地向外发起的连接的回程数据包允许通过, 丢弃进入该区域的其他所有数据包, 且不进行任何回包

查看当前所处的 zone

1
firewall-cmd --get-active-zone

切换到指定的 zone

1
firewall-cmd --set-default-zone=target_zone_name

规则匹配的优先级

  1. 具体规则. 指明确指定了源地址, 目标地址, 端口等详细信息的规则
  2. zone 规则
  3. 规则顺序
  4. 继承和默认规则

Firewalld-使用
http://example.com/2023/11/22/Firewalld-使用/
作者
Jie
发布于
2023年11月22日
许可协议