Redhat Enterprise Linux7已经默认使用firewalld作为防火墙,其使用方式已经变化。

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

RHEL7中有几种防火墙共存:firewalld、iptables、ebtables等,默认使用firewalld作为防火墙,管理工具是firewall-cmd。RHEL7的内核版本是3.10,在此版本的内核里防火墙的包过滤机制是firewalld,使用firewalld来管理netfilter,不过底层调用的命令仍然是iptables等。因为这几种daemon是冲突的,所以建议禁用其他几种服务

RHEL7.0 系列 防火墙_防火墙

例如若要禁用iptables、ip6tables、ebtables防火墙,方法如下图

RHEL7.0 系列 防火墙_非洲_02

RHEL7.0 系列 防火墙_国家_03

查看这几种服务是否正在运行

RHEL7.0 系列 防火墙_非洲_04

RHEL7.0 系列 防火墙_非洲_05

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

查看firewalld软件包是否安装

RHEL7.0 系列 防火墙_防火墙_06

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

RHEL7.0 系列 防火墙_防火墙_07

总结:firewalld的一个最大的优点是任何改动实时生效,因为他只对变化的部分做了修改;而iptables是重新创建所有的rule,因此会断掉当前的连接。

什么是区域:网络区域定义了网络连接的可信等级。这是一个一对多的关系,这意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。

RHEL7.0 系列 防火墙_国家_08

数据包要进入到内核必须要通过这些zone中的一个,而不同的zone里定义的规则不一样(即信任度不一样,过滤的强度也不一样)。可以根据网卡所连接的网络的安全性来判断,这张网卡的流量到底使用哪个zone,比如上图来自eth0的流量全部使用zone1的过滤规则,eth1的流量使用zone3。一张网卡同时只能绑定到一个zone。大家就可以把这些zone想象成进入火车站(地铁)的安检,不同的入口检测的严格度不一样

预定义的服务:服务是端口和/或协议入口的组合。

端口和协议:定义了 tcp 或 udp 端口,端口可以是一个端口或者端口范围。

ICMP 阻塞:可以选择 Internet 控制报文协议的报文。这些报文可以是信息请求亦可是对信息请求或错误条件创建的响应。

伪装:私有网络地址可以被映射到公开的IP地址。这是一次正规的地址转换。

端口转发:端口可以映射到另一个端口以及/或者其他主机。

在进行firewalld配置之前,我想来讨论一下区域(zones)这个概念。默认情况就有一些有效的区域。我们需要网络接口分配区域。区域规定了区域是网络接口信任或者不信任网络连接的标准。区域(zone)包含服务和端口。接下来让我们讨论Firewalld中那些有用的区域(zones)。由firewalld 提供的区域按照从不信任到信任的顺序排序。

?丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃。这个类似与我们之前使用iptables -j drop。使用丢弃规则意味着将不存在响应,只有流出的网络连接有效。

?阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过即只允许由该系统初始化的网络连接。

?公共区域(Public Zone):只接受那些被选中的连接,默认只允许 ssh 和 dhcpv6-client。这个 zone 是缺省 zone,服务器可以通过特定的端口数据,而其它的连接将被丢弃。

?外部区域(External Zone):这个区域相当于路由器的启用伪装(masquerading)选项。只有指定的连接会被接受,即ssh,而其它的连接将被丢弃或者不被接受。

?隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义。它也拥有只通过被选中连接的特性,即ssh。

?工作区域(Work Zone):在这个区域,我们只能定义内部网络。比如私有网络通信才被允许,只允许ssh,ipp-client和 dhcpv6-client。

?家庭区域(Home Zone):这个区域专门用于家庭环境。我们可以利用这个区域来信任网络上其它主机不会侵害你的主机。它同样只允许被选中的连接,即ssh,ipp-client,mdns,samba-client和 dhcpv6-client。

?内部区域(Internal Zone):这个区域和工作区域(Work Zone)类似,只有通过被选中的连接,和home区域一样。

?信任区域(Trusted Zone):信任区域允许所有网络通信通过。记住:因为trusted是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为trusted是允许所有连接的

以上是系统定义的所有的 zone,但是这些 zone 并不是都在使用。只有活跃的 zone 才有实际操作意义。

Firewalld的原则:

如果一个客户端访问服务器,服务器根据以下原则决定使用哪个 zone 的策略去匹配

