firewalld防火墙

1949人浏览 / 0人评论

firewalld防火墙

1、firewalld简介

RHEL/CentOS 7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems, Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于 GUI(图形用户界面)的两种管理方式。

2、firewalld和iptables区别

firewalld支持动态更新,并加入了区域zone的概念。
firewalld默认规则是拒绝,iptables默认是允许。

3、firewalld zone概念

简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适 的策略集合,从而实现防火墙策略之间的快速切换。
我们知道每个zone就是一套规则集,但是有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。
对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:
1、source,也就是源地址
2、interface,接收请求的网卡
3、firewalld.conf中配置的默认zone
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是学生在前面给大家讲过的在firewalld.conf中配置的默认zone。

4、名词解释

在具体介绍zone之前学生先给大家介绍几个相关的名词,因为如果不理解这几个名词zone就无从入手。
target:目标,zone规则中首先最重要的是target的设置,他默认可以取四个值:default、ACCEPT、%%REJECT%%、DROP,如果不设置默认为default.
service:表示一个服务
port:端口,使用port可以不通过service而直接对端口进行设置
interface:接口,可以理解为网卡
source:源地址,可以是ip地址也可以是ip地址段
icmp-block:icmp报文阻塞,可以按照icmp类型进行设置
masquerade:ip地址伪装,也就是按照源网卡地址进行NAT转发
forward-port:端口转发
rule:自定义规则

5、区域管理

一个重要的概念:区域管理
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
阻塞区域(block):任何传入的网络数据包都将被阻止(拒绝流入的流量,除非与流出的流量相关)。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机(拒绝流入的流量,除非与流出的流量数相关;而如果流量与 ssh、ipp-client与dhcpv6-client服务相关,则允许流)。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机(拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、 mdns、ipp-client、amba-client与dhcpv6-client服务相关, 则允许流量)。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接(拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、 dhcpv6-client服务相关,则允许流量)。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受(允许所有的数据包流入与流出)。
丢弃区域(drop):任何传入的网络连接都被拒绝(拒绝流入的流量,除非与流出的流量相关)。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接(等同于home区域)。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接(拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服 务相关,则允许流量)。
注:FirewallD的默认区域是public。
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。

6、firewalld-cmd主要参数

zong区域相关指令
--get-default-zone  查询默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域,使其永久生效
--get-zones  显示可用的区域
--get-active-zones  显示当前正在使用的区域与网卡名称
--new-zone=<zone>新增区域

services服务相关指令
--get-services  显示预先定义的服务
--add-service=<服务名>  设置默认区域允许该服务的流量
--remove-service=<服务名>  设置默认区域不再允许该服务的流量

Port端口相关指令
--add-port=<端口号/协议>  设置默认区域允许该端口的流量
--remove-port=<端口号/协议>  设置默认区域不再允许该端口的流量

Interface网卡相关指令
--add-interface=<网卡名称>  将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联

source指令
--add-source=  将源自此 IP 或子网的流量导向指定的区域
--remove-source=  不再将源自此 IP 或子网的流量导向某个指定区域

其他
--list-all  显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones  显示所有区域的网卡配置参数、资源、端口以及服务等信息
--reload  让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
--panic-on  开启应急状况模式
--panic-off  关闭应急状况模式

8、firewalld临时和永久

runtime运行时: 修改规则马上生效,但是临时生效 [不建议]
permanent持久配置: 修改后需要reload重载才会生效 [强烈推荐]

9、实战firewalld

1)、启动firewalld

# 禁用旧版防火墙服务 
[root@Firewalld ~]# systemctl mask iptables 
[root@Firewalld ~]# systemctl mask ip6tables 
# 启动firewalld防火墙, 并加入开机自启动服务 
[root@Firewalld ~]# systemctl start firewalld 
[root@Firewalld ~]# systemctl enable firewalld

2)、查看默认使用的区域

[root@web01 ~]# firewall-cmd --get-default-zone 
public
# 查看当前区域的规则有哪些
[root@web01 ~]# firewall-cmd --list-all

3)、使用firewalld中各个区域规则结合,当前默认区域拒绝所有的流量,但如果来源IP是10.0.0.0/24网段则允许。

#1.临时移除策略 
[root@web01 ~]# firewall-cmd --remove-service=ssh --remove-service=dhcpv6-client 
success

