firewalld详解
阅读原文时间:2023年07月09日阅读:1

firewalld详解

注:为了便于查看,我把iptables和firewlld的使用总结文档放到了这个链接(下载),这个文档如果有新的内容和更正,我会及时更新。

有需要可以直接下载查看,应该比在博客(博客做很多格式太耗费时间了)上看到的格式要友好一些。

说明:个人认为此处文章适合已经对firewalld有一定了解,并且希望对实用操作有一篇总结性的文章来方便查阅的受众,

或者本来对firewalld没有多少了解,但是想系统地了解firewalld及其一些常用操作,拿来就能用的受众。

=====================================华丽的分割线=====================================

目录:

1 区域概念

2 firewalld命令行基础使用

3 直接规则

4 firewalld防火墙富规则

  4.1 富规则常用options

  4.2 富规则language语法

  4.3 一些常用配置规则

    4.3.1 规则排序

    4.3.2 测试和调试

    4.3.3 使用富规则进行日志记录

    4.3.4 批量添加端口

  4.4 一些配置示例

5 firewalld的NAT和端口转发

6 firewalld自定义区域和服务

  6.1 自定义区域

  6.2 自定义服务

7 firewalld的一些实用操作

=====================================华丽的分割线=====================================

说明:在RHEL7系列中,默认使用firewalld作为防火墙,iptables默认是关闭的(stop),

要使用firewalld建议先关闭并禁用老版本的iptables,ip6tables和ebtables。

systemctl mask iptables

systemctl mask ip6tables

systemctl mask ebtables

systemctl enable firewalld

  在firewalld中引入了区域的概念,可以简单理解为一些配置好策略的模板,直接应用即可,如果是学网络的,

应该很能理解,比如华为的防火墙,华三的防火墙这些,都是有这种概念的,这里就不详细解释什么是区域了。

只有firewalld服务启动了,才能使用相关工具: firewall-config(图形界面), firewall-cmd,这里主要介绍命令行方式的。

firewalld有规则两种状态

运行时(runtime):修改规则马上生效,但是临时生效

持久配置(permanent): 修改后需要重载才会生效

firewall-cmd --permanent RULE

firewall-cmd --reload

注意:一旦使用了permanent,配置完成后一定要reload,否则只能待防火墙重启后这些配置才能生效。

配置文件