1.如果一个客户端数据包的源 IP 地址匹配 zone 的 sources,那么该 zone 的规则就适

用这个客户端;一个源只能属于一个zone,不能同时属于多个zone。

2.如果一个客户端数据包进入服务器的某一个接口(如eth0)区配zone的interfaces,

则么该 zone 的规则就适用这个客户端;一个接口只能属于一个zone,不能同时属于多个zone。

3.如果上述两个原则都不满足,那么缺省的 zone 将被应用

我应该选用哪个区域?

例如,公共的 WIFI 连接应该主要为不受信任的,家庭的有线网络应该是相当可信任的。根据与你使用的网络最符合的区域进行选择。

如何配置或者增加区域?

你可以使用任何一种 firewalld 配置工具来配置或者增加区域,以及修改配置。工具有例如firewall-config 这样的图形界面工具, firewall-cmd 这样的命令行工具,以及D-BUS接口(D-BUS 接口提供防火墙状态的信息,使防火墙的启用、停用或查询设置成为可能。)。或者你也可以在配置文件目录中创建或者拷贝区域文件。/usr/lib/firewalld/zones 被用于默认和备用配置,/etc/firewalld/zones 被用于用户创建和自定义配置文件。

如何为网络连接设置或者修改区域

区域设置以 ZONE=区域名,存储在网络连接的ifcfg文件中。如果这个选项缺失或者为空,firewalld 将使用配置的默认区域。

如果这个连接受到 NetworkManager 控制(在网卡配置文件中添加NM_CONTROLLED=no则该连接不接受NetworkManager控制),你也可以使用 nm-connection-editor 来修改区域。

由 NetworkManager 控制的网络连接,防火墙不能够通过 NetworkManager 显示的名称来配置网络连接,只能配置网络接口。因此在网络连接之前 NetworkManager 将配置文件所述连接对应的网络接口告诉 firewalld 。如果在配置文件中没有配置区域,接口将配置到 firewalld 的默认区域。如果网络连接使用了不止一个接口,所有的接口都会应用到 fiwewalld。接口名称的改变也将由 NetworkManager 控制并应用到firewalld。

如果一个接口断开了, NetworkManager 也将告诉 firewalld 从区域中删除该接口。

当 firewalld 由 systemd 或者 init 脚本启动或者重启后,firewalld 将通知 NetworkManager 把网络连接增加到区域。

命令行工具firewall-cmd支持全部防火墙特性,基本应用如下:

一般应用:

1、 获取firewalld状态

RHEL7.0 系列 防火墙_国家_09

2、在不改变状态的条件下重新加载防火墙:

RHEL7.0 系列 防火墙_国家_10

如果你使用--complete-reload,状态信息将会丢失。这个选项应当仅用于处理防火墙问题时,例如,状态信息和防火墙规则都正常,但是不能建立任何连接的情况。

3、获取支持的区域列表

RHEL7.0 系列 防火墙_最大的_11

这条命令输出用空格分隔的列表

4、获取所有支持的服务

RHEL7.0 系列 防火墙_国家_12

这条命令输出用空格分隔的列表。

服务是firewalld所使用的有关端口和选项的规则集合。被启动的服务会在firewalld服务开启或者运行时自动加载。默认情况下,很多服务是有效的。使用下面命令可列出有效的服务。

想要列出默认有效的服务,也可以进入下面的目录也能够取得。

# cd /usr/lib/firewalld/services/

RHEL7.0 系列 防火墙_非洲_13

想要创建自己的服务,需要在下面的目录下定义它。比如,现在我想添加一个rhmp服务,端口号1935。首先,任选一个服务复制过来。

RHEL7.0 系列 防火墙_国家_14

接下来把复制过来的文件重命名为“rtmp.xml”,

RHEL7.0 系列 防火墙_非洲_15

接下来打开并编辑文件的头部、描述、协议和端口号,以供RTMP服务使用,如下图所示。

RHEL7.0 系列 防火墙_非洲_16

重启firewalld服务或者重新加载设置,以激活这些设置。

# firewall-cmd --reload

为确认服务是否已经启动,运行下面的命令获取有效的服务列表。

# firewall-cmd --get-services

RHEL7.0 系列 防火墙_非洲_17

5、获取所有支持的ICMP类型

RHEL7.0 系列 防火墙_非洲_18

