码迷,mamicode.com
首页 > 其他好文 > 详细

【RHEL7/CentOS7防火墙之firewall-cmd命令详解】 񷇺

时间:2019-08-17 23:45:01      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:路由   ESS   ipv4   font   dns   图片   级别   区域   rop   

原文: http://blog.gqylpy.com/gqy/318

"Redhat Enterprise Linux7已默认使用firewalld防火墙,其管理工具是firewall-cmd。使用方式也发生了很大的改变。

基于iptables的防火墙已默认不启动,但仍然可以继续使用。

RHEL7中有这几种防火墙共存:firewalldiptablesip6tablesebtables

RHEL7的内核版本是3.10,在此版本的内核里防火墙的包过滤机制是firewalld,使用firewalld来管理netfilter,不过底层调用的命令仍然是iptables等。
@
***

RHEL7虽然仍有iptables,但不建议使用了,而是使用新的firewalld服务。

# 查firewalld软件包是否安装
[root@CentOS7 ~]# rpm -q firewalld
firewalld-0.5.5-1.fc28.noarch

由于这几种防火墙的daemon是冲突的,所以建议禁用其它几种防火墙。

# 禁用方法一:
[root@CentOS7 ~]# systemctl mask {iptables,ip6tables,ebtables}

# 禁用方法二:
[root@CentOS7 ~]# for service in iptables ip6tables ebtables;do
> systemctl mask ${service}.service
> done

禁用后,我们查询一下这几种防火墙的状态,如下图:技术图片
systemctl命令用于服务控制,详见【Redhat7/CentOS7服务控制之systemctl命令】

firewalld提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的防火墙管理工具,拥有运行时配置永久配置选项。拥有允许服务或应用程序直接添加防火墙规则的接口。
.
以前的system-config-firewall防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核netfilter防火墙模块的卸载和新配置所需要模块的装载等。
.
相反,firewall daemon是动态管理防火墙,应用更改时不必重启整个防火墙,因而也就没有必要重载所有内核防火墙模块。
技术图片

补充知识点
.
预定义服务:这里的服务是端口和(或)协议入口的组合。
.
端口和协议:定义的tcp/udp端口,端口可以是一个端口,也可以是端口范围。
.
ICMP阻塞:可以选择Internet控制报文协议的报文,这些报文可以是报文请求,亦可是对信息请求或错误条件创建的响应。
.
伪装:私有的网络地址可以被映射到公开的IP地址,这是一次正规的地址转换。
.
端口转发:端口可以映射到另一个端口以及(或者)其它主机。
***

Firewalld zone

什么是zone(区域)?网络区域定义了网络链接的可信等级。
技术图片
如上图,数据包若要进入内核,必须经过其中一个zone。而不同的zone里定义的规则也不一样(即信任度不一样,过滤的强度也不一样)。
.
可根据网卡所连接的网络的安全性来判断某张网卡的流量使用的是哪个zone。比如上图中来自eth0网卡的流量全部使用zone1的过滤规则,eth1网卡的流量全部使用zone2的过滤规则。一张网卡同时只能绑定到一个zone.

firewalld默认为我们提供了9个区域,默认就有一些区域是有效的。这些区域按照不信任到信任的顺序排序,如下。
.
起---------------------------------
丢弃区域(Drop Zone)
如果使用丢弃区域,任何进入的数据包都将被丢弃。
这个类似于6.x版本中使用的iptables -j drop
使用丢弃规则意味着将不存在响应。
.
阻塞区域(Block Zone)
阻塞区域会拒绝进入的网络连接,并返回icmp-host-prohibited
只有服务器已经建立的连接会被通过,即只允许由该系统初始化的网络连接。
.
公共区域(Public Zone)
只接受被选中的连接,默认只允许ssh和dhcpv6-client。
这个zone是缺省zone,即被默认使用的Zone。
.
外部区域(External Zone)
只有指定的连接会被接受,即ssh,而其它的连接将被丢弃或不被接受。
这个区域类似于路由器的启用伪装(masquerading)选项。
.
隔离区域(DMZ Zone)
该区域只允许被选中的连接通行。
如果只允许部分服务能被外部访问,可以在DMZ区域中定义。
.
工作区域(Work Zone)
在这个区域,我们只能定义内部网络连接。
比如私有网络通信才被允许,只允许ssh, ipp-client和dhcpv6-client。
.
家庭区域(Home Zone)
这个区域专用于家庭环境。
它同样只允许被选中的连接,即ssh,ipp-client,mdns,samba-client和dhcpv6-client。
.
内部区域(Internal Zone)
这个区域和工作区域类似,只有被选中的连接才可通行,和家庭区域一样。
.
信任区域(Trusted Zone)
信任区域允许所有网络连接通行。
切记:trusted区域是最被信任的区域,使用该区域时,在不做任何配置的情况下允许所有连接通行。
--------------------------------------始
.
以上是系统定义的所有的zone,但这些zone并不是都在使用,只有活跃的zone才有实际操作意义。