/etc/firewalld/{services,zones}/*.xml    优先级最高,permanent模式生效的策略会放到这里

/lib/firewalld/{services,zones}/*.xml   优先级要低些,是一些默认配置,可以当做模板使用

以下options是可以组合使用的,具体见man firewall-cmd或者firewall-cmd --help,里面有详细的说明,此处只列出一些常用的option。

firewall-cmd

   --permanent           --配置写入到配置文件,否则临时马上生效

    --reload --重载配置文件,永久生效

    --zone= --指定区域

   --get-default-zones    --获取默认区域

   --set-default-zone=    --设置默认区域

    --get-zones --获取所有可用的区域

    --get-active-zones --获取当前激活(活跃)的区域

    --add-source= --添加地址,可以是主机或网段,遵循当前区域的target

    --remove-source    --移除地址,可以是主机或网段,遵循当前区域的target

    --add-service=    --添加服务,遵循当前区域的target

    --remove-service=      --移除服务,遵循当前区域的target

    --list-services --显示指定区域内允许访问的所有服务

    --add-port= --添加端口,遵循当前区域的target

    --remove-port= --移除端口,遵循当前区域的target

    --list-ports 显示指定区域内允许访问的所有端口号

    --add-interface= --zone=        --添加网卡到指定区域

    --change-interface= --new-zone-name --改变网卡到指定区域

    --list-all        --列出激活使用的区域的配置

    --list-all-zones          --列出所有区域的配置

    --get-zone-of-interface=      --获取指定接口所在的区域

    --list-icmp-blocks         --显示指定区域内拒绝访问的所有ICMP类型

    --add-icmp-block= --为指定区域设置拒绝访问的某项ICMP类型

    --remove-icmp-block= --移除指定区域内拒绝访问某项的ICMP类型

       常用的ICMP类型有

            #echo-request:类型0,icmp请求报文

            #echo-reply:类型8,icmp响应回复报文

    --list-protocols --列出在指定区域中允许通过的协议

  --add-protocol=           --在指定区域中添加允许通过的协议

  --remove-protocol=        --移除在指定区域中的某项协议

    --get-target     --获取区域中的默认target

  --set-target=              --设置区域的target

查看默认区域

firewall-cmd --get-default-zone

查看所有可以使用的区域

firewall-cmd --get-zones

修改当前的默认区为work

firewall-cmd --set-default-zone=work

在work区添加http服务并允许别人访问

firewall-cmd --add-service=http --zone=work

在public区绑定了该地址范围,只有该范围的IP的数据包都会路由到该区,由该区的规则进行匹配决定是否放行

firewall-cmd --add-source=172.25.0.10/32 --zone=public

查看活跃的区域

firewall-cmd --get-active-zones

把接口绑定到public区

--change-interface=  --zone=

--add-interface=  --zone=

查看网卡绑定在了哪个区域

firewall-cmd --get-zone-of-interface=IFACE

查看区域配置信息

firewall-cmd --list-all --zone=work

firewall-cmd --list-all

查看所有服务

firewall-cmd --get-services

Direct Options

--direct --指定将要使用直接规则

--get-all-chains --获取所有的链

--get-chains {ipv4|ipv6|eb}

--获取表中的链

--add-chain {ipv4|ipv6|eb}

--添加链到表中(自定义的)

--remove-chain {ipv4|ipv6|eb}

--移除表中的某条链

--query-chain {ipv4|ipv6|eb}

--返回链是否已被添加到表

--get-all-rules --获取所有的策略规则

--get-rules {ipv4|ipv6|eb}

--获取指定表中指定链中的规则

--add-rule {ipv4|ipv6|eb}

… --在指定表中的指定链添加规则

--remove-rule {ipv4|ipv6|eb}

… --优先从指定表中的指定链删除规则条目

--remove-rules {ipv4|ipv6|eb}

--从表中删除规则条目

--query-rule {ipv4|ipv6|eb}

… --返回是否优先的规则已被添加到链表中

--passthrough {ipv4|ipv6|eb} … --直接传递iptables的命令

--get-all-passthroughs --获取所有直接传递的规则

--get-passthroughs {ipv4|ipv6|eb} … --获取跟踪直通规则

--add-passthrough {ipv4|ipv6|eb} … --添加一个直接规则

--remove-passthrough {ipv4|ipv6|eb} … --移除一个直接规则

--query-passthrough {ipv4|ipv6|eb} … --查询直接规则是否添加

除非将直接规则显式插入到由 fircwa1ld管理的区域, 否则将首先解析直接规则, 然后才会解析任何fircwalld规则,即直接规则优先于firewalld规则。

示例1:添加一些直接规则以将某个IP范围列入黑名单的简短示例:

直接规则主要用于使服务和应用程序能够增加规则。传递的参数 与 iptables, ip6tables 以及 ebtables 一致。

所有来自192.168.0.0/24网络IP,单个IP每分钟最高连接并发是1,超过并发的连接都丢弃

firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist

firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING O -s 192. 168, 0. 0/24 -j blacklist

注意,这里-j 在前面iptables时我们说过,是可以指定自定义链这一target的

firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist O -m limit --limit 1/min -j LOG --log-prefix "blacklisted "

firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP

firewall-cmd --reload

firewall-cmd --direct --get-all-rules

ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist

ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix blacklisted

ipv4 raw blacklist 1 -j DROP

实验完毕,删除规则

firewall-cmd --permanent --direct --remove-rules ipv4 raw blacklist

firewall-cmd --permanent --direct --remove-rules ipv4 raw PREROUTING

firewall-cmd --direct --remove-rules ipv4 raw blacklist

firewall-cmd --direct --remove-rules ipv4 raw PREROUTING

firewall-cmd --direct --remove-chain ipv4 raw blacklist

firewall-cmd --reload

示例2:利用firewalld直接规则来做SNAT和MASQUERADE实现内网共享上网

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth1 -j MASQUERADE -s 172.25.0.0/24

firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth1 -j SNAT -s 172.25.0.0/24 --to-source <外网IP>

firewall-cmd --direct --get-all-passthroughs

富规则一般为了精确控制,用得比较多,所以这里将重点讲解

4.1 富规则常用的options

firewall-cmd

  --list-rich-rules --列出富规则

  --add-rich-rule=    --使用富规则语言添加富规则

  --remove-rich-rule=     --移除富规则

  --query-rich-rule= --查询某条富规则是否存在

  --list-rich-rules --列出指定区域中的所有富规则

  --list-all 和 --list-all-zones --也能列出存在的富规则

4.2 富规则language语法

规则的几乎每个单一元素都能够以option=value形式来采用附加参数,参考firewalld.richlanguage

rule

  [source]

  [destination]

  service|port|protocol|icmp-block|masquerade|forward-port

  [log]

  [audit]

  [accept|reject|drop]

rule [family="ipv4|ipv6"]

source address="address[/mask]" [invert="True"]

destination address="address[/mask]" invert="True"

service name="service name"

port port="port value" protocol="tcp|udp"

protocol value="protocol value"

forward-port port="port value" protocol="tcp|udp" to-port="port value

" to-addr="address"

log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]

accept | reject [type="reject type"] | drop

4.3 一些常用配置规则

4.3.1 规则排序

一旦向某个区域(一般是指防火墙)中添加了多个规则, 规则的排序便会在很大程度上影响防火墙的行为。

对于所有区域, 区域内规则的基本排序是相同的。

1.为该区域设置的任何端口转发和伪装规则。

2.为该区域设置的任何记录规则。

3.为该区域设置的任何允许规则。

4.为该区域设置的任何拒绝规则。

  在所有情况下, 第一个匹配项都将胜出。如果区域中的任何规则与包均不匹配 ,那么通常会拒绝该包

但是区域可能具有不同默认值;例如,可信区域将接受任何不匹配的包。此外,在匹配某个记录规则后,将继续正常处理包。

  直接规则是个例外。对于大部分直接规则,将首先进行解析,然后再由firewalld进行任何其他处理 ,

但是直接规则语法允许管理员在任何区域中的任何位置插入任何规则。

4.3.2 测试和调试

  为了便于测试和调试 几乎所有规则都可以与超时一起添加到运行时配置。

  当包含超时的规则到防火墙时,计时器便针对该规则开始倒计时。

  一旦规则的计时器达到零秒,便从运行时配置中删除该规则。

  在使用远程防火墙时,使用超时会是一种极其有用的工具,特别是在测试更复杂的规则集时。

  如果规则有效,则管理员可以再次添加该规则,但使用--permanent选项(或者至少不包含超时)。

  如果规则没有按预期运行,甚至可能将管理员锁定而使其无法进入系统,那么规则将被自动删除,

  以允许管理员继续其工作。通过在启用规则的firewall-cmd的结尾添加--timeout=即可向运行时规则中添加超时。

4.3.3 使用富规则进行日志记录

  调试或监控防火墙时,记录巳接受或巳拒绝的连接很有用。

  firewalld可以通过两种方法来实现此目的记录到syslog, 或者将消息发送到由auditd管理的内核audit子系统。

  在这两种情况下,记录可能会受到速率限制。

  速率限制确保系统日志文件填充消息的速率不会使系统无法跟上或者填充其所有磁盘空间 。

使用富规则记录到syslog的基本语法为:

log [prefix="" [level=] [limit value=""]

其中:

可以是emerg 、 alert 、 crit 、 error 、 warning 、 notice 、 info或debug之一。

" 可以是s(表示秒)、m(表示分钟)、h(表示小时)或d(表示天)之一。

例如:limit value=3/m会将日志消息限制为每分钟最多三条。

limit value = 3/m 这里是有BUG 的,常常时间控制会不精准。

4.3.4 批量加端口

port port=4000-5234 用这样的形式

firewall-cmd --permanent --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'

用于记录到审计子系统的基本语法为:

audit [limit value=""]

速率限制的配置方式与syslog记录相同。

使用富规则进行记录的某些示例:

1.接受从work区域到SSH的新连接, 以notice级别且每分钟最多三条消息的方式将新连接记录 到syslog。

firewall-cmd --permanent --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit va1ue="3/m" accept

2.在接下来五分钟内, 将拒绝从默认区域中子网2001: db8: : /64到DNS的新IPv6连接,

并且拒绝的连接将记录到audit系统,且每小时最多一条消息。

firewall-crud --add-rich-rule='rule family=ipv6 source address="2001 :db8: :/64" service name=" dns" audit limit va1ue=" 1/h" reject'--timeout=300

4.4 一些配置示例

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'

firewall-cmd --permanent --zone=public --add-rich-rule='rule service name=ftp limit value=1/m accept'

firewall-cmd --permanent --zone=public --add-rich-rule='rule protocol value=esp drop'

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.17.10.0/24 service name=ssh reject'

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 port port=7900-7905 protocol=tcp accept'

针对ssh 链接记录至日志中,每分钟3次

firewall-cmd --permanent --zone=work --add-rich-rule='rule service name=ssh log prefix="ssh " level=notice limit value="3/m" accept'

用于调试,规则在300秒后失效,防止规则设定错误导致网络连接断开

firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 service name=ssh reject' --timeout=300

添加富规则,只允许172.25.0.10/32访问,并且记录日志,日志级别为notice,日志前缀为"NEW HTTP ",限制每秒最多3个并发 ,要求持久化生效

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 service name=http log level=notice prefix="NEW HTTP " limit value="3/s" accept'
firewall-cmd --reloa

1)网络地址转换(NAT)

  firewalld支持两种类型的网络地址转换(NAT) 伪装和端口转发。可以在基本级别使用常规

  frewall-cmd规则来同时配置这两者,更高级的转发配置可以使用富规则来完成。

  这两种形式的NAT会在发送包之前修改包的某些方面如源或目标。

2)伪装(注意:伪装只能和ipv4一起用,ipv6不行)

  通过伪装系统会将并非直接寻址到自身的包转发到指定接收方同时将通过的包的源地址更改为其自己的公共TP地址。

防火墙对这些传入的包应答时会将目标地址修改为原始主机的地址并发送包。这通常在网络边缘上使用以便为内部网络提供Internet访问。

伪装是一种形式的网络地址转换(NAT)

3)配置伪装

要使用常规的firewall-cmd命令为区域配置伪装,使用下列语法:

firewall-cmd --permanent --zone= --add-masquerade

这将伪装满足以下条件的任何包从该区域的源(接口及子网)中定义的客户端发送到防火墙且未寻址到防火墙自身的包,即该区域源的数据包的目标IP不是防火墙自身的IP,都将映射成防火墙的IP。

要在更大程度上控制要进行伪装的客户端,还可以使用富规则。

firewall-cmd --permanent --zone= --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'

4)端口转发

另一种形式的NAT是端口转发。

通过端口转发指向单个端口的流量将转发到相同计算机上的不同端口或者转发到不同计算机上的端口。

此机制通常用于将某个服务器隐藏在另一个计算机后面,或者用于在备用端口上提供对服务的访问权限。

重要:

  当端口转发配置为将包转发到不同计算机时,从该计算机的任何回复通常将直接从该计算机发送到原始客户端。

这将在大部分配置上导致无效连接,因此转发到的计算机必须通过执行端口转发的防火墙来进行伪装。

常见配置是将端口从防火墙计算机转发到已在防火墙后面伪装的计算机,即这种通过目标端口转发的方式需要开启伪装(masquerade)

要使用常规fircwall-cmd命令配置端口转发,可以使用firewalld提供的端口转发语法:

firewall-cmd --permanent --zone= --add-forward-port=port=:proto=[:toport=][:toaddr=]

toport=和toaddr 两部分均可选,但需要至少指定这两者之一 。

例如, 对于来自public区域的客户端,以下命令会将防火墙上通过端口513/TCP传入的连接转发到IP地址为192.168.0.254的计算机上的端口132/TCP

frewall-cmd --permanent --zone=public --add-forward­port=port=513:proto=tcp:toport=132:toaddr=192.168.0.254

要在更大程度上控制端口转发规则,可以将以下语法与富规则配合使用来实现端口转发,这也是我们推荐使用的方式

forward-port port= protocol=tcp|udp [to-port=] [to-addr=

]

以下示例使用富规则将来自work区域中192.168.0.0/4且传入到端口80/TCP的流星转发到防火墙计算机自身上面的和端口8080/TCP:

firewall-cmd --permanent --zone=work --add-rich-rule='rule family=ipv4 source address=l92.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'

其实这里是指传统的目标地址映射,实现外网访问内网资源

firewall-cmd --zone=external --add-masquerade
firewall-cmd --permanent --zone=public --add-forward-port=port=513:proto=tcp:toport=132:toaddr=192.168.0.254
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080'

例子:

把来自172.25.0.10/32并且访问的端口为tcp的443端口的数据包进行端口转发,转发到本机的tcp的22端口

firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=443 protocol=tcp to-port=22'

firewall-cmd --reload

本地端口转发:

firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=80 to-port=22 protocol=tcp'

目标地址转发:

firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=80 to-port=80 protocol=tcp to-addr=172.25.0.254'

一键断网

firewall-cmd --panic-off

firewall-cmd --panic-on

重新会加载内核中的防火墙模块和配置文件

firewall-cmd --complete-reload

这里值得注意的是如果主机开启了SELinux,需要对对于的端口打上标签(SELinux context)

semanage port -l

semanage port -a -t port_label -p tcp|udp PORTNUMBER

semanage port -a -t gopher_port_t -p tcp 71

semanage命令如果是最小化安装,可能没有这个工具,所以需要自己安装,对应的包如下

rpm -qa | grep semanage

libsemanage-2.5-8.el7.x86_64

libsemanage-python-2.5-8.el7.x86_64

6.1 自定义的区域

参照/lib/firewalld/zones/public.xml文件,在/lib/firewalld/zones/下面新建你需要的区域名以.xml结尾,内容格式参照public.xml,trusted.xml等文件即可。

Internal.xml

Internal

For use on internal networks. You mostly trust the other computers on the networks

to not harm your computer. Only selected incoming connections are accepted.

6.2 自定义服务

自定义服务可以让防火墙配置更为简便,能够直接使用服务名来进行策略配置

参照/usr/lib/firewalld/services/ssh.xml,在/usr/lib/firewalld/services/下面新建你需要的服务名以.xml结尾,内容格式参照ssh.xml,samba.xml文件中的内容即可。

samba.xml

Samba

This option allows you to access and participate in Windows file and printer sharin

g networks. You need the samba package installed for this option to be useful.

systemctl stop {ip,eb,ip6}tables #一般默认在RHEL7中是没有开启的

systemctl mask {ip,eb,ip6}tables

systemctl start firewalld

systemctl status firewalld可以看到firewalld启动了

配置文件

/etc/firewalld/{services,zones}/*.xml    优先级最高,permanent模式生效的策略会放到这里

/lib/firewalld/{services,zones}/*.xml   优先级要低些,是一些默认配置,可以当做模板使用

firewall-cmd --permanent

  --使用该option会将配置写入到/etc/firewalld/{services,zones}/*.xml对应的文件中,但是必须使用firewall-cmd --reload来重载配置才能生效,如果不使用     --permanent,那么配置将会马上生效,但是在重启firewalld和重载(reload) firewalld后不会生效,所以是临时的。

查看防火墙的运行状态

  firewall-cmd --state

  systemctl status firewalld

查看防火墙的配置情况

  firewall-cmd --list-all

应急命令(一键断网)

firewall-cmd --panic-on #拒绝所有流量,远程连接会立即断开,只有本地能登陆

firewall-cmd --panic-off #取消应急模式,但需要重启firewalld后才可以远程ssh

firewall-cmd --query-panic #查看是否为应急模式

添加服务和端口以及协议

firewall-cmd --add-service=       #添加服务

firewall-cmd --remove-service=     #移除服务

firewall-cmd --add-port=/ #添加端口/协议(TCP/UDP)

firewall-cmd --remove-port=/    #移除端口/协议(TCP/UDP)

firewall-cmd --list-ports                 #查看开放的端口

firewall-cmd --add-protocol=      #允许协议 (例:icmp,即允许ping)

firewall-cmd --remove-protocol=        #取消协议

firewall-cmd --list-protocols #查看允许的协议

指定某IP或网段的流量通过

firewall-cmd --add-rich-rule="rule family="ipv4" source address="" accept"

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" accept"
  #表示允许来自192.168.2.1的所有流量

指定IP时指定协议

firewall-cmd --add-rich-rule="rule family="ipv4" source address="" protocol value="" accept"

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept"
  #允许192.168.2.208主机的icmp协议,即允许192.168.2.208主机ping

允许指定ip访问指定服务

firewall-cmd --add-rich-rule="rule family="ipv4" source address="" service name="" accept"

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept"

    #允许192.168.2.208主机访问ssh服务

允许指定ip访问指定端口

firewall-cmd --add-rich-rule="rule family="ipv4" source address="" port protocol="" port="" accept"

firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.1" port protocol="tcp" port="22" accept"

  #允许192.168.2.1主机访问22端口

禁止IP和网段

firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" reject"

  #禁止192.168.2.0/24网段的主机访问22端口。

本地端口转发:

firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=80 to-port=22 protocol=tcp accept'

目标地址转发:

firewall-cmd --permanent --add-masquerade

firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.25.0.10/32 forward-port port=80 to-port=80 protocol=tcp to-addr=172.25.0.254 accept'

要使用常规的firewall-cmd命令为区域配置伪装,使用下列语法:

firewall-cmd --permanent --zone= --add-masquerade

这将伪装满足以下条件的任何包从该区域的源(接口及子网)中定义的客户端发送到防火墙且未寻址到防火墙自身的包,即该区域源的数据包的目标IP不是防火墙自身的IP,都将映射成防火墙的IP。

要在更大程度上控制要进行伪装的客户端,还可以使用富规则。

firewall-cmd --permanent --zone= --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'

以上很多纯属个人在学习iptables时的笔记和自行拓展内容,如果有不准确之处还希望大家指出!!!

望大家评论交流!!!