《Linux运维总结:firewalld防火墙使用教程》

文章目录

  • 一、firewalld基础知识
    • 1.1、firewalld基本介绍
    • 1.2、firewalld与iptables关系与区别
    • 1.3、firewalld默认策略
    • 1.4、firewalld配置模式
    • 1.5、firewalld配置方法
    • 1.6、firewalld区域概念
    • 1.7、firewalld基本指令参数
  • 二、firewalld区域配置策略
  • 三、firewalld服务配置策略
  • 四、firewalld端口配置策略
  • 五、firewalld富规则配置策略
  • 六、firewalld实现路由器功能
    • 6.1、firewalld实现SNAT
    • 6.2、firewalld实现DNAT
  • 总结:整理不易,如果对你有帮助,可否点赞关注一下?


一、firewalld基础知识

1.1、firewalld基本介绍

firewalld即Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器,是iptables的前端控制器,用于实现持久的网络流量规则。


1.2、firewalld与iptables关系与区别

1、firewalld与ipables都不是真正的防火墙,只是用来定义防火墙规则功能的管理工具,将定义好的规则交由内核中的netfilter来实现真正的防火墙功能。
2、在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。

《Linux运维总结:firewalld防火墙使用教程》_第1张图片
与直接控制iptables相比,使用firewalld有两个主要区别:
1、firewalld使用区域和服务而不是链式规则。
2、firewalld默认是拒绝的,需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制。
3、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
4、iptables service在/etc/sysconfig/iptables中存储配置,而firewalld将配置存储在/usr/lib/firewalld/和/etc/firewalld/中的各种XML文件里。


1.3、firewalld默认策略


1.4、firewalld配置模式

firewall-cmd 命令工具有两种配置模式:

