目录
本章主要重点:
- 理解firewalld的富语言规则
- 配置地址伪装和端口转发
IP伪装与端口转发
NAT(网络地址转换):当用户数据包经过NAT设备时,NAT设备将源地址替换为公网IP地址,而返回的数据宝就可以被路由。NAT技术一般都是在企业边界路由器或者防火墙上配置。
firewalld支持两种类型NAT:IP地址伪装和端口转发。
- IP地址伪装(masquerade)
可以实现局域网多个地址共享单一公网地址上网 IP地址伪装仅支持IPv4,不支持IPv6
- 端口转发(Forward-port)
也称为目的地址转换或端口映射 通过端口转发,指定IP地址及端口的流量将被转发到相同计算机上的不同端口,或者转发到不同计算机上的端口
firewall-cmd高级配置
-
直接规则(direct interface)
允许管理员手动编写的iptables、ip6tables和ebtables 规则插入到Firewalld管理的区域中 直接端口通过firewall-cmd命令中的--direct选项实现 除显示插入方式之外,优先匹配直接规则
执行以下命令即可添加一些直接规则以将某个IP范围列入黑名单
[root@localhost ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
success
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
success
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted"
success
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
success
-
富语言(rich language)
表达性配置语言,无需了解iptables语法 用于表达基本的允许/拒绝规则、配置记录(面向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 ]
[ accept|reject|drop ]
规则的单一元素都能够以option=value的形式来采用附加参数。
1. 规则排序
一旦向某个区域(一般是指防火墙)中添加多个规则,规则的排序会在很大程度影响防火墙的行为。对于所有的区域,区域内的规则的基本排序是相同的。如果区域中的任何规则与包都不匹配,通常会拒绝该包,但是区域可能具有不同的默认值。例如,可信任区域(trusted)将接受任何不匹配的包。此外,在匹配某个记录规则后,将继续正常处理包。
直接规则是个例外。大部分直接规则将首先进行解析,然后由firewalld进行其他处理,但是直接规则语法允许管理员在任何区域中的任何位置插入任何规则。
2. 测试和调试
为了方便于测试和调试,几乎所有规则都可以与超时一起添加到运行时配置。当包含超时的规则添加到防火墙时,计时器便针对规则开始倒计时,一但规则的计时器达到0秒,便从运行时配置中删除改规则。
通过在启用规则的firewall-cmd命令的结尾追加选项——timeout=<TIMEINSECONDS>,可向运行时规则中添加超时。
-
理解富规则命令
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。
(1)service:服务名称是firewalld提供的其中一种服务。要获得支持的服务列表,输入以下命令:firewall-cmd --get-services。如果一个服务提供了一个目标地址,它和规则中的目标地址冲突,则会导致一个错误。命令格式为:srvice name =service_name。
(2)port:端口可以是一个独立端口数字,或者是端口范围,如5060~5062。协议为TCP或UDP。命令格式为:port port=number_or_range protocol=protocol。
(3)protocol:协议,可以是一个协议ID号,或者一个协议名。查询可用协议,请查阅/etc/protocols。命令格式为:protocol value=protocol_name_or_ID。
(4)icmp-block:阻断一个或多个ICMP类型。要获得支持的ICMP类型列表,输入firewall-cmd --get-icmptypes命令查看即可。命令格式为:icmp-block name=icmptype_name。
(5)masquerade:规则里的IP伪装。用源地址而不是目的地址来把伪装限制在一个范围内。
(6)forward-port:将指定的TCP或UDP协议的数据包转发到本机的其他端口,或另一台机器,或另一台机器上的其他端口。port和to-port可以是一个单独的端口数字,或一个端口范围。而目的地址是一个简单的IP地址。命令格式为:forward-port port=numbr_or_range protocol=protocol to-port=number_or_range to-addr=address。
-
log:注册有内核日志的连接请求到规则中,如系统日志。可以定义一个前缀文本把日志信息作为前缀加入。日志等级可以emerg、alert、crit、error、warning、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命令后指定,因为审核类型将会从规则动作中自动收集。审核不包含自身参数,但可以选择性地增加限制。审核的使用是可选择的。
-
accept|reject|drop:可以是accept、reject或drop中的一个行为。命令格式为:accept | reject [type=reject type] | drop。指定accept时,所有新的连接请求都将会被允许。指定reject时,连接被拒绝,发起端将接到一个拒绝信息。指定drop时,所有数据包会被丢弃,并且不会向发起端发送任何信息。
-
规则配置示例
1.为认证报头协议AH使用新的ipv4和ipv6连接。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'
success
2. 允许ipv4和ipv6连接FTP,并使用审核每分钟记录一次。
[root@localhost ~]# f