[Linux防火墙]一文学会防火墙概念及常用命令

📕作者:喜欢水星记


防火墙的基本概念

防火墙(Firewall)是一个架设在互联网与企业内网之间的信息安全系统,根据企业预定的策略来监控往来的传输。

防火墙可能是一台专属的网络设备或是运行于主机上来检查各个网络接口上的网络传输。它是目前最重要的一种网络防护设备,从专业角度来说,防火墙是位于两个(或多个)网络间,实行网络间访问或控制的一组组件集合之硬件或软件。

功能:防火墙最基本的功能就是隔离网络,通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同信任程度区域间传送的数据流。

firewalld和iptables

需要注意的是:

iptables和firewalld都不是防火墙,他们都只是管理防火墙的工具、服务而已

firewalld :

FirewallD 是由红帽发起的提供了支持网络/防火墙 区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4、IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。firewalld 防火墙是 Centos7 系统默认的防火墙管理工具,取代了之前的iptables 防火墙,也是工作在网络层,属于包过滤防火墙。

iptables:

netfilter/iptables(简称为 iptables)组成 Linux 平台下的包过滤防火墙,与大多数的 Linux 软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。

firewalld的区域概念

相较于传统的iptables防火墙,firewalld支持动态更新,并加入了区域zone的概念。

简单来说,区域就类似于阿里云的安全组,firewalld预先准备了几套防火墙策略集合(策略模板)。用户可以根据自己的使用场景来选择所需要的区域,从而实现防火墙策略之间的快速切换。

需要注意的是

一个网卡仅能绑定一个区域,eth0–> A区域

但一个区域可以绑定多个网卡 A区域—>eth0 ,eth1 , eth2

firewalld预先拟定了九个区域

区域名

默认规则策略

trusted

允许所有的数据包流入流出

home

适用于家庭场景,拒绝流入的流量(除非与流出流量有关);允许ssh、mdns、ipp-client、samba-client、dhcpv6-client服务的流量

internal

适用于内部网络,与home区域一样

work

适用于工作区域,拒绝流入的流量(除非与流出流量有关);允许ssh、ipp-client、dhcpv6-client服务的流量

public

适用于公共区域,允许ssh和dhcpv6-client服务的流量,是firewall默认区域

external

拒绝流入的流量(除非与流出流量有关),仅允许ssh服务的流量

dmz

拒绝流入的流量(除非与流出流量有关),仅允许ssh服务的流量

block

拒绝流入的流量(除非与流出流量有关)

drop

拒绝流入的流量(除非与流出流量有关),没有任何回复

查看firewalld默认分区命令

firewall-cmd --get-default-zone

[root@localhost ~]# firewall-cmd --get-default-zone
public
# 可以看到默认一台新的Centos7虚拟机的firewall区域是 public

设置firewalld默认区域为home

firewall-cmd --set-default-zone=home

[root@localhost ~]# firewall-cmd --set-default-zone=home
success			# success 表示设置成功
[root@localhost ~]# firewall-cmd --get-default-zone
home
# 再次查看,已经把默认区域修改为home

查看当前firewall区域对应连接的网卡接口

firewall-cmd --get-active-zones

[root@localhost ~]# firewall-cmd --get-active-zones
home
  interfaces: ens33
# 可以看到 ens33就是我系统默认的网卡名

给一个新的接口添加区域

firewall-cmd --zone=home --add-interface=ens35

[root@localhost ~]# firewall-cmd --zone=home --add-interface=ens35
success
[root@localhost ~]# firewall-cmd --get-default-zone
home
[root@localhost ~]# firewall-cmd --get-active-zones
home
  interfaces: ens33 ens37 ens35
# 可以看到,现在查看活动的区域网卡接口,就多了刚刚添加的

列出所有的区域及规则

firewall-cmd --list-all-zones

[root@localhost ~]# firewall-cmd --list-all-zones

`````````````````````由于篇幅,其他区域我这里没有写上来,省略了`````````````
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37 ens35			# 可以看到这里home区域 有添加的网卡接口信息
  sources:
  services: ssh mdns samba-client dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


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:

也可以查看指定的网络接口的相关策略信息

firewall-cmd --list-all --zone=区域名

[root@localhost ~]# firewall-cmd --list-all --zone=home
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens37 ens35
  sources:
  services: ssh mdns samba-client dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

firewall的服务管理

查看当前开启的服务

firewall-cmd --list-service

[root@localhost ~]# firewall-cmd --set-default-zone=public
success
[root@localhost ~]# firewall-cmd --list-service
ssh dhcpv6-client
[root@localhost ~]# firewall-cmd --set-default-zone=home
success
[root@localhost ~]# firewall-cmd --list-service
ssh mdns samba-client dhcpv6-client

# 这下更能直观的看到不同区域所支持的服务

添加服务到指定区域中

firewall-cmd --add-service=服务名 --zone=区域名

[root@localhost ~]# firewall-cmd --add-service=http --zone=home
success			# 将http服务添加到home区域策略中
[root@localhost ~]# firewall-cmd --list-service
ssh mdns samba-client dhcpv6-client http	# 查看服务发现http添加成功
[root@localhost ~]# firewall-cmd --add-service=http --zone=public
success		    # 将http服务添加到public区域策略中
[root@localhost ~]# firewall-cmd --list-service --zone=public
ssh dhcpv6-client http	 			# 查看服务发现http添加成功

删除指定区域的服务

firewall-cmd --remove-servic=服务名 --zone=区域名

