技巧积累
禁止其他主机 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
|
查看现有的所有规则
查看指定 zone 的规则
1
| firewall-cmd --zone<zone> --list-all
|
查看放行的服务列表
1
| firewall-cmd --list-services
|
重新加载 firewalld
获取 firewalld 运行状态
检查配置是否正确
1
| firewall-cmd --check-config
|
向指定 zone 添加服务并永久生效
1
| firewall-cmd --permanent --add-service http --zone=public
|
注意在使用了 --permanent
的配置后, 需要 --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] public (active) target: default icmp-block-inversion: no 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 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 的所有配置
对一个 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
|
规则匹配的优先级
- 具体规则. 指明确指定了源地址, 目标地址, 端口等详细信息的规则
- zone 规则
- 规则顺序
- 继承和默认规则