运行时规则(Runtime mode):表示当前内存中运行的防火墙配置,在系统或firewalld服务重启、停止时配置将失效。
永久规则(Permanent mode:表示重启防火墙或重新加载防火墙时的规则配置,是永久存储在配置文件中的。

firewall-cmd命令工具与配置模式相关的选项有三个。

--reload: 重新加载防火墙规则并保持状态信息,即将永久配置应用为运行时配置。
--permanent:带有此选项的命令用于设置永久性规则,这些规则只有在重新启动firewalld或重新加载防火墙规则时才会生效,若不带有此选项,表示用于设置运行时规则。
--runtime-to-permanent:将当前的运行时配置写入规则配置文件中,使之成为永久性配置。

1.5、firewalld配置方法

firewallD的配置方法主要有三种:

1、firewall-config
2、firewall-cmd
3、直接编辑xml文件

说明:其中firewall-config是图形化工具,firewall-cmd是命令行工具。


1.6、firewalld区域概念

通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。

查看所有的域
在这里插入图片描述
说明:firewalld的默认区域是public,firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,如下图所示:
在这里插入图片描述


1、block

block(限制):拒绝所有网络连接

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第2张图片


2、dmz

dmz(非军事区):仅接受ssh服务连接

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第3张图片


3、drop

drop(丢弃):任何接收的网络数据包都被丢弃,没有任何回复。

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第4张图片


4、external

external(外部):出去的ipv4网络连接通过此区域伪装和转发,仅接受ssh服务连接。

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第5张图片


5、home

home(家庭):用于家庭网络,仅接受ssh、mdns、ipp-client、samba-client、dhcpv6-client服务连接。

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第6张图片


6、internal

internal(内部):用于内部网络,仅接受ssh、mdns、ipp-client、samba-client、dhcpv6-client服务连接。

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第7张图片


7、public

public(公共):在公共区域内使用,仅接受ssh或dhcpv6-client服务连接,为firewalld的默认区域。

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第8张图片


8、trusted

trusted(信任):可接受所有的网络连接

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第9张图片


9、work

work(工作):用于工作区,仅接受ssh或dhcpv6-client服务连接。

如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第10张图片


1.7、firewalld基本指令参数

1、zone区域相关指令

firewall-cmd --get-default-zone        #查询默认的区域名称
firewall-cmd --set-default-zone=<zone> #设置默认的区域,使其永久生效
firewall-cmd --get-active-zones   #显示当前正在使用的区域与网卡名称
firewall-cmd --get-zones          #显示总共可用的区域
firewall-cmd --delete-zone=<zone> #删除指定域
firewall-cmd --new-zone=<zone> --permanent #创建指定域
firewall-cmd --zone=<zone> --list-all #查看指定域的详细信息
firewall-cmd --info-zone=<zone> #查看指定域的详细信息
firewall-cmd --list-all-zones   #查看所有域的详细信息

2、services服务相关指令

firewall-cmd --new-service=<service> --permanent #创建service   
firewall-cmd --delete-service=<service> --permanent #删除service
firewall-cmd --info-service=<service> #查看指定服务的详细信息
firewall-cmd --service=<service> --set-description=<description> --permanent #设置指定服务的描述信息
firewall-cmd --service=<service> --get-description --permanent #查看指定服务的描述信息
firewall-cmd --service=<service> --set-short=<description> --permanent  #设置指定服务的描述信息
firewall-cmd --service=<service> --get-short --permanent #查看指定服务的描述信息
firewall-cmd --service=<service> --add-port=<portid>[-<portid>]/<protocol> --permanent #服务添加端口
firewall-cmd --service=<service> --remove-port=<portid>[-<portid>]/<protocol> --permanent #服务移除端口
firewall-cmd --service=<service> --query-port=<portid>[-<portid>]/<protocol> --permanent #查看服务指定端口
firewall-cmd --service=<service> --get-ports #查看服务所有端口
firewall-cmd --service=<service> --add-protocol=<protocol> --permanent #服务添加协议
firewall-cmd --service=<service> --remove-protocol=<protocol> --permanent #服务移除协议
firewall-cmd --service=<service> --query-protocol=<protocol> --permanent #查看服务指定协议
firewall-cmd --service=<service> --get-protocols --permanent #查看服务所有协议 
firewall-cmd --service=<service> --add-source-port=<portid>[-<portid>]/<protocol> --permanent #服务添加源端口
firewall-cmd --service=<service> --remove-source-port=<portid>[-<portid>]/<protocol> --permanent #服务移除源端口
firewall-cmd --service=<service> --query-source-port=<portid>[-<portid>]/<protocol> --permanent #服务查看指定源端口
firewall-cmd --service=<service> --get-source-ports --permanent #服务查看所有源端口
firewall-cmd --service=<service> --set-destination=<ipv>:<address>[/<mask>] --permanent #服务添加访问的目标ip
firewall-cmd --service=<service> --remove-destination=<ipv> --permanent #服务移除访问的目标ip
firewall-cmd --service=<service> --query-destination=<ipv>:<address>[/<mask>] --permanent #服务查看指定的目标ip
firewall-cmd --service=<service> --get-destinations --permanent #服务查看所有目标ip

3、Port端口相关指令

firewall-cmd --list-ports        #查看默认区域所有端口 
firewall-cmd --add-port=<portid>[-<portid>]/<protocol>  --permanent     #设置默认区域允许该端口          
firewall-cmd --remove-port=<portid>[-<portid>]/<protocol>  --permanent  #移除默认区域允许该端口        
firewall-cmd --query-port=<portid>[-<portid>]/<protocol> --permanent    #查看默认区域指定端口

4、Interface网卡相关指令

firewall-cmd --list-interfaces #查看默认区域网卡接口   
firewall-cmd --add-interface=<interface> --permanent #将某个网卡绑定到某个指定区域
firewall-cmd --change-interface=<interface> #将某个网卡与区域进行关联
firewall-cmd --query-interface=<interface>
firewall-cmd --remove-interface=<interface>

5、其他相关指令

firewall-cmd --list-all	#显示当前区域的网卡配置参数、资源、端口以及服务等信息
firewall-cmd --reload	#让“永久生效”的配置规则立即生效,并覆盖当前的配置规则

二、firewalld区域配置策略

使用firewalld各个区域规则结合配置,调整默认public区域拒绝所有流量,但如果来源IP是192.168.1.0/24网段则允许。

1、查看默认使用区域及配置规则

1、通过--get-default-zone获取当前默认使用的区域
[root@snat zones]# firewall-cmd --get-default-zone
public

2、.通过--list-all查看当前默认区域public配置了哪些规则
[root@snat zones]# firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens38
  sources: 
  services: ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

2、使用firewalld各个区域规则结合配置,调整默认public区域拒绝所有流量,但如果来源IP是192.168.1.0/24网段则允许

1、临时移除默认区域的规则策略
[root@snat zones]# firewall-cmd --remove-service=ssh --remove-service=dhcpv6-client
success

2、添加来源是192.168.1.0/24网段,临时将其加入白名单(更精细化控制使用富规则)
[root@snat zones]# firewall-cmd --add-source=192.168.1.0/24 --zone=trusted
success

3、检查当前活动的区域
[root@snat zones]# firewall-cmd --get-active-zone
public
  interfaces: ens33 ens38
trusted
  sources: 192.168.1.0/24

3、查询public区域是否允许请求ssh、dhcpv6-client服务的流量

[root@snat zones]# firewall-cmd --zone=public --query-service=ssh
no
[root@snat zones]# firewall-cmd --zone=public --query-service=dhcpv6-client
no

4、上述配置均为临时配置,使用firewall-cmd --reload临时配置会被清空

[root@snat zones]# firewall-cmd --reload
success
[root@snat zones]# firewall-cmd --get-active-zone
public
  interfaces: ens33 ens38

三、firewalld服务配置策略

为了方便管理,firewalld预先定义了很多服务,存放在/usr/lib/firewalld/services/目录中,服务通过单个的XML配置文件来指定。这些配置文件则按以下格式命名:service-name.xml,每个文件对应一项具体的网络服务,如ssh服务等。与之对应的配置文件中记录了各项服务所使用的tcp/udp端口,在最新版本的firewalld中默认已经定义了126多种服务供我们使用,对于每个网络区域,均可以配置允许访问的服务。

当默认提供的服务不适用或者需要自定义某项服务的端口时,我们需要将service配置文件放置在/etc/firewalld/services/目录中。

service配置具有以下优点:

1、通过服务名字来管理规则更加人性化
2、通过服务来组织端口分组的模式更加高效,如果一个服务使用了若干个网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。

service文件中的标签解释:

1、version:version是service节点的一个可选属性,用于表示service的版本。
2、short:short在zone、icmptype等配置文件中也存在,其作用是简介,主要是让我们对所配置的内容有所了解,类似于注释的作用。
3、description:作用跟short相同,不过描述信息更加详细。
4、port:服务所对应的端口,这项是service中非常重要的一个配置项,大部分service主要就是对port进行绑定的,当一个service绑定了指定端口之后,该端口接收到的连接就会当成这个service,然后到所对应的zone中去查询规则,从而判断是否可以放行。port节点有两可个配置的属性:port和protocol
5、port属性:port用来配置所使用的端口号,可以是单个端口也可以是一个端口段,比如port=100-105表示100到105之间的端口号,另外,port属性是个可选属性,可以不进行设置。
6、protocol属性:protocol属性用于指定所对应的协议,如果port属性不为空,那么protocol应该设置为tcp或者udp,如果port属性为空(没设置),那么protocol可以设置为/etc/protocols中所包含的任意协议。
7、destination:destination非常简单,它就表示目标地址,也就是根据目标地址来绑定服务,他有两个属性:ipv4和ipv6,分别用于绑定ipv4和ipv6的地址,可以使用单个地址也可以使用掩码。另外,在一个service中destination最多只能出现一次。

这里就以Mysql服务为例,如下所示我这边使用docker部署了mysql服务,因为firewalld的防火墙规则默认是拒绝的,启动firewalld防火墙使用客户端工具无法连接,现在对mysql服务进行配置防火墙规则,允许客户端用户可以连接Mysql服务。
在这里插入图片描述
操作步骤如下:

1、编辑配置mysql服务

[root@snat firewalld]# cp /usr/lib/firewalld/services/mysql.xml /etc/firewalld/services/
[root@snat services]# vim /etc/firewalld/services/mysql.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MySQL</short>
  <description>MySQL Database Server</description>
  <port protocol="tcp" port="53000"/> #修改端口
</service>

2、配置前查看public区域内允许访问的服务

[root@snat services]# firewall-cmd --zone=public --list-services
ssh dhcpv6-client

3、为public区域设置允许访问的mysql服务

[root@snat services]# firewall-cmd --zone=public --add-service=mysql --permanent

4、重新加载配置

[root@snat services]# firewall-cmd --reload
success

5、配置后查看public区域内允许访问的服务

[root@snat zones]# firewall-cmd --zone=public --list-services
ssh mysql dhcpv6-client

6、移除mysql服务防火墙规则

[root@snat services]# firewall-cmd --zone=public --remove-service=mysql --permanent
success
[root@snat services]# firewall-cmd --reload
success
[root@snat zones]# firewall-cmd --zone=public --list-services
ssh dhcpv6-client

四、firewalld端口配置策略

在进行服务配置时,预定义的网络服务可以使用服务名配置,服务所涉及的端口就会自动打开。但是,对于非预定义的服务只能手动为指定的区域添加端口。

使用firewalld允许客户请求的服务器的80/tcp端口,仅临时生效,如添加–permanent重启后则永久生效

1、临时添加允许放行单个端口

[root@snat zones]# firewall-cmd --add-port=80/tcp
success
[root@snat zones]# firewall-cmd --list-ports
80/tcp

2、临时添加放行多个端口

[root@snat zones]# firewall-cmd --add-port={80/tcp,8080/tcp}
success
[root@snat zones]# firewall-cmd --list-ports
80/tcp 8080/tcp

3、.永久添加多个端口,需要添加–permanent,并且需要重载firewalld

[root@snat zones]# firewall-cmd --add-port={80/tcp,8080/tcp} --permanent
success
[root@snat zones]# firewall-cmd --reload
success
[root@snat zones]# firewall-cmd --list-ports
80/tcp 8080/tcp

4、移除临时添加的端口规则

[root@snat zones]# firewall-cmd --remove-port={80/tcp,8080/tcp}
success
[root@snat zones]# firewall-cmd --list-ports

5、移除永久添加的端口规则

[root@snat zones]# firewall-cmd --remove-port={80/tcp,8080/tcp} --permanent
success
[root@snat zones]# firewall-cmd --reload
success
[root@snat zones]# firewall-cmd --list-ports

五、firewalld富规则配置策略

firewalld中的富规则可以配置更细致、更详细的防火墙策略,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置, 优先级在所有的防火墙策略中也是最高的。

富规则相关命令

man firewall-cmd                #帮助手册
man firewalld.richlanguage      #获取富规则手册
    rule
        [source]
        [destination]
        service|port|protocol|icmp-block|masquerade|forward-port
        [log]
        [audit]
        [accept|reject|drop]

rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
accept | reject [type="reject type"] | drop

富规则相关命令
--add-rich-rule=''        #在指定的区添加一条富规则
--remove-rich-rule=''     #在指定的区删除一条富规则
--query-rich-rule=''      #找到规则返回0 ,找不到返回1
--list-rich-rules               #列出指定区里的所有富规则

这里就以consul服务为例,因为firewalld的防火墙规则默认是拒绝的,启动firewalld防火墙使用客户端用户无法连接,现在对consul服务进行配置防火墙规则,允许客户端用户可以连接consul服务。
在这里插入图片描述
操作步骤如下:

1、添加防火墙规则前在192.168.1.48主机上访问consul服务端口
《Linux运维总结:firewalld防火墙使用教程》_第11张图片
2、在192.168.1.34主机上添加防火墙规则(对指定ip开放指定端口)

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8300" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8301" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8302" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8500" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8600" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8301" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8302" accept" 
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8600" accept" 
firewall-cmd --reload

进入/etc/firewalld/zones/public.xml文件查看配置的规则,如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第12张图片
总结:也可以手动编辑public.xml文件进行规则添加。

3、查看配置结果,如下图所示:
《Linux运维总结:firewalld防火墙使用教程》_第13张图片
4、添加防火墙规则后在192.168.1.48主机上访问consul服务端口
《Linux运维总结:firewalld防火墙使用教程》_第14张图片
5、删除防火墙规则

firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8300" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8301" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8302" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8500" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="tcp" port="8600" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8301" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8302" accept" 
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.1.48" port protocol="udp" port="8600" accept" 
firewall-cmd --reload

总结:也可以在public.xml文件中将之前添加的规则进行手动删除。


六、firewalld实现路由器功能

6.1、firewalld实现SNAT

实例:实现内部主机访问外部服务
《Linux运维总结:firewalld防火墙使用教程》_第15张图片
步骤如下:

1、开启路由转发

#临时开启
[root@snat zones]# echo 1 > /proc/sys/net/ipv4/ip_forward

#永久开启
[root@snat zones]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@snat zones]# sysctl -p