这条命令输出用空格分隔的列表。

6、列出全部启用的区域的特性(即查询当前防火墙策略)

解释:特性可以是预定义的防火墙功能,如:服务、端口和协议的组合、端口/数据报转发、伪装、ICMP 拦截或自定义规则等

RHEL7.0 系列 防火墙_防火墙_19

上面的命令将会列出每种区域如block、dmz、drop、external、home、internal、public、trusted以及work。如果区域还有其它详细规则(rich-rules)、启用的服务或者端口,这些区域信息也会分别被罗列出来

7、输出区域全部启用的特性。如果省略区域,将显示默认区域的信息。

firewall-cmd [--zone=] --list-all

RHEL7.0 系列 防火墙_非洲_20

输出指定区域启动的特性

RHEL7.0 系列 防火墙_非洲_21

8、查看默认区域

RHEL7.0 系列 防火墙_国家_22

public区域是默认区域。

在文件/etc/firewalld/firewalld.conf中定义成DefaultZone=public。

9、设置默认区域

firewall-cmd --set-default-zone=区域名

RHEL7.0 系列 防火墙_国家_23

流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。

10、获取活动的区域

RHEL7.0 系列 防火墙_非洲_24

这条命令将用以下格式输出每个区域所含接口:

区域名

interfaces : 接口名

11、根据接口获取区域即需要查看哪个区域和这个接口绑定即查看某个接口是属于哪个zone的:

firewall-cmd --get-zone-of-interface=接口名

RHEL7.0 系列 防火墙_非洲_25

这条命令将输出接口所属的区域名称。

12、将接口(网卡)增加到区域

firewall-cmd [--zone=] --add-interface=接口名

RHEL7.0 系列 防火墙_非洲_26

如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。

13、修改接口所属区域

firewall-cmd [--zone=] --change-interface=接口名

RHEL7.0 系列 防火墙_国家_27

这个选项与 --add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。

14、从区域中删除一个接口

firewall-cmd [--zone=] --remove-interface=接口名

RHEL7.0 系列 防火墙_国家_28

注:如果某个接口不属于任何Zone,那么这个接口的所有数据包使用默认的Zone的规则

15、查询区域中是否包含某接口

firewall-cmd [--zone=] --query-interface=接口名

RHEL7.0 系列 防火墙_最大的_29

如果区域被省略了,将使用默认区域

16、列举区域中启用的服务

firewall-cmd [ --zone= ] --list-services

RHEL7.0 系列 防火墙_防火墙_30

如果区域被省略了,将使用默认区域

查看home区域中启用服务

RHEL7.0 系列 防火墙_非洲_31

17、启用应急模式阻断所有网络连接,以防出现紧急状况

18、禁用应急模式

firewall-cmd --panic-off

19、查询应急模式

firewall-cmd --query-panic

其他相关的配置项可以查看firewall-cmd的手册页:#man firewall-cmd

处理运行时区域:

运行时模式下对区域进行的修改不是永久有效的。重新加载或者重启后修改将失效。

1、启用区域中的一种服务即给某个区域开启某个服务

firewall-cmd [--zone=区域] --add-service=服务 [--timeout=秒数]

此操作启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时间,服务将只启用特定秒数。

RHEL7.0 系列 防火墙_国家_32

使区域中的 ipp-client 服务生效60秒:

启用默认区域中的http服务:firewall-cmd --add-service=http

2、禁用区域中的某种服务即关闭某个服务

firewall-cmd [--zone=区域] --remove-service=服务

此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。

:禁止默认区域中的 http 服务:

RHEL7.0 系列 防火墙_防火墙_33

3、查询区域中是否启用了特定服务

firewall-cmd [--zone=区域] --query-service=服务

RHEL7.0 系列 防火墙_非洲_34

Yes表示服务启用,no表示服务关掉了。

4、启用区域端口和协议组合

firewall-cmd [--zone=区域] --add-port=portid[-portid]/protocol [--timeout=seconds]

此操作将启用端口和协议的组合。端口可以是一个单独的端口或者是一个端口范围 - 。协议可以是tcpudp

RHEL7.0 系列 防火墙_最大的_35

5、禁用端口和协议组合

firewall-cmd [--zone=区域] --remove-port=portid[-portid]/protocol

RHEL7.0 系列 防火墙_国家_36