Firewalld 原则
.
当一个客户端访问服务器时,服务器将根据以下原则决定使用哪个zone的策略去匹配。
.
1
如果这个客户端数据包的源IP地址匹配zone的sources(来源),那么该zone的规则就适用这个客户端。
注意:一个源只能属于一个zone,不能同时属于多个zone。
.
2
如果这个客户端数据包进入服务器的某一个接口(如eth0)区配zone的interfaces, 则么该zone的规则就适用这个客户端。
一个接口只能属于一个zone,不能同时属于多个zone。
.
3
如果上述两个原则都不满足,那么缺省的zone将被应用,即使用public区域。
***

firewall-cmd

你可以使用任何一种firewalld配置工具来配置区域和防火墙策略。
工具例如firewall-config图形化工具;firewall-cmd命令行工具,命令行工具支持全部防火强特性。

你也可以在配置文件目录中创建或者拷贝区域文件。
/usr/lib/firewalld/zones目录下的文件被用于默认和备用配置。
/etc/firewalld/zones目录下的文件被用于用户创建和自定义的配置文件。
技术图片

基本应用

firewall-cmd --state
获取firewalld状态
.
firewall-cmd --reload
在不改变状态的条件下重载防火墙
.
firewall-cmd --complete-reload
完全重启,状态信息将会丢失
.
firewall-cmd --get-zones
获取支持的区域
.
firewall-cmd --get-services
获取所有支持的服务,支持的服务存放在/usr/lib/firewalld/services目录下。
服务是firewalld所使用的有关端口和选项的规则集合。
被启动的服务会在firewalld服务开启或运行是自动加载。
我们还可以创建自己的服务,即添加端口和服务的对应关系,将在下面讲解。
.
firewall-cmd --get-icmptypes
获取所有支持的ICMP类型
.
firewall-cmd --list-all-zones
列出全部启用的区域的特性(即查询当前防火墙策略),特性是定义的防火墙策略。
策略如:服务、端口和协议的组合、端口/数据报转发、伪装、ICMP拦截或自定义规则等。
该命令会列出所有区域的所有特性,包括详细规则(rich-rules)。
.
firewall-cmd [--zone=区域] --list-all
输出指定区域启用的全部特性,如果区域被省略,将显示默认区域的信息。
.
firewall-cmd --get-default-zone
查默认区域,默认的默认区域为public
.
firewall-cmd --set-default-zone=区域
设置默认区域,也可通过/etc/firewalld/firewalld.conf中的DefaultZone配置项定义默认区域。
流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。
.
firewall-cmd --get-active-zones
获取活动的区域,同时会输出活动区域所包含的接口。
.
firewall-cmd --get-zone-of-interface=网卡名
查指定接口属于哪个区域
.
firewall-cmd [--zone=区域] --add-interface=接口名
将指定接口增加到指定区域,如果区域被省略了,将会被添加到默认区域。
一个接口同时只能属于一个区域,接口会在防火墙重新加载后重新应用。
.
firewall-cmd [--zone=区域] --change-interface=接口名
修改接口所属区域,这个选项与--add-interface选项相似。
但不同的是,当接口已经存在于另一个区域的时候,该接口将被重置到新的区域。
.
firewall-cmd [--zone=区域] --remove-interface=接口名
从指定区域中删除指定接口,删除后,这个接口的所有数据包将使用默认区域的规则。
.
firewall-cmd [--zone=区域] --query-interface=接口名
查指定区域中是否包含指定接口,如果区域被省略了,将被指定为默认区域。
.
firewall-cmd [--zone=区域] --list-services
列举区域中启用的服务,如果区域被省略了,将使用默认区域。
.
firewall-cmd --query-masquerade 检查是否允许NAT转发
firewall-cmd --zone=public --add-masquerade --permanent 永久开启路由转发
firewall-cmd --remove-masquerade 禁止防火墙NAT转发
.
firewall-cmd --panic-on 启用应急模式,将阻断所有网络连接,以防出现紧急状况。
firewall-cmd --panic-off 禁用应急模式
firewall-cmd --query-panic 查应急模式状态
.
其它相关的配置可在手册页man firewall-cmd中查看。

