一、firewalld高级配置
1、IP地址伪装
地址伪装(masquerade):通过地址伪装,NAT设备将经过设备的包转发到指定接收方,同时将通过的数据包的源地址更改为其自己的接口地址。当返回的数据包到达时,会将目的地址修改为原始主机的地址并做路由。地址伪装可以实现局域网多个地址共享单一公网地址上网。类似于NAT技术中的端口多路复用(PAT)。P地址伪装仅支持IPv4,不支持IPv6。
2、端口转发
端口转发(Forward-port):也称为目的地址转换或端口映射.通过端口转发.将指定Р地址及端口的流量转发到相同计算机上的不同端口,或不同计算机上的端口。企业内网的服务器一般都采用私网地址,可以通过端口转发将使用私网地址的服务器发布到公网,以便让互联网用户访问。例如,当接收互联网用户的HTT请求时,网关服务器判断数据包的目标地址与目标端口,一旦匹配指定规则.则将其目标地址修改为内网真正的服务器地址,从而建立有效连接。
二、firewalld-cmd高级配置
1、firewalld中理解直接规则
firewalld提供了“direct interface”(直接接口),它允许管理员手动编写的 iptables,ip6tables 和ebtables规则插入firewalld管理的区域中.适用于应用程序,而不是用户。如果对 iptables 不太熟,不建议使用直接接口,可能会无意中导致防火墙被入侵,firewalld保持对所增加项目的追踪,所以它还能质询firewalld和发现使用直接端口模式的程序造成的更改。直接端口通过firewall-cmd 命令中的---direct选项实现。除非将直接规则显式插入firewalld管理的区域,否则将首先解析直接规则.然后解析其他firewalld规则。执行以下命令即可添加一些直接规则以将某个IP范围列入黑名单。
[root@checker ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'
success
[root@checker ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
success
[root@checker ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
success
[root@checker ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted"
success
[root@checker ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
success
2、使用富语言
firewalld 的富语言(rich language〉提供了一种不需要了解iptables语法的通过高级语言配置复杂Pv4和IPv6防火墙规则的机制.为管理员提供了一种表达性语言,通过这种语言可以表达 firewalld的基本语法中未涵盖的自定义防火墙规则。
富规则可用于表达基本的允许/拒绝规则,也可以用于配置记录〈面向 syslog 和 auditd),以及端口转发、伪装和速率限制。下面是表达富规则的基本语法
3、理解富规则命令
firewall-cmd 有四个选项可以用于处理富规则.所有这些选项都可以同常规的-permanent或——zone=<ZONE>选项组合使用。
source:限制源P地址.源地址可以是一个IPv4、Pv6地址或者一个网络地址段
destination:限制目标地址.目标地址使用跟源地址相同的语法。
element:要素.该项只能是以下几种要素类型之一:service、port , protocol、icmp一block、masquerade和forward--port
service:服务名称是firewalld提供的其中一种服务。要获得支持的服务列表,输入以下命令:firewall-cmd ---get-services 。如果一个服务提供了一个目标地址,它和规则中的目标地址冲突.则会导致一个错误。命令格式为:service nane-service_name。
port:端口可以是一个独立端口数字.或者是端口范围.如5060~5062。协议为TCP或
uDP、命令格式为:port port=mnurmber _or_range protocol=protocol.
protocol:协议,可以是一个协议ID号,或者一个协议名。查询可用协议,请查阅/etc/protocols,命令格式为:protocol value=protocol_name_or_lD
icrmp-block:阻断一个或多个ICMP类型。要获得支持的ICMP类型列表.输入firewall-crnd--get-icmptypes 命令即可查看。命令格式为:icmp---block name=icmptype..narme
masquerade:规则里的P伪装。用源地址而不是目的地址来把伪装限制在一个范围内。
forward-port:将指定的 TCP或UDP协议的数据包转发到本机的其他端口,或另一台机器,或另-台机器上的其他端口。port和 to-port可以是一个单独的端口数字.或一个端口范围。而目的地址是一个简单的Р地址。
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 命令后指定,因为审核类型将会从规则动作中自动收集。审核不包含自身参数,但可以选择性地增加限制。审核的使用是可选择的
acceptlreject|drop:可以是accept 、reject 或drop 中的一个行为。命令格式为: accept | reject[type=reject type] | drop。指定accept时.所有新的连接请求都将被允许。指定reject时.连接将被拒绝.发起端将接到一个拒绝信息。指定drop时,所有数据包会被丢弃.并且不会向发起端发送任何信息。
4、规则配置举例
(1)为认证报头协议AH使用新的IPv4
[root@checker ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'
success
(2)允许新的IPv4和Pv6连接FTP、并使用审核每分钟记录一次。
[root@checker ~]# firewall-cmd --add-rich-rule='rule service name=ftp log limit value=1/m audit accept'
success
(3)允许来自192.168.0.0/24地址的TFTP协议的IPv4连接,并且使用系统日志每分钟记录一次。
[root@checker ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name=tftp log prefix="tftp" level="info" limit value="1/m" accept'
success
(4)为RADIUS协议拒绝所有来自1∶2∶3∶4∶6::的新Pv6连接.日志前缀为“dns",级别为“info”,并每分钟最多记录3次。接受来自其他发起端新的IPv6连接。
[root@checker ~]# 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'
success
[root@checker ~]# firewall-cmd --add-rich-rule='rule family="ipv6" service name="radius" accept'
success
(5)将源192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接。
[root@checker ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
success
(6)拒绝来自public区域中P地址192.168,0.11的所有流量。
[root@checker ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.11/32" reject'
success
(7)丢弃来自默认区域中任何位置的所有传入的ipsec esp协议包
[root@checker ~]# firewall-cmd --add-rich-rule='rule protocol value=esp drop'
success
(8)在192.168.1.0/24子网的dmz区域中,接收端口7900~7905的所有TCP包。
[root@checker ~]# firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
success
(9)接收从work区域到SSH的新连接,以notice级别且每分钟最多三条消息的方式将新连接记录到syslog
[root@checker ~]# firewall-cmd --zone=work --add-rich-rule='rule service name=ssh log prefix=ssh level=notice limit value=3/m accept'
success
(10)在接下来的5min 内,拒绝从默认区域中的子网192.168.2.0/24到DNS的新连接.并且拒绝的连接将记录到audit系统.且每小时最多条消息。
[root@checker ~]# 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
success