6、查询区域中是否启用了端口和协议组合

firewall-cmd [--zone=区域] --query-port=portid[-portid]/protocol

RHEL7.0 系列 防火墙_非洲_37

7、启用区域中的 IP 伪装功能

firewall-cmd [--zone=区域] --add-masquerade

此操作启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。

8、禁用区域中的 IP 伪装

firewall-cmd [--zone=区域] --remove-masquerade

9、查询区域的伪装状态

firewall-cmd [--zone=区域] --query-masquerade

10、启用区域的 ICMP 阻塞功能

firewall-cmd [--zone=区域] --add-icmp-block=icmp类型

RHEL7.0 系列 防火墙_非洲_38

此操作将启用选中的 Internet 控制报文协议(ICMP)报文进行阻塞。 ICMP 报文可以是请求信息或者创建的应答报文,以及错误应答。

11、禁止区域的 ICMP 阻塞功能

firewall-cmd [--zone=区域] --remove-icmp-block=icmp类型

12、查询区域的 ICMP 阻塞功能

firewall-cmd [--zone=区域] --query-icmp-block=icmp类型

13、在区域中启用端口转发或映射

firewall-cmd [--zone=区域] --add-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddr=address [/mask]]

端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端口号可以是一个单独的端口或者是端口范围 - 。协议可以为tcpudp。目标端口可以是端口号或者是端口范围 - 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能仅可用于IPv4。

意思是凡是来从external进来的22端口的数据包全部转发到211.106.65.50

firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toaddr=211.106.65.50

14、禁止区域的端口转发或者端口映射

firewall-cmd [--zone=] --remove-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddr=address [/mask]]

15、查询区域的端口转发或者端口映射

firewall-cmd [--zone=]--query-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toaddr=address [/mask]]

处理永久区域:

永久选项不直接影响运行时的状态。这些选项仅在重载或者重启服务时可用。为了使用运行时和永久设置,需要分别设置两者。选项--permanent需要是永久设置的第一个参数。

1、获取永久选项所支持的服务

firewall-cmd --permanent --get-services

2、获取永久选项所支持的ICMP类型列表

firewall-cmd --permanent --get-icmptypes

3、获取支持的永久区域

firewall-cmd --permanent --get-zones

4、配置防火墙在public区域打开http协议,并保存,以致重启有效

firewall-cmd --permanent --zone=public --add-service=http

查看永久模式下public区域是否打开http服务。

firewall-cmd --permanent --zone=public --query-service=http

5、防火墙开放8080端口在public区域

firewall-cmd --permanent --zone=public --add-port=8080/tcp

6、仅允许部分IP访问本机服务配置

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"

source address="192.168.0.4/24" service name="http" accept"

禁止远程IP访问ssh

firewall-cmd --permanent --zone=public --add-rich-rule=’rule family=ipv4

source address=192.168.0.4/24 service name=ssh accept’

查看rich规则

Firewall-cmd --list-rich-rules

7、删除rich规则

firewall-cmd --permanent --zone=public --remove-rich-rule=’rule family=ipv4

source address=192.168.0.4/24 service name=ssh accept’

8、仅允许部分IP访问本机端口配置

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"

source address="192.168.0.4/24"port protocol="tcp" port="8080" accept"

9、创建rich规则,可以指定日志的前缀和输出级别

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

可以通过查看/var/log/messages日志文件

10、端口转发。实验环境下,desktop访问server的5423端口,将访问server的80端口。

RHEL7.0 系列 防火墙_最大的_39

Server上的操作:(172.25.0.10是desktop的IP地址)

11、172.25.1.0/24网段内的客户端不能访问主机的SSH

RHEL7.0 系列 防火墙_防火墙_40

12、也可通过配置以下XML文件,进行对防火墙的配置修改

#cat /etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>

<zone>

<short>Public</short>

<description>For use in public areas. You do not trust the other computers on networks

to not harm your computer. Only selected incoming connections are accepted.</description>

<service name="dhcpv6-client"/>

<service name="ssh"/>

<rule family="ipv4">

<source address="192.168.0.4/24"/>

<service name="http"/>

<accept/>

</rule>

</zone>

总结

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

动态防火墙有附加的防火墙功能链。这些特殊的链按照已定义的顺序进行调用,因而向链中添加规则将不会干扰先前调用的拒绝和丢弃规则。从而利于创建更为合理完善的防火墙配置。