创建自己的服务
.
步骤一
进入目录/usr/lib/firewalld/services,并复制其中一个服务:

[root@CentOS7 ~]# cd /usr/lib/firewalld/services
[root@CentOS7 services]# cp ssh.xml my_server.xml

.
步骤二
修改复制过来的服务文件,打开并编辑文件的头部、描述、协议和端口号,以供自定义的服务使用,如下图:
技术图片
.
步骤三
重启firewalld服务或者重新加载配置,以激活这些设置。
重启命令firewall-cmd --reload
查刚创建服务是否被支持firewall-cmd --get-services | grep my_server
***

开始配置防火墙策略

这里所有的对区域进行的配置都不是永久生效的,重新加载或重启服务后都将失效。

可在命令后面加上--permanent指定为永久生效,重载服务后配置生效。

服务相关

firewall-cmd [--zone=区域] --add-service=服务名 [--timeout=秒]
给某个区域开启某个服务,如果未指定区域,将使用默认区域。
--timeout:用于指定服务在多少秒后从区域中删除。
.
firewall-cmd [--zone=区域] --remove-service=服务
禁用指定区域中的指定服务,如果未指定区域,将使用默认区域。
.
firewall-cmd [--zone=区域] --query-service=服务
查指定区域中是否开启了指定服务,如果未指定区域,将使用默认区域。

端口和协议相关

firewall-cmd [--zone=区域] --add-port=端口(端口范围)/协议 [--timeout=秒数]
此操作将启用端口和协议的组合。如果未指定区域,将使用默认区域。
端口可以是一个单独的端口,也可以是一个端口范围,协议可以是tcp或udp。
示例1:在work区域开启666/tcp端口,失效时间60秒
firewall-cmd --zone=work --add-port=666/tcp --timeout=60
示例2:在默认开启10-20范围的udp端口,失效时间60秒
firewall-cmd --add-port=10-20/udp --timeout=60
.
firewall-cmd [--zone=区域] --remove-port=端口(端口范围)/协议
禁用端口和协议组合,如果未指定区域,将使用默认区域。
端口和协议同上的用法同上示例。
.
firewall-cmd [--zone=区域] --query-port=端口(端口范围)/协议
查询指定区域中是否启用了指定端口和协议的组合,如果未指定区域,将使用默认区域。
端口和协议同上的用法同上示例。

IP伪装相关

firewall-cmd [--zone=区域] --add-masquerade
启用区域中的 IP 伪装功能,私有网络的地址将被隐藏并映射到一个公有IP。
这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。
.
firewall-cmd [--zone=区域] --remove-masquerade
禁用区域中的 IP 伪装。
.
firewall-cmd [--zone=区域] --query-masquerade
查询区域的伪装状态
.
注意:
启用IP伪装功能的主机必须同时开启路由转发服务,具体操作如下:

