Redhat Enterprise Linux7 已经默认使用 firewalld 作为防火墙,其使用方式已经变化。
基于 iptables 的防火墙被默认不启动,但仍然可以继续使用。
RHEL7 中有几种防火墙共存:firewalld、iptables、ebtables 等,默认使用 firewalld 作为防
火墙,管理工具是 firewall-cmd。RHEL7 的内核版本是 3.10,在此版本的内核里防火墙的包
过滤机制是 firewalld,使用 firewalld 来管理 netfilter,不过底层调用的命令仍然是 iptables
等。因为这几种 daemon 是冲突的,所以建议禁用其他几种服务
例如若要禁用 iptables、ip6tables、ebtables 防火墙,方法如下图
或
查看这几种服务是否正在运行
或
RHEL7 虽然有 iptables 但是不建议使用了,使用新的 firewalld 服务。
查看 firewalld 软件包是否安装
Firewalld 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的防火墙管理
工具。拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规
则的接口。以前的 system-config-firewall 防火墙模型是静态的,每次修改都要求防火墙完全
重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。相反,
firewall daemon 动态管理防火墙,不需要重启整个防火墙便可应用更改。因而也就没有必
要重载所有内核防火墙模块了。
什么是区域:网络区域定义了网络连接的可信等级
数据包要进入到内核必须要通过这些zone中的一个,而不同的zone里定义的规则不一样(即
信任度不一样,过滤的强度也不一样)。可以根据网卡所连接的网络的安全性来判断,这张
网卡的流量到底使用哪个 zone,比如上图来自 eth0 的流量全部使用 zone1 的过滤规则,eth1
的流量使用 zone2。一张网卡同时只能绑定到一个 zone
预定义的服务:服务是端口和/或协议入口的组合。
端口和协议:定义了 tcp 或 udp 端口,端口可以是一个端口或者端口范围。
kernel
Zone1
Zone2
Zone3
Zone4
eth0
eth1
eth2
ICMP 阻塞:可以选择 Internet 控制报文协议的报文。这些报文可以是信息请求亦可是对信
息请求或错误条件创建的响应。
伪装:私有网络地址可以被映射到公开的 IP 地址。这是一次正规的地址转换。
端口转发:端口可以映射到另一个端口以及/或者其他主机。
在进行 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 将被应用
你可以使用任何一种 firewalld 配置工具来配置或者增加区域,以及修改配置。工具有例如
firewall-config 这样的图形界面工具, firewall-cmd 这样的命令行工具,或者你也可以在配
置文件目录中创建或者拷贝区域文件,/usr/lib/firewalld/zones 被用于默认和备用配置,
/etc/firewalld/zones 被用于用户创建和自定义配置文件。
命令行工具 firewall-cmd 支持全部防火墙特性,基本应用如下:
一般应用:
1、 获取 firewalld 状态
2、在不改变状态的条件下重新加载防火墙:
如果你使用--complete-reload,状态信息将会丢失。
3、获取支持的区域列表
这条命令输出用空格分隔的列表
4、获取所有支持的服务
这条命令输出用空格分隔的列表。
服务是 firewalld 所使用的有关端口和选项的规则集合。被启动的服务会在 firewalld 服务
开启或者运行时自动加载。默认情况下,很多服务是有效的。使用下面命令可列出有效
的服务。
想要列出默认有效的服务,也可以进入下面的目录也能够取得。
#cd /usr/lib/firewalld/services/
想要创建自己的服务,需要在下面的目录下定义它。比如,现在我想添加一个 rhmp 服务,
端口号 1935。首先,任选一个服务复制过来。
接下来把复制过来的文件重命名为“rtmp.xml”,
接下来打开并编辑文件的头部、描述、协议和端口号,以供 RTMP 服务使用,如下图所示
重启 firewalld 服务或者重新加载设置,以激活这些设置。
firewall-cmd --reload
为确认服务是否已经启动,运行下面的命令获取有效的服务列表。
firewall-cmd --get-services
5、获取所有支持的 ICMP 类型
这条命令输出用空格分隔的列表。
6、列出全部启用的区域的特性(即查询当前防火墙策略)
解释:特性可以是定义的防火墙策略,如:服务、端口和协议的组合、端口/数据报转发、
伪装、ICMP 拦截或自定义规则等
上面的命令将会列出每种区域如 block、dmz、drop、external、home、internal、public、trusted
以及 work。如果区域还有其它详细规则(rich-rules)、启用的服务或者端口,这些区域
信息也会分别被罗列出来
7、输出区域全部启用的特性。如果省略区域,将显示默认区域的信息。
firewall-cmd [--zone=] --list-all
输出指定区域启动的特性
8、查看默认区域
public 区域是默认区域。
在文件/etc/firewalld/firewalld.conf 中定义成 DefaultZone=public。
9、设置默认区域
firewall-cmd --set-default-zone=区域名
流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不
受影响。
10、获取活动的区域
这条命令将用以下格式输出每个区域所含接口:
区域名
interfaces : 接口名
11、根据接口获取区域即需要查看哪个区域和这个接口绑定即查看某个接口是属于哪个zone
的:
firewall-cmd --get-zone-of-interface=接口名
这条命令将输出接口所属的区域名称。
12、将接口(网卡)增加到区域
firewall-cmd [--zone=] --add-interface=接口名
如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接
口在重新加载后将重新应用。
13、修改接口所属区域
firewall-cmd [--zone=] --change-interface=接口名
这个选项与 --add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接
口将被添加到新的区域。
14、从区域中删除一个接口
firewall-cmd [--zone=] --remove-interface=接口名
注:如果某个接口不属于任何 Zone,那么这个接口的所有数据包使用默认的 Zone 的规
则
15、查询区域中是否包含某接口
firewall-cmd [--zone=] --query-interface=接口名
如果区域被省略了,将使用默认区域
16、列举区域中启用的服务
firewall-cmd [ --zone= ] --list-services
如果区域被省略了,将使用默认区域
查看 home 区域中启用服务
17、启用应急模式阻断所有网络连接,以防出现紧急状况
18、禁用应急模式
firewall-cmd --panic-off
19、查询应急模式
firewall-cmd --query-panic
其他相关的配置项可以查看 firewall-cmd 的手册页:#man firewall-cmd
处理运行时区域:
运行时模式下对区域进行的修改不是永久有效的。重新加载或者重启后修改将失效。
1、启用区域中的一种服务即给某个区域开启某个服务
firewall-cmd [--zone=区域] --add-service=服务 [--timeout=秒数]
此操作启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时
间,服务将只启用特定秒数。
18、禁用应急模式
firewall-cmd --panic-off
19、查询应急模式
firewall-cmd --query-panic
其他相关的配置项可以查看 firewall-cmd 的手册页:#man firewall-cmd
处理运行时区域:
运行时模式下对区域进行的修改不是永久有效的。重新加载或者重启后修改将失效。
1、启用区域中的一种服务即给某个区域开启某个服务
firewall-cmd [--zone=区域] --add-service=服务 [--timeout=秒数]
此操作启用区域中的一种服务。如果未指定区域,将使用默认区域。如果设定了超时时
间,服务将只启用特定秒数。
使区域中的 ipp-client 服务生效 60 秒:
启用默认区域中的 http 服务:firewall-cmd --add-service=http
2、禁用区域中的某种服务即关闭某个服务
firewall-cmd [--zone=区域] --remove-service=服务
此举禁用区域中的某种服务。如果未指定区域,将使用默认区域。
例:禁止默认区域中的 http 服务:
3、查询区域中是否启用了特定服务
firewall-cmd [--zone=区域] --query-service=服务
Yes 表示服务启用,no 表示服务关掉了。
4、启用区域端口和协议组合
firewall-cmd [--zone=区域] --add-port=portid[-portid]/protocol [--timeout=seconds]
此操作将启用端口和协议的组合。端口可以是一个单独的端口或者是一个端口范围 - 。
协议可以是 tcp 或 udp。
5、禁用端口和协议组合
firewall-cmd [--zone=区域] --remove-port=portid[-portid]/protocol
6、查询区域中是否启用了端口和协议组合
firewall-cmd [--zone=区域] --query-port=portid[-portid]/protocol
7、启用区域中的 IP 伪装功能
firewall-cmd [--zone=区域] --add-masquerade
此操作启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有 IP。这是地址
转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于 IPv4。
8、禁用区域中的 IP 伪装
firewall-cmd [--zone=区域] --remove-masquerade
9、查询区域的伪装状态
firewall-cmd [--zone=区域] --query-masquerade
注意:启用伪装功能的主机同时也需要开启转发服务:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
#vi /etc/sysctl.conf 添加如下内容
net.ipv4.ip_forward = 1
保存退出并执行#sysctl -p 使修改生效
10、启用区域的 ICMP 阻塞功能
firewall-cmd [--zone=区域] --add-icmp-block=icmp 类型
此操作将启用选中的 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]][ :toaddres
s=address [/mask]]
端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。端
口号可以是一个单独的端口或者是端口范围 - 。协议可以为 tcp 或 udp。目标端口可以
是端口号或者是端口范围 - 。目标地址可以是 IPv4 地址。受内核限制,端口转发功能
仅可用于 IPv4。
意思是凡是来从 external 进来的 22 端口的数据包全部转发到 211.106.65.50
firewall-cmd --zone=external
--add-forward-port=port=22:proto=tcp:toaddress=211.106.65.50
14、禁止区域的端口转发或者端口映射
firewall-cmd [--zone=]
--remove-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]][ :toad
dress=address [/mask]]
15、查询区域的端口转发或者端口映射
firewall-cmd
[--zone=]--query-forward-port=port=portid[-portid]:proto=protocol[ :toport=portid[-portid]]
[ :toaddress=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、命令行配置富规则:
查看富规则:# firewall-cmd --list-rich-rules
创建富规则:
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
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
firewall-cmd --add-rich-rule rule family="ipv4" source address="192.168.10.30" forward-port
port="808" protocol="tcp" to-port="80" to-addr="10.10.10.2"
富规则中使用伪装功能可以更精确详细的限制:
firewall-cmd --add-rich-rule 'rule family=ipv4 source address=10.10.10.2/24 masquerade'
仅允许部分 IP 访问本机服务配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"
source address="192.168.0.0/24" service name="http" accept"
禁止远程 IP 访问 ssh
firewall-cmd --permanent --zone=public --add-rich-rule=’rule family=ipv4
source address=192.168.0.0/24 service name=ssh reject’
7、删除 rich 规则
firewall-cmd --permanent --zone=public --remove-rich-rule=’rule family=ipv4
source address=192.168.0.0/24 service name=ssh reject’
8、仅允许部分 IP 访问本机端口配置
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4"
source address="192.168.0.0/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端口。
Server 上的操作:(172.25.0.10 是 desktop 的 IP 地址)
11、172.25.1.0/24 网段内的客户端不能访问主机的 SSH
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>