下面是一些由守护进程创建的规则,过滤列表中启用了在公共区域对 ssh , mdns 和 ipp-client 的支持:

RHEL7.0 系列 防火墙_国家_41

直接选项 :

直接选项主要用于使服务和应用程序能够增加规则。规则不会被保存,在重新加载或者重启之后必须再次提交。传递的参数与iptables, ip6tables 以及 ebtables 一致。选项--direct需要是直接选项的第一个参数。

相关知识查看firewall-cmd手册页#man firewall-cmd

区域

网络或者防火墙区域定义了连接的可信程度。firewalld 提供了几种预定义的区域。区域配置选项和通用配置信息可以在firewall.zone(5)的手册里查到。

服务

服务可以是一系列本读端口、目的以及附加信息,也可以是服务启动时自动增加的防火墙助手模块。预定义服务的使用使启用和禁用对服务的访问变得更加简单。服务配置选项和通用文件信息在 firewalld.service(5) 手册里有描述。

ICMP 类型

Internet 控制报文协议 (ICMP) 被用以交换报文和互联网协议 (IP) 的错误报文。在 firewalld 中可以使用 ICMP 类型来限制报文交换。 ICMP 类型配置选项和通用文件信息可以参阅 firewalld.icmptype(5) 手册。

直接接口

直接接口主要用于服务或者应用程序增加特定的防火墙规则。这些规则并非永久有效,并且在收到 firewalld 通过 D-Bus 传递的启动、重启、重载信号后需要重新应用。

运行时配置

运行时配置并非永久有效,在重新加载时可以被恢复,而系统或者服务重启、停止时,这些选项将会丢失。

永久配置

永久配置存储在配置文件种,每次机器重启或者服务重启、重新加载时将自动恢复。

图形化配置工具

firewall daemon 主要的配置工具是firewall-config。它支持防火墙的所有特性(除了由服务/应用程序增加规则使用的直接接口)。管理员也可以用它来改变系统或用户策略。

命令行客户端

firewall-cmd是命令行下提供大部分图形工具配置特性的工具。

附录:要想了解更多firewall防火墙更多知识可以查看firewall的相关手册页,下图所显示的就是firewall防火墙的相关手册页:

RHEL7.0 系列 防火墙_非洲_42

若要查看rich-rule手册页

RHEL7.0 系列 防火墙_非洲_43

 RHEL7.0 系列 防火墙_最大的_44

例如:允许icmp协议的数据包通信

RHEL7.0 系列 防火墙_非洲_45

七、链路聚合

NIC teaming,简单的说就是多个物理端口绑定在一起当成一个逻辑端口使用,以便提高带宽,实现负载平衡或高可用的功能。RHEL7里面是通过runner (可以视作一段代码)来实现不同的目的。

配置的基本过程就是配置一个逻辑端口的连接,视作master;然后把需要的物理端口配置成slave 连接,绑定到组。然后把这个逻辑端口分配IP就可以用了

team:高可用性

首先准备两块网卡,它们有不同的MAC地址

RHEL7.0 系列 防火墙_最大的_46

创建一个新连接,类型是team连接名称team0。

RHEL7.0 系列 防火墙_国家_47

activebackup表示热备,loadbalance表示负载均衡

例如将activebackup改成loadbalance

RHEL7.0 系列 防火墙_国家_48

master 配置好了,还得配置slave,即将eno16777736和eno33554960两块网卡加入到team0

RHEL7.0 系列 防火墙_非洲_49

执行nmcli connection show命令查看team0-1和team0-2的状态

RHEL7.0 系列 防火墙_非洲_50

上图可以看出team0-1和team0-2没有连接,执行下列命令连接team0-1和team0-2

RHEL7.0 系列 防火墙_国家_51

执行ifconfig,发现网卡的地址都一样了,这样交换机才能转发包到同一个逻辑端口

RHEL7.0 系列 防火墙_国家_52

最后给team0 分配一个IP地址(也可以直接用图形工具设置IP地址)

RHEL7.0 系列 防火墙_最大的_53

测试一下,先看看team0当前状态

RHEL7.0 系列 防火墙_最大的_54

关掉eno16777736的连接,自动切换到第二个物理端口了,测试成功

RHEL7.0 系列 防火墙_防火墙_55