目录
FirewallD 的 direct interface :高级配置接口
允许新的IPv4和IPv6连接 FTP, 并使用审核每分钟记录一次
将源192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接。
拒绝来自 public 区域中IP 地址192.168.0.11 的所有流量。
丢弃来自默认区域中任何位置的所有传入的 ipsec esp协议包。
接收从work 区域到 SSH的新连接,以notice 级别且每分钟最多三条消息的方式将新连接记 录到 syslog.
在接下来的5min 内,拒绝从默认区域中的子网192.168.2.0/24到 DNS 的新连接,并且
拒绝的连接将记录到 audit 系统,且每小时最多一条消息。
要在 FirewallD 中启用地址伪装,可以使用以下命令:
案例:源地址为192.168.1.0/24网段的地址开启地址IP 伪装。
IP 伪装与端口转发、两种类型
Firewalld支持两种类型的NAT:
1、IP 地址伪装 2、端口转发。
IP 地址伪装
地址伪装 (masquerade): 通过地址伪装,NAT 设备将经过设备的包转发到指定接收方,同时将通过的数据包的源地址更改为其自己的接口地址。当返回的数据包到达时,会将目的地址修改为原始主机的地址并做路由。地址伪装可以实现局域网多个地址共享单一公网地址上网。
IP伪装(NAT)是一种将内部网络的私有IP地址映射为公共IP地址的技术。它允许内部网络的计算机通过一个公共IP地址与外部网络进行通信。要配置IP伪装,可以使用firewalld的端口转发功能。
IP地址伪装仅支持 Pv4, 不支持|Pv6。
2、端口转发。
端口转发(Forward-port): 也称为目的地址转换或端口映射。通过端口转发,将指定 IP 地址及 端口的流量转发到相同计算机上的不同端口,或不同计算机上的端口。
端口转发允许将外部网络上的请求转发到内部网络
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=1.6.2.6
firewall-cmd --reload
中的不同端口或计算机上。要配置端口转发,可以使用firewalld的端口转发功能。
企业内网的服务器一般都采 用私网地址,可以通过端口转发将使用私网地址的服务器发布到公网,以便让互联网用户访问。例 如,当接收互联网用户的HTTP 请求时,网关服务器判断数据包的目标地址与目标端口, 一旦匹配指 定规则,则将其目标地址修改为内网真正的服务器地址,从而建立有效连接。
配置IP伪装规则:
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
配置端口转发规则:
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10
firewall-cmd --reload
这个例子将外部网络上的8080端口的TCP请求转发到内部网络上的192.168.1.10计算机的80端口。
FirewallD 的 direct interface
:高级配置接口
FirewallD 的 direct interface
是一种高级配置接口,它允许用户直接与内核 netfilter 进行交互,从而提供更细粒度的控制。使用 direct interface
,你可以添加、修改和删除与特定网络区域无关的规则。这对于需要精确控制网络流量的高级用户和复杂网络环境非常有用。
firewalld 提供了 “direct interface” (直接接口),它允许管理员手动编写的 iptables、ip6tables 和 ebtables 规则插入firewalld 管理的区域中,适用于应用程序,而不是用户。如果对 iptables 不太熟, 不建议使用直接接口,可能会无意中导致防火墙被入侵。firewalld 保持对所增加项目的追踪,所以 它还能质询 firewalld 和发现使用直接端口模式的程序造成的更改。直接端口通过 firewall-cmd 命令 中的--direct 选项实现。除非将直接规则显式插入firewalld 管理的区域,否则将首先解析直接规则, 然后解析其他firewalld 规则。
添加直接规则:
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
这条命令添加了一条规则,允许来自 192.168.1.0/24 网段的 TCP 流量访问端口 22(SSH)。
删除直接规则:
sudo firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
这条命令删除了之前添加的规则。
列出直接规则:
sudo firewall-cmd --direct --get-all-rules
列出了所有通过 direct interface
添加的规则。
刷新直接规则:
sudo firewall-cmd --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE
这条命令立即执行一条 passthrough 规则,用于网络地址转换(NAT),允许内网主机通过 eth0 接口访问外网。
使用 direct interface
时,需要特别注意,因为直接规则不依赖于 FirewallD 的区域和服务概念,所以它们必须完全符合 netfilter 的规则格式。此外,直接规则不会在 FirewallD 重启后保留,除非它们被添加到 /etc/firewalld/direct.xml
文件中。
富语言rich language
防火墙的富语言(Rich Rules)是 FirewallD 中的一个特性,它允许用户定义复杂的防火墙规则,这些规则可以基于源地址、目的地址、服务、端口、时间等条件。富语言规则提供了一种更灵活和强大的方式来控制网络流量,而不需要直接与内核 netfilter 接口交互。
富语言 (rich language) 提供了一种不需要了解 iptables 语法的通过高级语言配置复杂 IPv4和 Pv6 防火墙规则的机制,为管理员提供了一种表达性语言,通过这种语言可以表达 firewalld 的基本语法中未涵盖的自定义防火墙规则。
例如,仅允许从单个P 地址(而非通过某个区域路由的 所有|P 地址)连接到服务。
富规则可用于表达基本的允许/拒绝规则,也可以用于配置记录(面向 syslog 和 auditd), 以及 端口转发、伪装和速率限制。
富语言规则通常用于以下情况:
- 当你需要基于特定的源或目的地址、网络接口或源端口来允许或拒绝流量时。
- 当你需要为特定的服务或端口设置复杂的匹配条件时。
- 当你需要为规则设置动作,如记录日志、拒绝连接或接受流量时。
富规则基本语法:
rule [family="<rule family>"]
[source address="<address>" [invert="True"] ]
[destination address="<address>" [invert="True"] ]
[<element>]
[log [prefix="<prefix text>"][level="<log level>"][limit value="rate/ duration"] ]
[audit]
[acceptlreject|drop]
规则的每个单一元素都能够以 option=value 的形式来采用附加参数。
需要注意的规则的排序
规则的排序会在很大程度上影响防火 墙的行为。对于所有的区域,区域内的规则的基本排序是相同的。如果区域中的任何规则与包均不 匹配,通常会拒绝该包,但是区域可能具有不同的默认值。例如,可信区域 (trusted) 将接收任何不 匹配的包。此外,在匹配某个记录规则后,将继续正常处理包。
富规则命令
firewall-cmd 有四个选项可以用于处理富规则,所有这些选项都可以同常规的--permanent 或 --zone=<ZONE> 选项组合使用
选项 | 说明 |
--add-rich-rule='RULE’ | 向指定区域中添加RULE,如果没有指定区域,则为默认区域. |
--remove-rich-rule='RULE | 从指定区域中删除RULE,如果没有指定区域,则为默认区域。 |
--query-rich-rule='RULE | 查询RULE是否已添加到指定区域,如果未指定区域,则为默认区域。规则 存在,则返回0,否则返回1 |
--list-rich-rules | 输出指定区域的所有富规则,如果未指定区域,则为默认区域 |
任何已配置的富规则都会显示在 firewall-cmd--list-all 和 firewall-cmd --list-all-zones 的输
出结果中。
富语言语法解释
source: | 限制源IP地址,源地址可以是一个IPv4、IPv6 地址或者一个网络地址段。 |
destination: | 限制目标地址,目标地址使用跟源地址相同的语法。 |
element:要素 | 该项只能是以下几种要素类型之一:service、port 、protocol、icmp-block, masquerade 和 forward-port 。 |
element类型:service | service:服务名称是 firewalld 提供的其中一种服务。要获得支持的服务列表,输入以下命令:firewall-cmd--get-services。如果一个服务提供了一个目标地址,它和规 则中的目标地址冲突,则会导致一个错误。 命令格式为:service name=service_name。 |
element类型:port | port:端口可以是一个独立端口数字,或者是端口范围,如5060~5062。协议为 TCP 或 UDP。 命令格式为: port port=number_or_range protocol=protocol, |
element类型:protocol | protocol:协议,可以是一个协议 ID 号,或者一个协议名。查询可用协议,请查阅 /etc/protocols 。 命令格式为: protocol value=protocol_name or D。 |
element类型:icmp-block: | 阻断一个或多个ICMP类型。要获得支持的ICMP类型列表,输入firewall-cmd --get-icmptypes 命令即可查看。 命令格式为:icmp-block name=icmptype_name。 |
element类型:masquerade: | 规则里的P 伪装。用源地址而不是目的地址来把伪装限制在一个范围内。 forward-port: 将指定的 TCP 或 UDP 协议的数据包转发到本机的其他端口,或另一台 机器,或另一台机器上的其他端口。port 和 to-port 可以是一个单独的端口数字,或 一个端口范围。而目的地址是一个简单的IP地址。 命令格式为:forward-port port=number_or_range protocol=protocol to-port=number_or_fange to-addr=address. |
log: | 注册有内核日志的连接请求到规则中,如系统日志。可以定义一个前缀文本把日志信 息作为前缀加入。日志等级可以是 emerg、 alert、 crit、 error、Wamning、 notice、info 或 者 debug 中的一个。可以选择日志的用法,按以下方式限制日志:log [prefix=prefix text] [level=log level]limit value=rate/duration。持续时间的单位为 s、m、 h、d。s 表示秒, m 表示分钟, h 表示小时, d 表示天。最大限定值是1/d (每天最多有一条日志进入)。 |
audit: | 审核,审核类型可以是 accept、reject 或 drop 中的一种,但不能在 audit 命令后指 定,因为审核类型将会从规则动作中自动收集。审核不包含自身参数,但可以选择性地增 加限制。审核的使用是可选择的。 |
acceptreject|drop: | 可以是 accept,reject 或 dtop 中的一个行为。命令格式为:accept |reject [type=reject type]|drop。指定 accept 时,所有新的连接请求都将被允许。指定 reject 时, 连接将被拒绝,发起端将接到一个拒绝信息。指定 drop 时,所有数据包会被丢弃,并且不 会向发起端发送任何信息。 |
以下是一些使用富语言规则的示例:
允许特定 IP 地址访问 SSH 服务:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
拒绝来自特定网络的 ICMP 流量:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/16" protocol value="icmp" reject'
记录来自特定地址的 HTTP 请求:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="http" log prefix="HTTP_ACCESS" level="info" accept'
在特定时间段内允许流量:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="8080" protocol="tcp" time day="Fri..Sun" accept'
为规则设置优先级:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" priority="100" accept'
为认证报头协议AH 使用新的 IPv4 和 IPv6 连接
firewall-cmd --add-rich-rule='rule protocol value=ah accept'
允许新的IPv4和IPv6连接 FTP, 并使用审核每分钟记录一次
firewall-cmd --add-rich-rule='rule service name=ftp log limit value=1/m audit accept'
为 RADUS 协议拒绝所有来自1:2:3:4:6::的新IPv6连接,日志前缀为 “dns”, 级别为“info”, 并每分钟最多记录3次。接受来自其他发起端新的IPv6 连接
firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::“service name="radius"log prefix="dns"level= "info"limit value="3/m"reject'
firewall-cmd --add-rich-rule='rule family="ipv6" service name="radius"accept'
将源192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接。
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2"accept'
拒绝来自 public 区域中IP 地址192.168.0.11 的所有流量。
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
丢弃来自默认区域中任何位置的所有传入的 ipsec esp协议包。
firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
接收从work 区域到 SSH的新连接,以notice 级别且每分钟最多三条消息的方式将新连接记 录到 syslog.
firewall-cmd --zone=work --add-rich-rule='rule service name=ssh log prefix="ssh"level="notice"limit value="3/m"accept'
在接下来的5min 内,拒绝从默认区域中的子网192.168.2.0/24到 DNS 的新连接,并且
拒绝的连接将记录到 audit 系统,且每小时最多一条消息。
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.2.0/24 service name=dns audit limit value="1/h"reject'--timeout=300
富语言规则可以与 FirewallD 的其他配置选项结合使用,以创建复杂的网络策略。在应用富语言规则时,建议先在测试环境中验证规则的效果,以避免意外地锁定自己或阻止合法的流量。
配 置 firewall的防火墙的地址伪装和端口转发
地址伪装(Masquerading)
要在 FirewallD 中启用地址伪装,可以使用以下命令:
sudo firewall-cmd --permanent --zone=public --add-masquerade
命令将永久性地在 public
区域添加一个 masquerade 规则。如果你想要立即应用这个规则,可以使用:
sudo firewall-cmd --zone=public --add-masquerade
端口转发(Port Forwarding)
端口转发允许你将外部网络的流量转发到内部网络的不同端口或地址上。这通常用于隐藏内网服务器的地址,并通过防火墙的公共地址来访问它们。
要在 FirewallD 中设置端口转发
sudo firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
这条命令将永久性地在 public
区域添加一个端口转发规则,将所有到达端口 80 的 TCP 流量转发到端口 8080。如果你想要立即应用这个规则,可以使用:
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
注意,--permanent
选项用于确保规则在防火墙服务重启后仍然有效。如果你不使用 --permanent
选项,规则将在防火墙服务重启后丢失。
配置 IP 伪装与端口转发
查看网关服务器的 extermal 区域是否开启了地址伪装。
firewall-cmd --list-all --zone=externa
external(active)
案例:源地址为192.168.1.0/24网段的地址开启地址IP 伪装。
在网关服务器上关闭 external 的地址伪装,添加富规则,要求 extemal 区域内,源地址为 192.168.1.0/24网段的地址开启地址IP 伪装。
firewall-cmd --remove-masquerade --zone=external
firewall-cmd --zone=external --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 masquerade'
succesE
配置端口转发实现互联网用户访问内部 web 服务器
firewall-cmd --zone=external --add-forward-port=port =443:proto=tcp:toaddr=192.168.2.10
使用富规则配置端口转发。
(需要将新公网地址 100 . 1 . 1 . 15 配置在网关服务器的外网接口ens33 上,作为第二个P 地 址 。)
firewall-cmd --zone=external --add-rich-rule='rule
family=ipv4 destination address=100.1.1.15/32 forward-port port=443 protocol= tcp to-addr=192.168.2.10'
success