文章目录
- 前言
- 一、firewalld概述
- 1. 概念
- 2. firewalld和iptables的关系
- 二、firewalld网络区域
- 1. firewalld区域的概念
- 2. firewalld预定义区域
- 3. firewalld数据包的处理
- 3.1 firewalld数据处理流程
- 3.2 firewalld检查数据包的源地址的规则
- 3.3 总结
- 三、firewalld防火墙的配置方法
- 1. 使用firewall-cmd命令行工具
- 1.1 区域管理
- 1.2 服务管理
- 1.4 端口管理
- 1.5 协议管理
- 1.6 设置地址转换
- 2.使用firewall-config图形工具
- 3.编写/etc/firewalld/中的配置文件
前言
在Internet中,企业通过架设各种应用系统来为用户提供各种网络服务,比如Web网站、电子邮件、FTP服务器等。而且大部分都是使用Linux服务器进行搭建的。那么,想要保护这些服务器,过滤非授权的访问,甚至恶意进入内部网络 。就需要使用到——防火墙。
防火墙除了硬件防火墙之外,Linux系统的防火墙也十分强大,今天主要认识CentOS 7系统的防火墙——firewalld。
一、firewalld概述
1. 概念
firewalld防火墙是centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。
firewalld和liptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfiter网络过滤子系统(属于内核态)来实现包过滤就火墙功能。
firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算〉,并且拥有两种配置模式:运行时配置与永久配置。
2. firewalld和iptables的关系
基于方式不同
iptables主要是基于接口,来设置规则,从而判断网络的安全性。
firewalld是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全。与硬件防火墙的设置相类似。
配置文件所在位置不同
iptables 在/etc/sysconfig/iptables
中储存配置,
firewalld将配置储存在/etc/firewalld/
(优先加载)和/usr/lib/firewalld/
(默认的配置文件)中的各种XML文件里。
对规则修改不同
使用iptables 每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables
里读取所有新的规则。(规则修改完后会立即生效)
使用firewalld 却不会再创建任何新的规则,仅仅运行规则中的不同之处。因此firewalld可以在运行时间内,改变设置而不丢失现行连接。
防火墙类型不同
iptables防火墙类型为静态防火墙。可以理解为iptables的规则就是一张表,对表进行增删改查操作。
firewalld防火墙类型为动态防火墙。可以理解为firewalld的规则是一块区域,可以更换不同的区域进行增删改查操作。
二、firewalld网络区域
1. firewalld区域的概念
firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone)。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。
2. firewalld预定义区域
- 区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。
- 可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口。
- 默认情况下,
public
区域是默认区域,包含所有接口(网卡)。 - 最终一个区域的安全程度是取决于管理员在此区域中设置的规则。
如果数据包的源地址与区域绑定,则此数据包不管从那个网卡传入都使用改区域的规则过滤数据包。如果数据包的源地址未与区域绑定,则此数据从哪个网卡传入则使用该网卡绑定的区域规则过滤数据包。
区域名 | 含义 |
---|---|
trusted (信任区域) | 允许所有的传入流量。 |
public (公共区域) | 默认允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。 |
external (外部区域) | 默认允许与 ssh预定义服务匹配的传入流量,其余均拒绝。 默认将通过此区域转发的IPv4传出流量将进行地址伪装(MASQUERADE),可用于为路由器启用了伪装功能的外部网络。 |
home (家庭区域) | 默认允许与ssh、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。 |
internal (内部区域) | 默认值时与home区域相同。 |
work (工作区域) | 允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。 |
dmz (隔离区域也称为非军事区域) | 默认允许与 ssh预定义服务匹配的传入流量,其余均拒绝。 |
block (限制区域) | 拒绝所有传入流量。 |
drop (丢弃区域) | 丢弃所有传入流量,并且不产生包含ICMP的错误响应。 |
注意:默认情况的默认区域为public(默认与所有网卡绑定),要激活某个区域,就需要将区域与源地址网卡绑定。
3. firewalld数据包的处理
3.1 firewalld数据处理流程
firewalld对于进入系统的数据包,会根据数据包的源I地址或传入的网络接口等条件,将数据流量转入相应区域的防火靖规则。对于进入系统的数据包,首先捡查的就是其源地址。
3.2 firewalld检查数据包的源地址的规则
若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突),则执行该区域所制定的规则。
若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突〉,则使用传入网络接口的区域并执行该区域所制定的规则。
若网络接口也未关联到特定的区域(即源地址或接口都没有绑定特定的某个区域),则使用默认区域并执行该区域所制定的规则。
3.3 总结
先检查传入数据包的源地址,若源地址与特定区域绑定,则使用该区域的规则过滤数据包。若源地址与特定区域没有绑定,且数据包传入网卡与特定区域绑定,则使用绑定网卡的区域的规则过滤数据包。若也没有区域绑定网卡,则使用默认区域的规则过滤数据包。
三、firewalld防火墙的配置方法
1. 使用firewall-cmd命令行工具
--get-default-zone :显示当前默认区域
--set-default-zone=<zone> :设置默认区域
--get-active-zones :显示当前正在使用的区域及其对应的网卡接口
--get-zones :显示所有可用的区域
--get-zone-of-interface=<interface> :显示指定接口绑定的区域
--zone=<zone> --add-interface=<interface> :为指定接口绑定区域
--zone=<zone> --change-interface=<interface> :为指定的区域更改绑定的网络接口
--zone=<zone> --remove-interface=<interface> :为指定的区域删除绑定的网络接口
--list-all-zones :显示所有区域及其规则
[--zone=<zone>] --list-all :显示所有指定区域的所有规则,省略--zone=<zone>时表示仅对默认区域操作
[--zone=<zone>] --list-services :显示指定区域内允许访问的所有服务
[--zone=<zone>] --add-service=<service> :为指定区域设置允许访问的某项服务
[--zone=<zone>] --remove-service=<service> :删除指定区域已设置的允许访问的某项服务
[--zone=<zone>] --list-ports :显示指定区域内允许访问的所有端口号
[--zone=<zone>] --add-port=<portid>[-<portid>]/<protocol> :为指定区域设置允许访问的某个/某段端口号(包括协议名)
[--zone=<zone>] --remove-port=<portid>[-<portid>]/<protocol> :删除指定区域已设置的允许访问的端口号(包括协议名)
[--zone=<zone>] --list-icmp-blocks :显示指定区域内拒绝访问的所有 ICMP 类型
[--zone=<zone>] --add-icmp-block=<icmptype> :为指定区域设置拒绝访问的某项 ICMP 类型
[--zone=<zone>] --remove-icmp-block=<icmptype> :删除指定区域已设置的拒绝访问的某项ICMP类型
firewall-cmd --get-icmptypes :显示所有 ICMP 类型
1.1 区域管理
网卡接口显示操作
###显示所有可用的区域
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
###显示当前默认区域
[root@localhost ~]# firewall-cmd --get-default-zone
public
###显示当前正在使用的区域及其对应的网卡接口
[root@localhost ~]# firewall-cmd --get-active-zones
public
interfaces: ens32 ens33
###显示指定ens33接口绑定的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
public
###显示指定ens32接口绑定的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public
网卡接口添加与移除操作
###为指定的区域删除绑定的网络接口
[root@localhost ~]# firewall-cmd --remove-interface=ens33
success
###显示指定接口绑定的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
no zone
###为指定接口绑定区域
[root@localhost ~]# firewall-cmd --add-interface=ens33 --zone=work
success
###显示指定接口绑定的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
work
###显示当前正在使用的区域及其对应的网卡接口
[root@localhost ~]# firewall-cmd --get-active-zones
work
interfaces: ens33
public
interfaces: ens32
网卡接口修改操作
###为指定的区域更改绑定的网络接口
[root@localhost ~]# firewall-cmd --change-interface=ens33 --zone=home
success
[root@localhost ~]# firewall-cmd --get-active-zones
home
interfaces: ens33
public
interfaces: ens32
源地址操作
###为指定源地址绑定区域
[root@localhost ~]# firewall-cmd --add-source=2.2.2.2 --zone=work
success
###显示当前正在使用的区域及其对应的网卡接口或者源地址
[root@localhost ~]# firewall-cmd --get-active-zones
home
interfaces: ens33
work
sources: 2.2.2.2
public
interfaces: ens32
###为指定的区域更改绑定的源地址
[root@localhost ~]# firewall-cmd --change-source=2.2.2.2 --zone=internal
success
###显示当前正在使用的区域及其对应的网卡接口或者源地址
[root@localhost ~]# firewall-cmd --get-active-zones
home
interfaces: ens33
internal
sources: 2.2.2.2
public
interfaces: ens32
###为指定的区域移除绑定的源地址
[root@localhost ~]# firewall-cmd --remove-source=2.2.2.2 --zone=internal
success
###显示当前正在使用的区域及其对应的网卡接口或者源地址
[root@localhost ~]# firewall-cmd --get-active-zones
home
interfaces: ens33
public
interfaces: ens32
显示所有区域及其规则
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@localhost ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
drop
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
home (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
work (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 1.1.1.1
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
显示所有指定区域的所有规则
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens32
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@localhost ~]# firewall-cmd --list-all --zone=work
work (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 1.1.1.1
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
省略--zone=<zone>
时表示仅对默认区域操作。
1.2 服务管理
###显示默认区域(public)内允许访问的所有服务
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client ssh
###为默认区域(public)设置允许访问的某项服务
[root@localhost ~]# firewall-cmd --add-service=http
success
###显示默认区域(public)内允许访问的所有服务
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client http ssh
###显示指定区域(home)内允许访问的所有服务
[root@localhost ~]# firewall-cmd --list-services --zone=home
dhcpv6-client mdns samba-client ssh
###为指定区域(home)设置允许访问的某项服务
[root@localhost ~]# firewall-cmd --add-service=http --zone=home
success
###显示指定区域(home)内允许访问的所有服务
[root@localhost ~]# firewall-cmd --list-services --zone=home
dhcpv6-client http mdns samba-client ssh
###删除指定区域(home)已设置的允许访问的某项服务
[root@localhost ~]# firewall-cmd --remove-service=http --zone=home
success
###显示指定区域(home)内允许访问的所有服务
[root@localhost ~]# firewall-cmd --list-services --zone=home
dhcpv6-client mdns samba-client ssh
注意:一个区域可以绑定多个网卡或者多个源地址,一个网卡或者一个源地址只能绑定一个区域。
如果想要同时添加多个服务可以使用以下方式
[root@localhost ~]# firewall-cmd --add-service=ftp --add-service=http
success
[root@localhost ~]# firewall-cmd --list-services
dhcpv6-client ftp http ssh
以上方式只适用于少服务的多个添加,较为麻烦。如果服务添加的个数较多,可以使用{}
用逗号进行分隔:
[root@localhost ~]# firewall-cmd --list-services --zone=work
dhcpv6-client ssh
[root@localhost ~]# firewall-cmd --add-service={ftp,http} --zone=work
success
[root@localhost ~]# firewall-cmd --list-services --zone=work
dhcpv6-client ftp http ssh
以上操作运行时配置会立即生效,但是此方式是临时生效,重启firewalld服务后即失效。可以在firiewall-cmd
的命令后面添加--permanent
选项(此选项标识设置成永久生效),将之前的配置都转化成永久配置,重新加载防火墙规则时才会生效。
firewall-cmd --add-service={ftp,http} --zone=work -permanent
###重启防火墙
firewall-cmd --reload 或 systemctl restart firewalld
若不带有-permanent
选项,表示用于设置运行时规则,但是这些规则在系统或firewalld服务重启、停止时配置将失效。所以可以将当前的运行时配置写入规则配置文件中,使之成为永久性配置。
firewall-cmd --add-service={ftp,http} --zone=work --runtime-to-permanent
1.4 端口管理
###显示指定区域内允许访问的所有端口号
[root@localhost ~]# firewall-cmd --list-ports --zone=home
###为指定区域设置允许访问的tcp协议的80端口
[root@localhost ~]# firewall-cmd --add-port=80/tcp --zone=home
success
###显示指定区域内允许访问的所有端口号
[root@localhost ~]# firewall-cmd --list-ports --zone=home
80/tcp
### 删除指定区域已设置的允许访问的端口号(包括协议名)
[root@localhost ~]# firewall-cmd --remove-port=80/tcp --zone=home
success
###显示指定区域内允许访问的所有端口号
[root@localhost ~]# firewall-cmd --list-ports --zone=home
1.5 协议管理
###显示所有 ICMP 类型
[root@localhost ~]# firewall-cmd --get-icmptypes
address-unreachable bad-header communication-prohibited destination-unreachable echo-reply echo-request fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
###为指定区域设置拒绝访问的某项 ICMP 类型
[root@localhost ~]# firewall-cmd --add-icmp-block=echo-request
success
###显示指定区域内拒绝访问的所有 ICMP 类型
[root@localhost ~]# firewall-cmd --list-icmp-blocks
echo-request
###为指定区域设置拒绝访问的某项 ICMP 类型
[root@localhost ~]# firewall-cmd --add-icmp-block=destination-unreachable
success
###显示指定区域内拒绝访问的所有 ICMP 类型
[root@localhost ~]# firewall-cmd --list-icmp-blocks
echo-request destination-unreachable
删除指定区域已设置的拒绝访问的某项ICMP类型
[root@localhost ~]# firewall-cmd --remove-icmp-block=destination-unreachable
success
###显示指定区域内拒绝访问的所有 ICMP 类型
[root@localhost ~]# firewall-cmd --list-icmp-blocks
echo-request
ICMP类型协议默认放通所有,拒绝个别。
1.6 设置地址转换
设置SNAT
[root@localhost ~]# firewall-cmd --zone=public --direct --passthrough ipv4 -t nat -A POSTROUTING -s 192.168.145.0/24 -j SNAT --to-source 12.0.0.1
success
[root@localhost ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.145.0/24 0.0.0.0/0 to:12.0.0.1
设置 DNAT
[root@localhost ~]# firewall-cmd --zone=public --direct --passthrough ipv4 -t nat -A PREROUTING -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.145.15
success
[root@localhost ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 12.0.0.1 tcp dpt:80 to:192.168.145.15
2.使用firewall-config图形工具
firewall-config图形化配置工具支持防火墙所有的特性,系统管理员可以通过它来改变系统或用户策略。通过firewall-config图形化配置工具,可以实现配置防火墙允许通过的服务、端口、伪装、端口转发、ICMP 过滤器等功能。
方式1:
[root@localhost ~]# firewall-config
方式2:
在CnetOS7系统中单击"应用程序-->杂项-->防火墙"打开
在图形化界面可以根据需要选择服务类型,如果想要配置永久设置可以选择上方的配置项进行更改。
3.编写/etc/firewalld/中的配置文件
[root@localhost ~]# cd /etc/firewalld/
[root@localhost firewalld]# ls
firewalld.conf icmptypes lockdown-whitelist.xml zones
helpers ipsets services
[root@localhost firewalld]# cd zones/
[root@localhost zones]# ls
public.xml public.xml.old
[root@localhost zones]# vim 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="ssh"/>
<service name="dhcpv6-client"/>
</zone>
此方式较为麻烦,不建议使用。