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

.

这里直接以示例讲解

(以下示例未经测试,对照着语法写的,有些示例需要开启路由转发)

# 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手册页:



【RHEL7/CentOS7防火墙之firewall-cmd命令详解】的更多相关文章

  1. cmd命令详解

    这几天用了一下Windows系统的“黑框”,即win+R键,发现有些命令都忘了,还得查,就总结了一下: cmd命令 CMD命令:开始->运行->键入cmd或command(在命令行里可以看 ...

  2. docker的cmd命令详解-前后台理解

    CMD 指令的格式和 RUN 相似,也是两种格式: shell 格式:CMD <命令> exec 格式:CMD ["可执行文件", "参数1", & ...

  3. Windows学习总结(10)——Windows系统中常用的CMD命令详解

    1.ping命令 ping是电脑网络故障诊断中的常用的命令,它的作用是用来检查网络是否通畅或者网络连接速度.我们来看一下PING命令的具体表述. 日常的诊断过程中我们最常用到的就是诊断连接是否通畅. ...

  4. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  5. CentOS7 防火墙(firewall)的操作命令

    CentOS7 防火墙(firewall)的操作命令 安装:yum install firewalld 1.firewalld的基本使用 启动: systemctl start firewalld 查 ...

  6. Linux常用命令详解—基于CentOS7

    ## Linux 目录- /:根目录,一般只存放目录,不存放文件- /bin -> /usr/bin:可执行二进制文件的目录,也是常用命令目录,如常用的命令 ls.cat.mv 等- /boot ...

  7. net user命令详解

    net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user: ...

  8. net use命令详解

    net use命令详解 1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连 ...

  9. net use命令详解(转)

    net use命令详解 1)建立空连接: net use \\IP\ipc$ "" /user:"" (一定要注意:这一行命令中包含了3个空格) 2)建立非空连 ...

  10. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

随机推荐

  1. Python hangman小游戏

    hangman # words.py 使用pickle永久性存储数据 import pickle filename = 'words.pk' data = ['cat', 'dog', 'perro' ...

  2. android Build系统

    http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/ android Build系统 超链接

  3. 参数化取值策略Random

    1.Random+Each iteration,跟顺序读取的结果唯一不同的就是这里是随机读取,取值是每次迭代取值   2.Random+Each occurrence,随机取值更新方式     3.R ...

  4. SimpleDateFormat 格式化 解析

    package chengbaoDemo; import java.text.DateFormat; import java.text.ParseException; import java.text ...

  5. hrift does not support polymorphic data types

    hrift does not support polymorphic data types Exception in thread "main" com.facebook.swif ...

  6. Java设计模式透析之 —— 模板方法(Template Method)

    今天你还是像往常一样来上班,一如既往地開始了你的编程工作. 项目经理告诉你,今天想在server端添加一个新功能.希望写一个方法.能对Book对象进行处理.将Book对象的全部字段以XML格式进行包装 ...

  7. hdu 4997 Biconnected

    这题主要是计算连通子图的个数(c)和不连通子图的个数(dc)还有连通度为1的子图的个数(c1)和连通度为2以上的子图的个数(c2)之间的转化关系 主要思路大概例如以下: 用状态压缩的方法算出状态为x的 ...

  8. 【翻译自mos文章】11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值

    [翻译自mos文章]11.2.0.4及更高版本号的asm实例中MEMORY_TARGET 和 MEMORY_MAX_TARGET的默认值和最小值 来源于: Default and Minimum ME ...

  9. DPI深度报文检测架构及关键技术实现

    DPI深度报文检测架构及关键技术实现 当前DPI(Deep Packet Inspect深度报文识别)技术是安全领域的关键技术点之一,围绕DPI技术衍生出的安全产品类型也非常的多样.在分析DPI的进一 ...

  10. Common webpart properties in kentico

    https://devnet.kentico.com/docs/7_0/devguide/index.html?common_web_part_properties.htm HTML Envelope ...