firewall 防火墙
firewalld服务拥有基于CLI和基于GUI的两种工作方式,相比于iptables防火墙firewall支持动态更新的技术并且加入的区域(zone)相关的概念。
简单来说,区域就是firewall预先准备了几套防火墙策略的集合,从而实现防火墙之间策列的快速切换技术,从而极大地提升了防火墙的快速切换应用效率。
区域 | 默认策略规则 |
trusted | 允许所有数据包 |
home | 拒绝流入流量,但是与ssh,mdns,ipp-client,dhcpv6-client服务则允许通过 |
internal | 等同于home区域 |
work | 拒绝流入流量,但是与ssh,ipp-client,dhcpv6-client服务则允许通过 |
public | 拒绝流入流量,但是与ssh,ipp-client,dhcpv6-client服务则允许通过 |
external | 拒绝流入流量,但是与ssh服务相关则允许通过 |
dmz | 拒绝流入流量,但是与ssh服务相关则允许通过 |
block | 拒绝流入流量,除非与流出的流量相关 |
drop | 拒绝流入流量,除非与流出的流量相关 |
firewalld是Linux系统上的一种动态防火墙管理工具。它是Centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙。
firewalld主要工作在网络层,属于包过滤防火墙。与传统的iptables防火墙相比,firewalld具有更加灵活和易用的特点,可以实现更加细粒度的网络访问控制。
firewalld防火墙主要包括区域(zone)和服务(Service)两个方面。区域(zone)是防火墙的一种配置,将网络的不同部分分为若干个区域,每个区域都有一组预定义的规则集合。例如,public区域适用于公共互联网环境下的主机,internal区域适用于内部网络环境下的主机。服务(Service)则是一组预定义的规则,用于允许或拒绝对特定端口的访问。
firewalld提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算),并且拥有两种配置模式:运行时配置与永久配置。
防火墙状态查询命令: 一些防火墙常用状态查询命令,firewall防火墙只需要指定完整参数即可查询防火墙当前状态.
[root@localhost ~]# firewall-cmd --state #显示运行状态
[root@localhost ~]# firewall-cmd --get-zones #显示所有zone区域
[root@localhost ~]# firewall-cmd --get-active-zones #显示当前使用的区域
[root@localhost ~]# firewall-cmd --get-default-zone #显示默认使用的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32 #查看ens32网口的区域
[root@localhost ~]# firewall-cmd --zone=public --list-ports #显示public区域所有开放的端口
防火墙服务放行命令: 首先我们通过参数--panic-on
拒绝所有,并通过--add-service
放行NFS服务所对应的端口号.
[root@localhost ~]# firewall-cmd --get-services #显示服务列表
[root@localhost ~]# firewall-cmd --list-service #查询当前放行服务
[root@localhost ~]# firewall-cmd --panic-on #拒绝所有包
[root@localhost ~]# firewall-cmd --panic-off #取消拒绝状态
[root@localhost ~]# firewall-cmd --query-panic #查看是否拒绝
[root@localhost ~]# firewall-cmd --reload #重新加载防火墙
[root@localhost ~]# firewall-cmd --add-service=nfs #临时允许nfs服务通过
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent #永久允许nfs服务通过
#放行https服务数据包通过
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 service name=httpd accept'
[root@localhost ~]# firewall-cmd --list-rich-rule
rule family="ipv4" source address="192.168.1.0/24" service name="https" accept
防火墙端口放行命令: 我们可使用--add-port
命令增加开启某端口,也可使用--remove-port
阻止某端口,使用端口号与服务名均可.
[root@localhost ~]# firewall-cmd --list-all #显示所有端口列表
[root@localhost ~]# firewall-cmd --list-services #查看开放的服务
[root@localhost ~]# firewall-cmd --list-ports #查看开放的端口
[root@localhost ~]# firewall-cmd --add-port=443/tcp #临时开启443端口
[root@localhost ~]# firewall-cmd --remove-port=443/tcp #删除443端口
[root@localhost ~]# firewall-cmd --add-service=mysql #开放mysql端口
[root@localhost ~]# firewall-cmd --remove-service=http #阻止http端口
[root@localhost ~]# firewall-cmd --add-port=3306/tcp #开放通过tcp访问3306
[root@localhost ~]# firewall-cmd --remove-port=80/tcp #阻止通过tcp访问3306
[root@localhost ~]# firewall-cmd --add-port=233/udp #开放通过udp访问233
#临时放行8080端口,和8081端口
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@localhost ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
#放行本地的3260端口
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 port port=3260 protocol=tcp accept'
防火墙配置端口转发: 端口转发功能当用户访问本机80端口是自动转发到本机或目标主机的某个端口上.
#将80端口的流量转发至8080
[root@localhost ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
#将80端口的流量转发至192.168.1.1
[root@localhost ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1.1
#将80端口的流量转发至192.168.1.1的8080端口上
[root@localhost ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.1:toport=8080
查询与设置默认区域: 查询firewall服务当前所使用的区域,同时设置服务新的默认区域为external
区域.
#查询firewall服务当前所使用的区域
[root@localhost ~]# firewall-cmd --get-default-zone
public
#查看ens32网卡的所在区域信息
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public
#设置默认区域为external
[root@localhost ~]# firewall-cmd --set-default-zone=external
success
[root@localhost ~]# firewall-cmd --get-default-zone
external
修改默认区域到新区域: 修改ens32
网口的public
区域到external
区域,并永久生效.
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
public
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32
[root@localhost ~]# firewall-cmd --zone=external --change-interface=ens32 --permanent
success
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens32
external
设置某区域服务状态: 设置某个区域是否允许请求SSH和HTTPS协议的流量
#查询public区域内是否放行了ssh,https服务
[root@localhost ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@localhost ~]# firewall-cmd --zone=public --query-service=https
no
#把public区域的https请求,永久允许通过
[root@localhost ~]# firewall-cmd --zone=public --add-service=https
success
[root@localhost ~]# firewall-cmd --zone=public --add-service=https --permanent
success
#把public区域的https请求,设置为永久拒绝.
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https
success
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanent
success
设置端口转发策略: 在192.168.1.0/24
网络中的系统,访问本地端口5423
将被转发到本地的80
端口.
[root@localhost ~]# firewall-cmd --add-rich-rule 'rule family=ipv4 source address=192.168.1.0/24 forward-port port=5423 protocol=tcp to-port=80' --permanent
允许/移除访问端口: 批量允许或移除某个区域内某个主机的端口策略.
# 允许/移除 192.168.1.10 所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" drop' --permanent
# 允许192.168.2.0/24所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanent
# 允许192.168.10访问22端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
# 移除192.168.10访问22端口
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
# 允许192.168.1.0/24访问22端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" port port=22 protocol=tcp accept'
防火墙技术种类:
(1)包过滤防火墙(packet filtering)
(2)应用代理防火墙 (application proxy)
(3)状态检测防火墙(stateful inspection)
(firewalld是包过滤防火墙,所以这里只讲包过滤防火墙)
包过滤防火墙概述:
(1)netfilter:位于Linux内核中的包过滤功能体系,成为Linux防火墙的“内核态”。
(2)firewalld:CentOS7默认的管理防火墙规则的工具,成为Linux防火墙的“用户态”。
————上面的两种称呼都可以表示为Linux防火墙。
包过滤的工作层次:
(1)主要是网络层,针对IP数据包、检查源IP。
(2)体现在对包内的IP地址、端口等信息的处理上。
网络区域:
Firewalld预定义的九种网络区域:
①trusted②public③work④home⑤internal⑥external⑦dmz⑧block⑨drop
————默认情况就有一些有效的区域,由firewalld提供的区域按照从不信任到信任的顺序排序。
(1)丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃,这个类似于Centos6上的 iptables -j drop ,使用丢弃规则意味着将不存在相应。
(2)阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过,即只允许由该系统初始化的网络连接。
(3)公共区域(Public Zone):只接受那些被选中的连接,默认只允许ssh和dhcpv6-client,这个zone是缺省zone(缺省就是默认的意思,所以公共区域也是默认区域,在没有任何配置的情况下走的是公共区域)。
(4)外部区域(External Zone):这个区域相当于路由器的启动伪装(masquerading)选项,只有指定的连接会被接受,即ssh,而其他的连接将被丢弃或者不被接受。
(5)隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在DMZ区域中定义,它也拥有只通过被选中连接的特性,即ssh, 这个区域又叫做非军事化区域。
(6)工作区域(Work Zone):在这个区域中,我们只能定义内部网络,比如私有网络通信才被允许, 只允许ssh、ipp-client和dhcpv6-client。
(7)家庭区域(Home Zone):这个区域专门用于家庭环境,它同样只允许被选中的连接, 即ssh、ipp-client、mdns、samba-client和dhcpv6-client。
(8)内部区域(Internal Zone):这个区域和 工作区域(Work Zone) 类似,只允许通过被选中的连接,与 家庭区域(Home Zone) 相同。
(9)信任区域(Trusted Zone):信任区域允许所有网络通信通过,因为 信任区域(Trusted Zone)是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为 信任区域(Trusted Zone)是允许所有连接的。
————以上是系统定义的所有的区域(Zone),但是,不是所有的区域(Zone)都在使用,只有活跃的区域(Zone)才有实际操作意义。
注意:因为默认区域只允许ssh和dhcp,所以在没有任何配置的情况下默认是拒绝ping包的。
常用命令
# 查看所有放行端口
firewall-cmd --zone=public --list-ports
# 禁止IP访问机器
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.0.1" drop'
# 禁止一个IP段,比如禁止192.168.*.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.0.1/16" drop'
# 禁止一个IP段,比如禁止192.168.0.*
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address="192.168.0.1/24" drop'
# 禁止机器IP从防火墙中删除
firewall-cmd --permanent --remove-rich-rule='rule family=ipv4 source address="192.168.0.1" drop'
# 允许http服务(对应服务策略目录:/usr/lib/firewalld/services/)
firewall-cmd --permanent --add-service=http
# 关闭http服务(对应服务策略目录:/usr/lib/firewalld/services/)
firewall-cmd --permanent --remove-service=http
# 允许端口:3306
firewall-cmd --permanent --add-port=3306/tcp
# 允许端口:1-3306
firewall-cmd --permanent --add-port=1-3306/tcp
# 关闭放行中端口:3306
firewall-cmd --permanent --remove-port=3306/tcp
# 查看firewall的状态
firewall-cmd --state
# 查看防火墙规则(只显示/etc/firewalld/zones/public.xml中防火墙策略)
firewall-cmd --list-all
# 查看所有的防火墙策略(即显示/etc/firewalld/zones/下的所有策略)
firewall-cmd --list-all-zones
# 重新加载配置文件
firewall-cmd --reload
# 更改配置后一定要重新加载配置文件
firewall-cmd --reload
# Postgresql端口设置。允许192.168.142.166访问5432端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port port="5432" protocol="tcp" accept"
# redis端口设置。允许192.168.142.166访问6379端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port port="6379" protocol="tcp" accept"
# beanstalkd端口设置。允许192.168.142.166访问11300端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port port="11300" protocol="tcp" accept"
# 查看防火墙端口列表
firewall-cmd --list-ports
# 添加指定端口tcp
firewall-cmd --zone=public --add-port=8080/tcp --permanent # 开放8080/tcp端口
firewall-cmd --zone=public --add-port=10002-10010/tcp --permanent # 开放10002-10010/tcp端口范围
# 添加指定端口udp
firewall-cmd --zone=public --add-port=9200/udp --permanent # 开放9200/udp端口
firewall-cmd --zone=public --add-port=20015-20020/udp --permanent # 开放20015-20020/udp端口范围
# 删除指定端口
firewall-cmd --zone= public --remove-port=19800/tcp --permanent # 删除已开放的19880/tcp端口
firewall-cmd --zone= public --remove-port=9200-9300/udp --permanent # 删除已开放的9200-9300/udp 端口范围
# 热加载防火墙,使之生效
firewall-cmd --reload
# 指定某IP访问某端口
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.107" port protocol="tcp" port="3306" accept"
# 删除策略
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.0.107" port protocol="tcp" port="3306" accept"
# 指定某个网段访问某个端口范围
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="11.76.168.0/24" port protocol="udp" port="1-65535" accept"
# 删除策略
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="11.76.168.0/24" port protocol="tcp" port="1-65535" accept"
# 禁止指定ip 访问某个端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.200" port protocol="tcp" port="80" reject"
# 禁止某个段的ip 访问某个端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="80" reject"
# 允许指定ip 访问所有端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.100" port protocol="tcp" accept"
# 允许指定ip段 访问所有端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" accept"
# 允许192.168.1.10所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
# 移除192.168.1.10所有访问所有端口
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" accept' --permanent
# 允许192.168.2.0/24(0-255)所有访问所有端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" accept' --permanent
# 允许192.168.1.10所有访问TCP协议的22端口
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
# 移除192.168.1.10所有访问TCP协议的22端口
firewall-cmd --zone=public --remove-rich-rule 'rule family="ipv4" source address="192.168.1.10" port port=22 protocol=tcp reject' --permanent
# 防火墙重新载入(必须重新载入后才能生效)
firewall-cmd --reload
# 查看rich-rules(富规则)
firewall-cmd --list-rich-rules
# 查看防火墙服务规则
firewall-cmd --list-services
# 查看防火墙所有规则
firewall-cmd --list-all
# 查看防火墙所有区域的配置规则
firewall-cmd --list-all-zones
# 查看默认区域
firewall-cmd --get-default-zone
# 查看网络接口使用区域
firewall-cmd --get-active-zones
# 查看默认的可用服务
firewall-cmd --get-services
# 要启用或禁用HTTP服务
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --remove-service=http --permanent
# 移除现有规则 (此步骤相当重要,很多文章和博客都没提及到)
firewall-cmd --permanent --zone=public --remove-port=80/tcp
firewall-cmd --reload
# 在192.168.100.100 102上测试访问
curl 192.168.100.101
发现均无法再访问101的80端口
# 设置规则
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.100.102" port protocol="tcp" port="80" accept"
firewall-cmd --reload
# 测试访问
curl 192.168.100.101
# 100无法访问 102可以访问
至此实现了通过防火墙firewalld设置规则,指定ip访问指定端口