#2.添加来源是10.0.0.0/24网段,将其加入白名单 
[root@web01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted 
success

#3.检查当前活动的区域
[root@web01 ~]# firewall-cmd --get-active-zone 
public

4)、查珣public区域是否允许请求SSH HTTPS协议的流量

[root@Firewalld ~]# firewall-cmd --zone=public --query-service=ssh 
yes 
[root@Firewalld ~]# firewall-cmd --zone=public --query-service=https
no

5)、最后将配置恢复至默认规则,--reload参数仅能恢复临时添加的规则策略

[root@web01 ~]# firewall-cmd --reload

9、防火墙端口访问策略

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

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

[root@Firewalld ~]# firewall-cmd --add-port=80/tcp

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

[root@Firewalld ~]# firewall-cmd --add-port={80/tcp,8080/tcp}

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

[root@Firewalld ~]# firewall-cmd --add-port={80/tcp,8080/tcp} --permanet [root@Firewalld ~]# firewall-cmd --reload

4)、检查端口

[root@Firewalld ~]# firewall-cmd --list-ports 
80/tcp 8080/tcp 
#移除临时添加的端口规则 
[root@Firewalld ~]# firewall-cmd --remove-port={80/tcp,8080/tcp}

10、防火墙服务访问策略

使用firewalld允许客户请求服务器的http https协议,仅临时生效,如添加--permanent重启后则永久生效

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

[root@Firewalld ~]# firewall-cmd --add-service=http 

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

[root@Firewalld ~]# firewall-cmd --add-service={http,htps}

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

[root@Firewalld ~]# firewall-cmd --add-service={http,htps} --permanet [root@Firewalld ~]# firewall-cmd --reload

4)、通过--list-services检查端口放行情况

[root@Firewalld ~]# firewall-cmd --list-services 
http https

5)、移除临时添加的http https协议

[root@Firewalld ~]# firewall-cmd --remove-port={http,htps}

6)、如何添加一个自定义端口,转其为对应的服务

#1.拷贝相应的xml文件 
[root@Firewalld ~]# cd /usr/lib/firewalld/services/ 
[root@Firewalld services]# cp http.xml zabbix-agent.xml

#2.修改端口为9000 
[root@Firewalld services]# cat zabbix-agent.xml 
<?xml version="1.0" encoding="utf-8"?> <service> <short>zabbix-agent</short> <description> zabbix-agent </description> <port protocol="tcp" port="10050"/> </service>

#3.防火墙增加规则 
[root@Firewalld ~]# firewall-cmd --permanent --add-service=zabbix-agent [root@Firewalld ~]# firewall-cmd --list-services 
ssh dhcpv6-client http https zabbix-agent

#4.安装php-fpm, 并监听9000端口
[root@Firewalld ~]# yum install zabbix-agent -y 
[root@Firewalld ~]# systemctl start zabbix-agent

#5.测试验证
~ telnet 10.0.0.61 10050 
Trying 10.0.0.61... 
Connected to 10.0.0.61.
Escape character is '^]'.

11、防火墙端口转发策略

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

如果需要将本地的10.0.0.61:5555端口转发至后端172.16.1.9:22端口

1.开启masquerade,实现地址转换 
[root@Firewalld ~]# firewall-cmd --add-masquerade --permanent
2.配置转发规则 
[root@Firewalld ~]# firewall-cmd --permanent --zone=public --add-forward- port=port=6666:proto=tcp:toport=22:toaddr=172.16.1.9 
[root@Firewalld ~]# firewall-cmd --reload

12、防火墙富规则策略

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

............

13、内部上网

在指定的带有公网IP的实例上启动Firewalld防火墙的NAT地址转换,以此达到内部主机上网。

