[toc]

防火墙安全概述

在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管
理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理方式。
对于接触Linux较早的人员对Iptables比较熟悉,但由于Iptables的规则比较的麻烦,并且对网络有一定
要求,所以学习成本较高。但firewalld的学习对网络并没有那么高的要求,相对iptables来说要简单不
少,所以建议刚接触CentOS7系统的人员直接学习Firewalld。

image-20230226182538100

防火墙的规则

  • 入站
  • 出战

如果开启防火墙工具,并且没有配置任何允许的规则,那么从外部访问防火墙设备默认会被阻止,但是如果直接从防火墙内部往外部流出的流量默认会被允许。

firewalld 只能做和IP/Port相关的限制,web相关的限制无法实现。

image-20230628213702780

区域选项策略

区域选项策略概述

那么相较于传统的Iptables防火墙,firewalld支持动态更新,并加入了区域zone的概念
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据不同的场景选择不同的策略模板,从而实现防火墙策略之间的快速切换

Windows防火墙安全策略

image-20230224145605531

区域规则示意图

image-20230628213750142

需要注意的是Firewalld中的区域与接口
一个网卡仅能绑定一个区域, eth0 –>A区域 A区域–>eth0 eth1 eth2 但一个区域可以绑定多个网卡。
还可以根据来源的地址设定不同的规则。
比如:所有人能访问80端口,但只有公司的IP才允许访问22端口。

区域选项 默认规则策略
trusted 允许所有的数据包流入流出
home 拒绝流入的流量,除非与流出的流量相关;
如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量相关;
如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量
public 拒绝流入的流量,除非与流出的流量相关;
如果流量与ssh、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;
如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;
如果流量与ssh服务相关,则允许流量
block 拒绝流入的流量,除非与流出的流量相关
drop 拒绝流入的流量,除非与流出的流量相关
  • trusted:允许所有的数据包流入流出,允许任何流量进入可以访问我的任何服务,任何端口
  • puiblic:下载默认的防火墙
  • drop:无论什么端口加到drop都会被拒绝

防火墙命令

命令合集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# zone区域相关指令
--get-default-zone # 获取默认的区域名称
--set-default-zone=<区域名称> # 设置默认的区域,使其永久生效
--get-active-zones # 显示当前正在使用的区域与网卡名称
--get-zones # 显示总共可用的区域
--new-zone=<区域名称> # 新增区域

# services服务相关命令
--get-services # 列出服务列表中所有可管理的服务
--add-service=<服务名称> # 设置默认区域允许该填加服务的流量
--remove-service=<服务名称> # 设置默认区域不允许该删除服务的流量

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

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

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

# 是否允许请求指定服务的流量
--queryservice=<服务名称> # 检查是否允许此服务的流量

# 注意firewalld的规则分为两种状态
runtime运行时: 修改规则马上生效,但如果重启服务则马上失效,测试建议。
permanent持久配置: 修改规则后需要reload重载服务才会生效,生产建议。

解析 –list-all

1
2
3
4
5
6
7
8
9
10
11
12
13
public (active)            			    # 当前正在使用的区域
target: default # 当前默认的区域
icmp-block-inversion: no # icmp块没有开启
interfaces: eth1 eth0 # 当前区域监听的网卡
sources: # 允许来源 10.0.0.1
services: ssh dhcpv6-client # 允许访问服务
ports: # 允许访问的端口
protocols: # 允许访问的协议
masquerade: no # ip伪装
forward-ports: # 端口转发,端口映射
source-ports: # 来源的端口
icmp-blocks: # icmp块
rich rules: # 富规则

image-20230226181936748

防火墙配置示例

需求

使用firewall配置,调整默认public区域拒绝所有的流量,如果来源是10.0.0.0/24网段则允许

1
2
3
4
5
6
7
8
9
10
11
12
# 移除区域的所有流量
firewall-cmd --remove-service=ssh --remove-service=dhcpv6-client

# 将来源IP网段加入到trusted区域
firewall-cmd --add-source=10.0.0.0/24 --zone=trusted

# 查看正在使用的区域
firewall-cmd --get-active-zone
public
interfaces: eth1 eth0 # 任何来源网段都走public默认区域规则(除了10网段)
trusted
sources: 10.0.0.0/24 # 来源是10网段则走trusted区域规则

防火墙配置放行策略

firewalld放行服务

1
2
3
4
5
6
7
8
9
10
11
12
# 安装http
yum install -y httpd

# 启动httpd
systemctl start httpd # 浏览器访问失败

# 添加http服务放行策略
firewall-cmd --add-service=http
success # 浏览器访问成功

# 删除http服务放行策略
firewall-cmd --remove-service=http # 浏览器访问失败

firewalld放行端口

1
2
3
4
5
# 添加放行端口
firewall-cmd --add-port=80/tcp # 浏览器访问成功

# 删除放行端口
firewall-cmd --remove-port=80/tcp # 浏览器访问失败

firewalld放行自定义服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 查看多有的服务
firewall-cmd --get-services

# 添加不存在的服务
firewall-cmd --add-services=sersync

# 增加配置文件
cp /usr/lib/firewalld/services/{ssh,sersync}.xml

# 修改配置文件
vim /usr/lib/firewalld/services/sersync.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>sersync</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing
commands on remote machines. It provides secure encrypted communications. If you
plan on accessing your machine remotely via SSH over a firewalled interface,
enable this option. You need the openssh-server package installed for this
option to be useful.</description>
<port protocol="tcp" port="874"/>

# 重启防火墙
firewall-cmd --reload

# 添加服务
firewall-cmd --add-services=sersync

防火墙端口转发策略

概述

端口转发是指传统的目标地址映射,实现外网访问内网资源,流量转发命令格式为:
firewalld-cmd –permanent –zone=<区域> –add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>

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

image-20230628214218997

firewalld实现端口转发(端口映射)只能转发tcp相关的服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 端口转发公式
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协
议>:toport=<目标端口号>:toaddr=<目标IP地址>

# 添加端口转发
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80:toaddr=10.0.0.7

# 重启firewall
firewall-cmd --reload

# 开启伪装ip
firewall-cmd --add-masquerade

# 查看区域配置
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth1 eth0
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports: port=2222:proto=tcp:toport=22:toaddr=172.16.1.7
source-ports:
icmp-blocks:
rich rules:

# 实现转发测试
10.0.0.8:8888

image-20230226182110427

1
# 访问10.0.0.7:80

image-20230226182139503

1
# 10.0.0.8:8888 = 10.0.0.7:80

image-20230226182159822

防火墙富语言规则策略

规则策略概述

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
man firewall-cmd
man firewalld.richlanguage
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forwardport|
source-port
[log]
[audit]
[accept|reject|drop|mark]

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

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

示例

需求:允许10.0.0.7主机能够访问http服务,允许172.16.1.0/24能够访问ssh/22端口

1
2
3
xshell连接不上服务器,但是我的172.16.1.0/24网段可以访问22
firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.0.0.7" service name="http" accept'
firewall-cmd --add-rich-rule='rule family=ipv4 source address="172.16.1.0/24" port port="22" protocol="ssh" accept'