简介
防火墙是只设置在不同网络与网络安全与之间的一系列部件的场合,也是不同安全与之间信息的唯一出口。通过监测、限制并更改跨越防火墙的数据流,尽可能的对外屏蔽网络内部的信息、结构和运行状态,且有选择地接受外部网络访问。在内外网之间架起一道屏障,以避免发生不可预知或潜在的入侵。从传统意义上来说防火墙技术分为三类:包过滤(Packet Filtering)、应用代理(Application Proxy)、状态检测(Stateful Inspection)。
Linux的防火墙体系主要工作网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和高效率,也因此获得广泛的应用。在CentOS7系统中几种防火墙共存:firewalld、iptables、ebtables,默认是用firewalld来管理netfilter子系统。
netfilter:指的是Linux内核中实现包过滤防火墙的内部结构,不以程序或文件的形式存在,属于“内核态”(Kernel Space,又称为内核空间)的防火墙的功能体系。
firewalld:指用于管理Linux防火墙的命令程序,属于“用户态”(User Space,又称为用户空间)的防火墙管理体系。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BTEoqU2-1594968968969)(img/7.15.png)]
firewalld的作用是为包括过滤机制提供匹配规则(或称为策略),通过各种不同的规则,告诉netfilter对来自指定源,前往指定目的或具有某些协议特征的数据包采取何种处理方式。为了更方便地组织和管理防火墙,firewalld提供了支持网络区域链接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥,并拥有两种配置模式:运行时配置与永久配置。它还支持服务或应用程序直接添加防火墙规则接口。
Firewalld与iptables对比
- | firewalld | iptables |
---|---|---|
配置文件 | /usr/lib/firewall/ | |
/etc/firewalld/ | /etc/sysconfig/iptables | |
对规则的修改 | 不需要全部刷新策略,不丢失现在连接 | 需要全部刷新策略,丢失连接 |
防火墙类型 | 动态防火墙 | 静态防火墙 |
firewalld 是 iptables 的前端控制器
iptables 静态防火墙 任一策略变更需要reload所有策略,丢失现有链接
firewalld 动态防火墙 任一策略变更不需要reload所有策略 将变更部分保存到iptables,不丢失现有链接
firewalld 提供一个daemon和service 底层使用iptables
基于内核的Netfilter
firewalld跟iptables比起来至少有两大好处:
1)irewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
2)firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
firewalld 网络区域
firewalld网络区域
firewalld将所有的网络数据流量划分为多个区域,从而简化防火墙的管理。根据数据包的源IP地址或传入网络接口等条件,将数据流量传入相应的区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址。
(1)若源地址关联到特定的区域,则执行该区域所制定的规则。
(2)若源地址未关联特定的区域,则使用传入网络接口的区域并执行该区域所制定的规则。
(3)若网络接口未关联到特定的区域,则使用默认区域执行该区域所制定的规则
firewalld 的预定义区域说明
区域名称 | 默认配置说明 |
---|---|
阻塞区域(block) | 任何传入的网络数据包都将被阻止。 |
工作区域(work) | 相信网络上的其他计算机,不会损害你的计算机。 |
家庭区域(home) | 相信网络上的其他计算机,不会损害你的计算机。 |
公共区域(public) | 不相信网络上的任何计算机,只有选择接受传入的网络连接。 |
隔离区域(DMZ) | |
隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。 | |
信任区域(trusted) | 所有的网络连接都可以接受。 |
丢弃区域(drop) | 任何传入的网络连接都被拒绝。 |
内部区域(internal) | 信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。 |
外部区域(external) | 不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。 |
- 注:FirewallD的默认区域是public。
在流量经过防火墙时,firewalld防火墙会对传入的每个数据包进行检查,如果此数据包的源地址关联到特定的区域,则会应用该区域的规则对此数据包进行处理,如果该源地址没有关联到任何区域,则将使用传入网络接口所在的区域规则进行处理。如果流量与不允许的端口 、协议或者服务匹配,则防火墙拒绝传入流量。
firewalld防火墙的配置方法
- 运行时配置
实时生效,并持续至Firewalld重新启动或重新加载配置
不中断现有连接
不能修改服务配置 - 永久配置
不立即生效,除非Firewalld重新启动或重新加载配置
中断现有连接
可以修改服务配置
配置firewalld的三种方式:
① firewall-config图形工具
② firewall-cmd命令行工具
③ /etc/firewalld/中的配置文件
- Firewalld会优先使用/etc/firewalld/ 中的配置,如果不存在配置文件,则使用/etc/firewalld/ 中的配置
- /etc/firewalld/ :用户自定义配置文件,需要时可通过从/usr/lib/firewalld/中拷贝
- /usr/lib/firewalld/:默认配置文件,不建议修改,若恢复至默认配置,可直接删除/etc/firewalld/ 中的配置
- 不建议直接编辑配置文件,建议使用命令行工具。
防火墙进程操作
[root@ns1 ~]# systemctl 选项 firewalld
- 选项:start 、stop 、restart 、status
防火墙管理操作
- firewall-cmd命令
支持全部防火墙特性
对于状态和查询模式,命令只返回状态,没有其他输出。
–permanent 参数:携带该参数表示永久配置,否则表示运行时配置。
[–zone=] 选项:不携带此选项表示针对默认区域操作,否则针对指定区域操作。
常用 firewall-cmd 命令
firewall-cmd 命令 | 说明 |
---|---|
–get-default-zone | 查看当前默认区域 |
–get-active-zones | 列出当前正在使用的区域及其所对应的网卡接口 |
–get-zones | 列出所有可用的区域 |
–set-default-zone= | 设置默认区域(注意此命令会同时修改运行时配置和永久配置) |
–add-source=[–zone=] | 将来自IP地址或网段的所有流量路由到指定区域,没有指定区域时使用默认区域 |
–remove-source=[–zone] | 从指定区域中删除来自IP地址或网段的所有路由流量规则。没有指定区域时使用默认区域 |
–add-interface=[–zone] | 将来自该接口的所有流量都路由到指定区域。没有指定区域时使用默认区域 |
–change-interface=[–zone] | 将接口与指定区域做关联,没有指定区域时使用默认区域 |
–list-all [–zone=] | 列出指定区域已配置接口、源、服务、端口等信息,没有指定区域时使用默认区域 |
–add-service=[–zone] | 允许到该服务的流量通过指定区域,没有指定区域时使用默认区域 |
–remove-service=[–zone] | 从指定区域的允许列表中删除该服务,没有指定区域时使用默认区域 |
–add-port=<PORT/PROTOCOL>[–zone=] | 允许到该端口的流量通过指定区域,没有指定区域时使用默认区域 |
–remove-port=<PORT/PROTOCOL>[–zone] | 从指定区域的允许列表中删除该端口,没有指定区域时使用默认区域 |
防火墙状态查询命令
[root@ns1 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@ns1 ~]# firewall-cmd --state
not running
重新加载 Firewalld的配置
- firewall-cmd --reload
[root@ns1 ~]# firewall-cmd --reload
success
- firewall-cmd --complete-reload
状态信息将会丢失,多用于处理防火墙出现问题时
[root@ns1 ~]# firewall-cmd --complete-reload
success
- systemctl restart firewalld
[root@ns1 ~]# systemctl restart firewalld
查询预定义信息
[root@ns1 ~]# firewall-cmd --get-zones //查看预定义的区域
block dmz drop external home internal public trusted work
[root@ns1 ~]# firewall-cmd --get-services //查看预定义的服务
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nfs3 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
[root@ns1 ~]# firewall-cmd --get-icmptypes //查看预定义的ICMP 类型
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
firewalld 区域操作命令
- 显示网络连接或接口的默认区域
[root@ns1 ~]# firewall-cmd --get-default-zone
public
- 设置网络连接或接口的默认区域为internal
[root@ns1 ~]# firewall-cmd --set-default-zone=internal
success
- 显示已激活的所有区域
[root@ns1 ~]# firewall-cmd --get-active-zones
internal
interface:ens33
- 显示ens33接口绑定的区域
[root@ns1 ~]# firewall-cmd --get-zone-of-interface=ens33
internal
- 为ens33接口绑定work区域
[root@ns1 ~]# firewall-cmd --zone=work --add-interface=ens33
success
- 为work区域更改绑定的网络接口ens33
[root@ns1 ~]# firewall-cmd --zone=work --change-interface=ens33
success
- 为work区域删除绑定的网络接口ens33
[root@ns1 ~]# firewall-cmd --zone=work --remove-interface=ens33
success
- 查询work区域中是否包含ens33
[root@ns1 ~]# firewall-cmd --zone=work --query-interface=ens33
no
- 显示所有区域及其规则
[root@ns1 ~]# firewall-cmd --list-all-zones
- 显示internal区域的所有规则
[root@ns1 ~]# firewall-cmd --zone=internal --list-all
- 显示默认区域的所有规则
[root@ns1 ~]# firewall-cmd --list-all
小结:
选项 | 说明 |
---|---|
–zone= --add-interface= | 为指定接口绑定区域 |
–zone= --change-interface= | 为指定的区域更改绑定的网络接口 |
–zone= --remove-interface= | 为指定的区域删除绑定的网络接口 |
–query-interface= | 查询区域中是否包含某接口 |
[–zone=] --list-all | 显示所有指定区域的所有规则 |
–get-default-zone | 显示网络连接或接口的默认区域 |
–set-default-zone= | 设置网络连接或接口的默认区域 |
–get-active-zones | 显示已激活的所有区域 |
–get-zone-of-interface= | 显示指定接口绑定的区域 |
- 显示 internal区域内允许访问的所有服务
[root@ns1 ~]# firewall-cmd --zone=internal --list-service
ssh mdns samba-client dhcpv6-client
- 为 public区域设置允许访问SMTP服务
[root@ns1 ~]# firewall-cmd --zone=public --add-service=smtp
success
- 删除 internal区域中的SSH服务
[root@ns1 ~]# firewall-cmd --zone=internal --remove-service=ssh
success
- 查询 internal区域中是否启用了SSH服务
[root@ns1 ~]# firewall-cmd --zone=internal --query-service=ssh
no
小结:
选项 | 说明 |
---|---|
[–zone=] --list-service | 显示指定区域内允许访问的所有服务 |
[–zone=] --add-service= | 为指定区域设置允许访问的某些服务 |
[–zone=] --remove-service= | 删除指定区域以设置的允许访问的某项服务 |
[–zone=] --query-service= | 查询指定区域中是否启用了某项服务 |
firewalld端口操作命令
- 显示 internal区域内允许访问的所有端口号
[root@ns1 ~]# firewall-cmd --zone=internal --list-ports
- 启用 internal区域22端口的TCP协议组合
[root@ns1 ~]# firewall-cmd --zone=internal --add-port=22/tcp --timeout=5m
success
- 禁用 internal区域22端口的TCP协议组合
[root@ns1 ~]# firewall-cmd --zone=internal --remove-port=22/tcp
success
- 查询 internal区域中是否启用了22端口和TCP协议组合
[root@ns1 ~]# firewall-cmd --zone=internal --query-port=22/tcp
no
小结:
选项 | 说明 |
---|---|
[–zone=] --list-ports | 显示指定区域内允许访问的所有端口号 |
[–zone=] --add-port=[-]/ [–timeout=] | 启用区域端口和协议组合,可选配置超时时间 |
[–zone=] --remove-port=[-]/ | 禁用区域端口和协议组合 |
[–zone=] --query-port=[-]/ | 查询区域中是否启用了端口和协议组合 |
firewalld阻塞ICMP操作命令
- 显示 work区域内阻塞的所有ICMP类型
[root@ns1 ~]# firewall-cmd --zone=work --list-icmp-blocks
- 为 work区域设置阻塞 echo-reply类型的ICMP
[root@ns1 ~]# firewall-cmd --zone=work --add-icmp-block=echo-reply
success
- 删除 work区域已阻塞的 echo-reply类型的ICMP
[root@ns1 ~]# firewall-cmd --zone=work --remove-icmp-block=echo-reply
success
- 查询 work区域的 echo-request类型的ICMP是否阻塞
[root@ns1 ~]# firewall-cmd --zone=work --query-icmp-block=echo-request
no
小结:
选项 | 说明 |
---|---|
[–zone=] --list-icmp-blocks | 显示指定区域内阻塞的所有ICMP类型 |
[–zone=] --add-icmp-block= | 为指定区域设置阻塞的某项ICMP类型 |
[–zone=] --remove-icmp-block= | 删除指定区域已阻塞的某项ICMP类型 |
[–zone=] --query-icmp-block= | 查询指定区域的 ICMP阻塞功能 |
Firewalld 防火墙案例
### 实验:通过防火墙接口设置,来实现 ssh的访问控制
<1>在防火墙策略中去掉 ssh服务
```bash
[root@ns1 ~]# firewall-cmd --list-all //显示所有指定区域的所有规则
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@ns1 ~]# firewall-cmd --permanent --remove-service=ssh
success
[root@ns1 ~]# firewall-cmd --reload //不中断连接,重启防火墙
success
[root@ns1 ~]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
连接失败
[root@ns2 ~]# ssh 192.168.160.7
ssh: connect to host 192.168.160.7 port 22: No route to host
[root@ns2 ~]#
<2>添加防火墙策略
[root@ns1 ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 192.168.160.5 -j ACCEPT //允许192.168.160.7 主机通过22端口(ssh默认端口)访问。
success
[root@ns1 ~]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
连接成功
[root@ns2 ~]# ssh 192.168.160.7
The authenticity of host '192.168.160.7 (192.168.160.7)' can't be established.
ECDSA key fingerprint is SHA256:f2HoWJm2jEjRBvDbJpQzKOuirt2QYkVIiQg9YO/GZtk.
ECDSA key fingerprint is MD5:aa:26:f1:79:40:2e:66:dd:3c:d1:34:f3:1c:43:44:2d.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '192.168.160.7' (ECDSA) to the list of known hosts.
root@192.168.160.7's password:
Last login: Fri Jul 10 22:04:20 2020 from 192.168.160.1
[root@ns1 ~]#
案例二
需求描述
- 禁止主机ping服务器
- 只允许 192.168.8.130主机访问Apache服务
- 只允许 192.168.8.150主机访问TCP/22端口
1.绑定区域
[root@ns1 ~]# firewall-cmd --get-active-zone //默认下激活的区域
[root@ns1 ~]# firewall-cmd --permanent --zone=work --add-source=192.168.8.130
success //将来源地址192.168..8.130和work区域关联
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --add-source=192.168.8.150
success //将来源地址192.168.8.150和internel区域关联
[root@ns1 ~]# firewall-cmd --reload //重新加载
success
[root@ns1 ~]# firewall-cmd --get-active-zone
work
sources: 192.168.8.130
internal
sources: 192.168.8.150
配置服务
- Work区域配置
[root@ns1 ~]# firewall-cmd --zone=work --list-services
ssh dhcpv6-client
[root@ns1 ~]# firewall-cmd --permanent --zone=work --remove-service=ssh
success
[root@ns1 ~]# firewall-cmd --permanent --zone=work --remove-service=dhcpv6-client
success
[root@ns1 ~]# firewall-cmd --permanent --zone=work --add-service=http
success
[root@ns1 ~]# firewall-cmd --permanent --zone=work --list-services
http
- internal区域配置
[root@ns1 ~]# firewall-cmd --zone=internal --list-services
ssh mdns samba-client dhcpv6-client
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --remove-service=ssh
success
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --remove-service=dhcpv6-client
success
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --remove-service=samba-client
success
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --remove-service=mdns
success
[root@ns1 ~]# firewall-cmd --zone=internal --list-services
- public区域配置
[root@ns1 ~]# firewall-cmd --permanent --zone=public --list-services
dhcpv6-client ssh
[root@ns1 ~]# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
success
[root@ns1 ~]# firewall-cmd --permanent --zone=public --remove-service=ssh
success
[root@ns1 ~]# firewall-cmd --permanent --zone=public --list-services
- 配置端口
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --list-ports
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --add-port=22/tcp
success
[root@ns1 ~]# firewall-cmd --permanent --zone=internal --list-ports
22/tcp
- 配置ICMP阻塞
[root@ns1 ~]# firewall-cmd --permanent --zone=public --list-icmp-blocks
[root@ns1 ~]# firewall-cmd --permanent --zone=public --add-icmp-block=echo-request
success
[root@ns1 ~]# firewall-cmd --permanent --zone=public --list-icmp-blocks
echo-request
[root@ns1 ~]# firewall-cmd --reload //重新加载配置
success
- 验证即可。
总结
- firewalld 防火墙是一款功能强大的包过滤防火墙,可同时支持IPv4和IPv6地址。
- firewalld 防火墙拥有 运行时(runtime)和永久(permanent)配置两种状态。拥有区域的概念,支持直接添加服务或者端口。
- firewalld 防火墙既可以通过字符管理工具 firewall-cmd 管理,又可以通过图形管理工具 firewall-config 进行管理。