2、firewalld防火墙开启masquerade, 实现地址转换

设置默认区域的SNAT的IP伪装
[root@snat zones]# firewall-cmd --add-masquerade --permanent
[root@snat zones]# firewall-cmd --reload
#################################下面部分不用执行#################################
查看默认区域的SNAT是否允许
[root@snat zones]# firewall-cmd --query-masquerade --permanent

删除默认区域的SNAT功能
[root@snat zones]# firewall-cmd --remove-masquerade --permanent

3、客户端将网关指向firewalld服务器,将所有网络请求交给firewalld

[root@web ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
GATEWAY=192.168.149.100

4、客户端主机192.168.149.101上测试访问http://192.168.1.48:80

[root@host-48 ~]# tail -1000f /var/log/nginx/access.log
192.168.1.34 - - [19/Nov/2021:15:14:41 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.1.34 - - [19/Nov/2021:15:14:42 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.1.34 - - [19/Nov/2021:15:14:42 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"

通过日志会发现,客户端是先伪装成了192.168.1.34这个ip后再访问的web服务器!


6.2、firewalld实现DNAT

端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口,通常要配合地址伪装才能实现.

实例:实现外部主机访问内部服务
《Linux运维总结:firewalld防火墙使用教程》_第16张图片
步骤如下:

1、开启路由转发

#临时开启
[root@snat zones]# echo 1 > /proc/sys/net/ipv4/ip_forward

#永久开启
[root@snat zones]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@snat zones]# sysctl -p

2、添加提供访问的端口

[root@snat zones]# firewall-cmd --add-port=8091/tcp --permanent
success

3、添加转发的端口和ip地址

格式:firewall-cmd --permanet --zone=<区域> --add-forward-port=port=源端口号:proto=<协议>:toport=<目标端口>:toaddr=<目标IP地址>

[root@snat zones]# firewall-cmd --permanent --add-forward-port=port=8091:proto=tcp:toport=80:toaddr=192.168.1.48
success

4、开启FirewallD的ip地址伪装

[root@snat zones]# firewall-cmd --add-masquerade --permanent

5、配置生效

[root@snat zones]# firewall-cmd --reload
success
[root@snat zones]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33 ens38
  sources: 
  services: ssh dhcpv6-client
  ports: 8091/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=8091:proto=tcp:toport=80:toaddr=192.168.1.48
  source-ports: 
  icmp-blocks: 
  rich rules: 

6、中转服务器上的8091端口实际是没有打开的

[root@snat zones]# ss -tnulp | grep 8091

7、客户端主机测试访问http://192.168.1.34:8091,实际访问的是192.168.1.48主机上的nginx 80端口服务,但是nginx日志记录的源ip地址为中转服务器的ip地址,这样就实现了地址伪装
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结

你可能感兴趣的:(《Linux运维实战总结》,运维,容器,linux)