# 方法一:
[root@CentOS7 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

# 方法二:
[root@CentOS7 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@CentOS7 ~]# sysctl -p

ICMP阻塞相关

ICMP:控制报文协议。
.
firewall-cmd [--zone=区域] --add-icmp-block=icmp类型
此操作将指定的ICMP报文进行阻塞。
ICMP报文可以是请求信息或者创建的应答报文,以及错误应答。
常用的报文类型有:echo-request请求报文,echo-reply响应报文。
.
firewall-cmd [--zone=区域] --remove-icmp-block=icmp类型
禁用指定区域指定的ICMP报文阻塞。
.
firewall-cmd [--zone=区域] --query-icmp-block=icmp类型
查指定区域的是否开启了指定的ICMP报文阻塞。

端口转发/映射相关

请确保开启了本机的路由转发服务,上面已经讲解了开启方法。
并打开firewalld的路由转发服务:firewall-cmd --permanent --zone=public --add-masquerade
.
firewall-cmd [--zone=区域] --add-forward=port=端口(端口范围):proto=协议:toaddress=目的地址
将指定区域负责的端口转发到指定的地址。
端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。
端口号可以是一个单独的端口,也可以是端口范围(例如10-20) ,协议可以为tcp或udp。
目标端口可以是端口号,也可以是端口范围(例如10-20) 。
目标地址必须是IPv4地址。受内核限制,端口转发功能仅可用于IPv4。
示例1:凡是来从work区域进来的22/tcp端口的数据包全部转发到211.106.65.50
firewall-cmd --zone=work --add-forward=port=22:proto=tcp:toaddress=211.106.65.50
示例2:将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080
.
firewall-cmd [--zone=区域] --remove-forward-port=port=端口(端口范围):proto=协议:toaddress=目的地址
禁止区域的端口转发或者端口映射
.
firewall-cmd [--zone=区域] --query-forward-port=port=端口(端口范围):proto=协议:toaddress=目的地址
查询区域的端口转发或者端口映射。

终极用法 富规则

请确保开启了本机的路由转发服务,上面已经讲解了开启方法。
并打开firewalld的路由转发服务:firewall-cmd --permanent --zone=public --add-masquerade
日志文件:/var/log/messages
查已创建的富规则 firewall-cmd --list-rich-rules
.
这里直接以示例讲解
(以下示例未经测试,对照着语法写的,有些示例需要开启路由转发)
```shell

1.允许10.35.89.0/24网段的主机访问本机的ftp服务,同时指定日志的前缀和输出级别:

firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=10.35.89.0/24 service name=ftp log prefix="ftp" level=info accept‘ --permanent

2.允许10.35.89.0/24网段的主机访问本机的80/tcp端口,同时指定日志的前缀和输出级别:

firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=10.35.89.0/24 port port=80 protocol=tcp log prefix="80" level=info accept‘ --permanent

3.将访问端口是808且源ip是192.168.10.0/24的主机转发到10.10.10.2:80

firewall-cmd --add-rich-rule ‘rule family="ipv4" source address="192.168.10.0/24" forward-port port="808" protocol="tcp" to-port="80" to-addr="10.10.10.2"‘ --permanent

4.富规则中使用伪装功能可以更精确详细的限制:

firewall-cmd --add-rich-rule ‘rule family=ipv4 source address=10.10.10.2/24 masquerade‘

5.允许192.168.1.0/24网段的地址访问本机的http服务:

firewall-cmd --zone=public --permanent --add-rich-rule=‘rule family="ipv4" source address="192.168.1.0/24" service name="http" accept‘

6. 禁止192.168.1.0/24网段的地址访问本机的ssh服务:

firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family=ipv4 source address=192.168.1.0/24 service name=ssh reject‘

7. 删除示例6创建的富规则

firewall-cmd --permanent --zone=public --remove-rich-rule=‘rule family=ipv4 source address=192.168.1.0/24 service name=ssh reject‘

8. 允许192.168.1.0/24端口的主机访问本机的8080端口,同时指定日志的前缀和输出级别:

firewall-cmd --permanent --zone=public --add-rich-rule=‘rule family="ipv4" source address="192.168.1.0/24" port port=8080 protocol="tcp" log prefix=proxy level=warning accept‘

9.将访问端口是5432且源ip是192.168.0.0/32的主机转发到本机的80端口:

firewall-cmd --permanent --add-rich-rule ‘rule family=ipv4 source address=192.168.0.0/32 forward-port port=5432 protocol=tcp to-port=80‘

10. 允许icmp协议的数据包通信:

firewall-cmd --add-rich-rule ‘rule protocol value="icmp" accept‘ --permanent

终极用法 修改配置文件

其区域配置文件在/etc/firewalld/zones/目录下。
.
文件内容解析如下图:
技术图片
***

总结

netfilter防火墙总是容易受到规则顺序的影响,因为一条规则在链中没有固定的位置。在一 条规则之前添加或者删除规则都会改变此规则的位置。在静态防火墙模型中,改变防火墙就是重建一个干净和完善的防火墙设置,默认链通常也没有安全的方式添加或删除规则而不影响其它规则。

动态防火墙有附加的防火墙功能链。这些特殊的链按照已定义的顺序进行调用,因而向链中添加规则将不会干扰先前调用的拒绝和丢弃规则。从而利于创建更为合理完善的防火墙配置。 下图是一些由守护进程创建的规则,过滤列表中启用了在公共区域对ssh、mdns和ipp-client的支持:
技术图片

想要了解更多关于firewall防火墙的知识可以查看其相关手册页:
技术图片
rich-rule手册页:
技术图片


"

原文: http://blog.gqylpy.com/gqy/318

【RHEL7/CentOS7防火墙之firewall-cmd命令详解】 񷇺

标签:路由   ESS   ipv4   font   dns   图片   级别   区域   rop   

原文地址:https://www.cnblogs.com/bbb001/p/11370790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!