1.firewalld防火墙开启masquerade, 实现地址转换 
[root@Firewalld ~]# firewall-cmd --add-masquerade --permanent 
[root@Firewalld ~]# firewall-cmd --reload 
2.客户端将网关指向firewalld服务器,将所有网络请求交给firewalld
[root@web03 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 GATEWAY=172.16.1.61 
3.客户端还需配置dns服务器 
[root@web03 ~]# cat /etc/resolv.conf nameserver 223.5.5.5 
4.重启网络,使其配置生效
[root@web03 ~]# nmcli connection reload 
[root@web03 ~]# nmcli connection down eth1 && nmcli connection up eth1 
5.测试后端web的网络是否正常 
[root@web03 ~]# ping baidu.com PING baidu.com 
(123.125.115.110) 56(84) bytes of data. 64 bytes from 123.125.115.110 (123.125.115.110): icmp_seq=1 ttl=127 time=9.08 ms

14、常用命令

# 查看设置:
firewall-cmd --state  # 显示状态
firewall-cmd --get-active-zones  # 查看区域信息
firewall-cmd --get-zone-of-interface=eth0  # 查看指定接口所属区域
firewall-cmd --panic-on  # 拒绝所有包
firewall-cmd --panic-off  # 取消拒绝状态
firewall-cmd --query-panic  # 查看是否拒绝

firewall-cmd --reload # 更新防火墙规则
firewall-cmd --complete-reload
# 两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务


# 将接口添加到区域,默认接口都在public
firewall-cmd --zone=public --add-interface=eth0
# 永久生效再加上 --permanent 然后reload防火墙

# 设置默认接口区域,立即生效无需重启
firewall-cmd --set-default-zone=public

# 查看所有打开的端口:
firewall-cmd --zone=dmz --list-ports

# 加入一个端口到区域:
firewall-cmd --zone=dmz --add-port=8080/tcp
# 若要永久生效方法同上

# 打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,这个不详细说了,详情参考文档
firewall-cmd --zone=work --add-service=smtp

# 移除服务
firewall-cmd --zone=work --remove-service=smtp

# 显示支持的区域列表
firewall-cmd --get-zones

# 设置为家庭区域
firewall-cmd --set-default-zone=home

# 查看当前区域
firewall-cmd --get-active-zones

# 设置当前区域的接口
firewall-cmd --get-zone-of-interface=enp03s

# 显示所有公共区域(public)
firewall-cmd --zone=public --list-all

# 临时修改网络接口(enp0s3)为内部区域(internal)
firewall-cmd --zone=internal --change-interface=enp03s

# 永久修改网络接口enp03s为内部区域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s

服务管理

# 显示服务列表  
Amanda, FTP, Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务,可以使用如下命令查看:

firewall-cmd --get-services

# 允许SSH服务通过
firewall-cmd --enable service=ssh

# 禁止SSH服务通过
firewall-cmd --disable service=ssh

# 打开TCP的8080端口
firewall-cmd --enable ports=8080/tcp

# 临时允许Samba服务通过600秒
firewall-cmd --enable service=samba --timeout=600

# 显示当前服务
firewall-cmd --list-services

# 添加HTTP服务到内部区域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
firewall-cmd --reload     # 在不改变状态的条件下重新加载防火墙

端口管理

# 打开443/TCP端口
firewall-cmd --add-port=443/tcp

# 永久打开3690/TCP端口
firewall-cmd --permanent --add-port=3690/tcp

# 永久打开端口需要reload一下,reload后临时打开的端口就失效了
firewall-cmd --reload

# 查看防火墙,添加的端口也可以看到
firewall-cmd --list-all

直接模式
# FirewallD包括一种直接模式,使用它可以完成一些工作,例如打开TCP协议的9999端口
firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
firewall-cmd --reload

控制端口 / 服务
可以通过两种方式控制端口的开放,一种是指定端口号另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,
也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。

firewall-cmd --add-service=mysql        # 开放mysql端口
firewall-cmd --remove-service=http      # 阻止http端口
firewall-cmd --list-services            # 查看开放的服务
firewall-cmd --add-port=3306/tcp        # 开放通过tcp访问3306
firewall-cmd --remove-port=80tcp        # 阻止通过tcp访问3306
firewall-cmd --add-port=233/udp         # 开放通过udp访问233
firewall-cmd --list-ports               # 查看开放的端口

伪装 IP
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade   # 允许防火墙伪装IP
firewall-cmd --remove-masquerade# 禁止防火墙伪装IP

端口转发

端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。
转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 
如果配置好端口转发之后不能用,可以检查下面两个问题:

    比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了
    其次检查是否允许伪装 IP,没允许的话要开启伪装 IP

firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080   # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口

    当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
    端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。

全部评论