Firewalld概述
firewalld防火墙是Centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙
firewalld和iptables都是用来管理防火墙的工具(属于用户态)来定义防火墙的各种规则功能,内部结构都指向netfilter网络过滤子系统(属于内核态)来实现包过滤防火墙功能。
firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。它支持IPV4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算) ,并且拥有两种配置模式:运行时配置与永久配置
Firewalld与iptables的区别
iptables主要是基于接口,来设置规则,从而判断网络的安全性。
firewalld是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全。与硬件防火墙的设置相类似。
iptables在 /etc/sysconfig/iptables 中储存配置
firewalld将配置储存在 /etc/firewalld/ (优先加载) 和 /usr/lib/firewalld/ (默认的配置文件) 中的各种XML文件里。
使用iptables每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则。
使用firewalld却不会再创建任何新的规则,仅仅运行规则中的不同之处。因此firewalld可以在运行时间内,改变设置而不丢失现行连接。
iptables防火墙类型为静态防火墙
firewalld防火墙类型为动态防火墙
Firewalld区域的概念
firewalld防火墙为了简化管理,将所有网络流量分为多个区域(zone) 。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。
Firewalld防火墙区域定义
trusted (信任区域) 允许所有的传入流量(一般用于内网之中)
public (公共区域) 允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
external (外部区域) 允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPV4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
home (家庭区域) 允许与ssh, ipp-client,mdns, samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝
internal (内部区域) 默认值时与home区域相同。
work (工作区域) 允许与ssh. ipp-client. dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
dmz (隔离区域也称为非军事区域) 允许与ssh预定义服务匹配的传入流量,其余均拒绝。
block (限制区域) 拒绝所有传入流量
drop (丢弃区域) 丢弃所有传入流量,并且不产生包含ICMP的错误响应。
默认情况下,public区域是默认区域,包含所有接口(网卡)。
Firewalld防火墙的配置方法
使用firewall-cmd命令行工具。(常用)
使用firewall-config图形工具。
编写/etc/firewalld/中的配置文件。
常用命令
--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> :为指定的区域删除绑定的网络接口
--get-zone-of-source=<source> [/<mask>] :显示指定源地址绑定的区域
--zone=<zone> -add-source=<source> [/<mask>] :为指定源地址绑定区域
--zone=<zone> -change-source=<source> [/<mask>] :为指定的区域更改绑定的源地址
--zone=<zone> -remove-source=<source> [/<mask>] :为指定的区域删除绑定的源地址
--list-all-zones :显示所有区域及其规则
[--zone=<zone>] --list-al1 :显示所有指定区域的所有规则,省略--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)显示当前系统中的默认区域
firewall-cmd --get-default-zone
(2)显示默认区域的所有规则
firewall-cmd --list-all
(3)显示当前正在使用的区域及其对应的网卡接口
firewall-cmd --get-active-zones
(4)设置默认区域
firewall-cmd --set-default-zone=home
firewall-cmd --get-default-zone
服务管理
(1)查看默认区域内允许访问的所有服务
firewall-cmd --list-service
(2)添加httpd 服务到public 区域
firewall-cmd --add-service=http --zone=public
(3)查看public区域已配置规则
firewall-cmd --list-all --zone=public
(4)删除public区域的httpd服务
firewall-cmd --remove-service=http --zone=public
(5)同时添加httpd、https服务到默认区域,设置成永久生效
firewall-cmd --add-service=http --add-service=https --permanent
firewall-cmd --reload
firewall-cmd --list-al1
#添加使用--permanent选项表示设置成永久生效,需要重新启动firewalld服务或执行firewall-cmd --reload命令
重新加载防火墙规则时才会生效。若不带有此选项,表示用于设置运行时规则,但是这些规则在系统或firewalld服务重启、停止时配置将失效。
--runtime-to-permanent :将当前的运行时配置写入规则配置文件中,使之成为永久性配置。
端口管理
(1)允许TCP的443端口到internal区域
firewall-cmd --zone=internal --add-port=443/tcp
firewall-cmd --list-all --zone=internal
(2)从internal区域将TCP的443端口移除
firewall-cmd --zone=internal --remove-port=443/tcp
(3)允许UDP的2048-2050端口到默认区域
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all
开启ip伪装
使用firewall-cmd 开启
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --zone=public --query-masquerade --permanent
修改/proc/sys/net/ipv4/ip_forward文件,将其中的0改为1,其中0:不开启ip伪装,1:开启ip伪装
# 查看ip伪装状态
[root@halo holo]# cat /proc/sys/net/ipv4/ip_forward
1
端口转发配置
可以是本机或其他主机
当转发时不指定ip时,则默认为转发目的ip为本机ip
当转发时指定了ip,却没有指定端口,则默认使用来源端口
将本机端口8080的流量,转发至本机端口8088
[root@centos7 ~]# firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=8088
success
将本机端口8080的流量,转发至指定ip192.168.22.55,同时继续使用端口8080
[root@centos7 ~]# firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toaddr=192.168.22.55
success
将本机端口8080的流量,转发至指定ip192.168.22.55,同时,指定端口8088
[root@centos7 ~]# firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=8088:toaddr=192.168.22.55
success
使用firewall-cmd命令,查询、或移除指定区域(zone)中的端口转发配置。
[root@y460a ~]# firewall-cmd --zone=public --list-forward-ports
port=8080:proto=tcp:toport=8088:toaddr=192.168.22.55
[root@y460a ~]# firewall-cmd --zone=public --remove-forward-port=port=8080:proto=tcp:toport=8088:toaddr=192.168.22.55
success
编辑模版的方式配置端口转发
使用
vim
编辑/etc/firewalld/zones/public.xml
文件复制默认的 firewalld 服务模板并进行编辑:
sudo cp /usr/lib/firewalld/services/template.xml /etc/firewalld/services/my-port-forward.xml
sudo vi /etc/firewalld/services/my-port-forward.xml
在编辑器中,将模板中的
<short>
、<description>
和<port>
标签修改为适当的值。例如,将<short>
修改为 "My Port Forward",将<description>
修改为 "Port forwarding for my application",将<port>
修改为要转发的端口号。
<?xml version="1.0" encoding="utf-8"?>
<service>
# 将本地应用服务转发到8080
<short>My Port Forward</short>
<description>Port forwarding for my application</description>
<port protocol="tcp" port="8080"/>
</service>
将本地的
8080
端口转发目标端口1234
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>My Port Forward</short>
<description>Port forwarding for my application</description>
<port protocol="tcp" port="8080"/>
<forward-port port="1234" protocol="tcp"/>
</service>
端口转发的作用
当需要把某个端口隐藏起来时,就可以在防火墙上阻止那个端口访问,然后,再开一个其他的端口,之后,配置防火墙的端口转发,将流量转发到其他端口
端口转发可以做流量分发,当一个防火墙管理多台运行着不同服务的服务器时,可以使用防火墙将不同端口的流量转发至不同服务器。
配置好端口转发后出现无法转发时,请检查以下两个问题
首先,检查是否已经开启允许伪装ip,没允许的话,请先
开启伪装ip
也可以叫启网络地址转换(NAT)
# 确认 firewalld 服务正在运行
sudo systemctl status firewalld
# 开启firewalld 服务
sudo systemctl start firewalld
# 检查默认区域是否为 public
sudo firewall-cmd --get-default-zone
# 检查默认区域是否为 public 不是请修改为 public
sudo firewall-cmd --set-default-zone=public
# 开启网络地址转换(NAT)
sudo firewall-cmd --zone=public --add-masquerade --permanent
# 重新加载防火墙
sudo firewall-cmd --reload
比如,将80端口转发至8080端口,请检查本地的80端口和目标的8080端口是否开放监听了,使用
netstat
命令来查看端口监听情况。
sudo netstat -tlnp | grep :80
sudo netstat -tlnp | grep :8080
Firewall使用前准备
检查Linux服务是否安装的有firewalld
服务
Linux7已默认使用
firewalld
防火墙,其管理工具是firewall-cmd
RHEL7中有这几种防火墙共存:
firewalld
、iptables
、ip6tables
、ebtables
RHEL7的内核版本是3.10,在此版本的内核里防火墙的包过滤机制是
firewalld
,使用firewalld
来管理netfilter
,不过底层调用的命令仍然是iptables
# 查firewalld软件包是否安装
[root@halo /]# rpm -q firewalld
firewalld-0.6.3-13.el7_9.noarch
防火墙使用前检查
由于这几种防火墙的
daemon
是冲突的,所以建议禁用
# 禁用方法一:
[root@CentOS7 ~]# systemctl mask {iptables,ip6tables,ebtables}
# 禁用方法二:
[root@CentOS7 ~]# for service in iptables ip6tables ebtables;do
> systemctl mask ${service}.service
> done
查询以上集中防火墙状态firewall
,iptables
,ip6tables
,ebtables
[root@halo /]# systemctl status {firewall,iptables,ip6tables,ebtables}
Unit firewall.service could not be found.
Unit iptables.service could not be found.
Unit ip6tables.service could not be found.
● ebtables.service - Ethernet Bridge Filtering tables
Loaded: loaded (/usr/lib/systemd/system/ebtables.service; disabled; vendor preset: disabled)
Active: inactive (dead)
一般来说firewalld.service 防火墙是正常开启的,使用
systemclt status firewalld.service
来查看状态。在配置应用服务器的时候一般先关闭防火墙,要不然会导致端口不通过,在生产设备上面需要开启相应的端口。
[root@halo ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2023-07-20 10:36:50 CST; 5 days ago
Docs: man:firewalld(1)
Main PID: 18165 (firewalld)
Tasks: 2
Memory: 29.3M
CGroup: /system.slice/firewalld.service
└─18165 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t nat -D OUTPUT' failed: iptables: Bad rule (do...chain?).
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER' failed: iptables: Too many links.
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION-STAGE-1' failed: i...y links.
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -F DOCKER-ISOLATION' failed: iptables:...at name.
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -t filter -X DOCKER-ISOLATION' failed: iptables:...at name.
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-3a66c13d8eb6 -o br-3a66c13d8eb6...chain?).
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-4496cc55cd92 -o br-4496cc55cd92...chain?).
Jul 20 11:32:18 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed...chain?).
Jul 20 11:32:19 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed...chain?).
Jul 20 11:32:35 halo firewalld[18165]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w10 -D FORWARD -i br-b662461849c2 -o br-b662461849c2...chain?).
Hint: Some lines were ellipsized, use -l to show in full.
防火墙关闭命令
#停止防火墙
sudo systemctl stop firewalld
#禁止防火墙开机启动
sudo systemctl disable firewalld
开启防火墙Docker无法访问
云服务开启防火墙Docker无法访问
参考文档