[root@localhost ~]# firewall-cmd --remove-servic=http --zone=public
success				# 删除public区域中刚刚新增的http服务
[root@localhost ~]# firewall-cmd --list-service --zone=public
ssh dhcpv6-client		# 可以看到现在服务里面已经没有了http

设置永久生效

需要注意的是:

上述的添加或删除操作的命令都是临时有效,当防火墙重启之后,服务将会恢复默认配置

防火墙重启命令

firewall-cmd --reload 或者

systemctl restart firewalld

[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-service --zone=home
ssh mdns samba-client dhcpv6-client		# 可以看到 home区域http服务我没有做删除操作,重启之后自动恢复默认的状态

若要使其永久生效:

firewall-cmd --runtime-to-permanent (在执行了添加服务命令后使用)

[root@localhost ~]# firewall-cmd --add-service=http --zone=public
success							# 添加http服务到public区域
[root@localhost ~]# firewall-cmd --list-service --zone=public
ssh dhcpv6-client http			# 查看public区域的服务
[root@localhost ~]# firewall-cmd --runtime-to-permanent
success							# 将当前运行的配置规则写入配置文件中,使其永久生效
[root@localhost ~]# firewall-cmd --reload
success							# 重启firewall服务,验证设置的永久生效是否成功
[root@localhost ~]# firewall-cmd --list-service --zone=public
ssh dhcpv6-client http			# 再次查看public区域的服务,发现重启firewall服务之后,http服务依旧存在

firewall端口管理(常用)

很多时候我们在部署相关服务时,需要web浏览器访问,此时如果不停用防火墙,则无法正常访问,但是为了安全性,又不想把防火墙全部关闭掉,这个时候允许部分端口访问,就显得尤为重要。

添加端口到指定区域

firewall-cmd --zone=区域名 --add-port=端口号/协议名

[root@localhost ~]# firewall-cmd --get-default-zone
home						# 查看当前的默认区域
[root@localhost ~]# firewall-cmd --zone=home --add-port=443/tcp
success						# 将443端口添加到home区域中,端口后面必须跟协议名,不然会报错
[root@localhost ~]# firewall-cmd --zone=home --add-port=6600/tcp
success						# 将6600端口添加到home区域中
[root@localhost ~]# firewall-cmd --list-port --zone=home
443/tcp 6600/tcp			# 查看home区域的端口

[root@localhost ~]# firewall-cmd --zone=public --add-port=3000-3010/udp
success						# 如果添加多个端口到一个区域中,也可以用 '-'表示范围
[root@localhost ~]# firewall-cmd --list-port --zone=public
3000-3010/udp				# 查看public区域 刚刚开放的端口

注意如果命令中不加 --zone=区域名的话, 那么都是在默认区域中进行操作

防火墙内部网络安全区域划分拓扑图 防火墙区域概念_防火墙内部网络安全区域划分拓扑图

设置添加端口永久生效

需要添加 ‘–permanent’ 选项

防火墙内部网络安全区域划分拓扑图 防火墙区域概念_网络_02

移除端口

firewall-cmd --zone=区域名 --remove-port=需要移除的端口号/协议名

[root@localhost ~]# firewall-cmd --zone=public --remove-port=3000-3010/udp
success						# 移除刚刚添加到public区域中的 3000-3010端口,同样端口号后要跟服务名
[root@localhost ~]# firewall-cmd --list-port --zone=public

							#此时查看 public区域下的3000-3010端口已不存在

firewall常用命令汇总

# 1.启动关闭类命令
systemctl status firewalld					# 查看firewall运行状态
systemctl start firewalld					# 开启firewalld服务
systemctl restart firewalld					# 重启firewalld服务
systemctl stop firewalld					# 停止firewalld服务
firewall-cmd --reload						# 重启firewall



# 2.区域类命令
firewall-cmd --get-default-zone				# 显示当前的默认区域
firewall-cmd --set-default-zone=<zone>		# 修改默认区域
firewall-cmd --get-active-zones				# 显示当前正在使用的区域及其对应的网卡接口
firewall-cmd --get-zones					# 显示所有可用的区域
firewall-cmd --zone=<zone>  --add-interface=<interface> 	
											# 为指定接口绑定区域
firewall-cmd --zone=<zone>  --remove-interface=<interface>   
											# 为指定的区域移除绑定的网络接口
											
firewall-cmd --list-all-zones				# 显示所有区域及其策略



# 3.服务类命令
firewall-cmd --list-service					# 查看默认区域内允许访问的所有服务
firewall-cmd --add-service=<服务名> --zone=<指定区域>
											# 添加对应的服务到指定的区域中
firewall-cmd --add-service=http --zone=public
											# 添加httpd 服务到public 区域
firewall-cmd --remove-service=<服务名> --zone=<指定区域>
											# 移除指定区域的相关服务
firewall-cmd --add-service=<服务名> --zone=<指定区域> --permanent																					# 添加对应的服务到指定的区域中,使其永久生效



# 4.端口类命令
firewall-cmd --zone=<区域名> --add-port=<端口名>/<协议名>
											# 添加端口到指定区域中,后面必须跟协议名
firewall-cmd --zone=home --add-port=443/tcp
											# 添加TCP协议的443端口到home区域中
firewall-cmd --zone=home --add-port=443/tcp --permanent
											# 永久添加TCP协议的443端口到home区域中
firewall-cmd --list-port --zone=<端口名>	  # 查看指定区域开放的端口
firewall-cmd --zone=<区域名> --remove-port=<端口名>/<协议名>
											# 移除指定区域的端口
firewall-cmd --zone=home --remove-port=443/tcp
											# 将home区域将TCP的443端口移除