29.Linux防火墙管理
文章目录
- Linux防火墙管理
- 认识防火墙
- 静态防火墙和动态防火墙
- 静态防火墙
- 动态防火墙
- Firewalld 防火墙
- Firewalld 区域 zone
- Firewalld 提供的区域
- 数据包与区域匹配规则
- Firewalld 规则
- Firewalld 配置
- Firewalld 配置方法
- Firewalld 配置文件
- 设置默认zone
- 设置 source
- 设置 interface
- 综合实验1:配置防火墙
- 实验要求
- 配置过程
- 综合实验2:配置防火墙
- 实验要求
- 配置过程
Linux防火墙管理
认识防火墙
通俗来说,你的电脑相当于你的家,电脑上的网络端口就相当于你家的门、窗、通风口,每个端口都是一个潜在的通道。网络数据包可以理解为想要进门的人或从家里出去的人。防火墙就可以是安装在电脑上的一个软件(或操作系统自带的功能),它扮演==保安==的角色。
保安拥有一份规则表,在每个端口都巡视,它的核心工作是:根据预设的规则,控制谁可以进来(入站),以及谁可以出去(出站),以保护内部的安全。
防火墙的作用:
- 监控网络流量:时刻检查所有试图进入或离开你电脑的数据。
- 阻止未经授权的访问:比如,有一个黑客想通过某个“端口”潜入你的电脑,防火墙发现这个端口没有对你开放,就会立刻拦截这个请求。
- 控制程序上网:当你第一次运行一个新游戏或软件时,防火墙可能会弹窗问:“是否允许‘某程序’访问网络?” 这就是在制定规则。如果你选择“否”,那么这个程序就无法连接到互联网。
- 防御网络攻击:可以识别并阻挡一些常见的网络扫描和攻击行为。
静态防火墙和动态防火墙
静态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙服务会重新加载所有防火墙规则,哪怕只修改一条规则也要重新读取所有规则,这种载入模式称为静态模式。静态模式加载规则时,会导致网络连接丢失。
我们称使用静态模式载入规则的防火墙为静态防火墙。例如iptables,用户执行 service iptables reload
命令将变更的规则保存到配置文件里,并重新加载所有防火墙规则。
动态防火墙
用户管理防火墙规则时,为了让规则永久保存,防火墙只需要将变更部分保存并更新到运行中的 iptables 即可,而不需要对整个防火墙规则列表进行重新加载,这种载入模式称为动态模式。
我们称使用动态模式载入规则的防火墙为动态防火墙,例如 firewalld。
Firewalld 防火墙
firewalld是CentOS 7默认的动态防火墙管理工具,用于管理系统的网络访问规则。
Firewalld 区域 zone
firewalld 防火墙为了简化管理,zone是firewalld中预设的规则集合,每个zone对应不同的网络安全级别(如信任、公共、内部等),包含允许或拒绝的服务/端口规则。
通过将网络接口或源IP绑定到不同zone,快速适配不同网络环境的安全需求(如家庭网络用trusted zone,公网用public zone)。
Firewalld 提供的区域
firewalld 防火墙提供了如下zone:
- trusted(信任区域):允许所有的传入流量。
- public(公共区域):允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域。
- external(外部区域):允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络。
- home(家庭区域):允许与ssh、mdn3、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- internal(内部区域):默认值时与homel区域相同。
- work(工作区域):允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
- dmz(隔离区域也称为非军事区域):允许与ssh 预定义服务匹配的传入流量,其余均拒绝。
- block(限制区域):拒绝所有传入流量。
- drop(丢弃区域):丢弃所有传入流量,并且不产生包含ICMP的错误响应。
数据包与区域匹配规则
数据包与zone匹配规则如下:
-
首先匹配“源IP地址绑定的zone”(通过
firewall-cmd --zone=xxx --add-source=IP
设置); -
若未匹配源IP,则匹配“网络接口绑定的zone”(通过
firewall-cmd --zone=xxx --add-interface=网卡
设置); -
若均未匹配,则使用“默认zone”(通过
firewall-cmd --get-default-zone
查看)。
注意事项:
- firewalld默认指定public区域为默认区域,并将lo 回环接口映射至 trusted 区域。
- 如果流量不与允许的端口或协议或服务匹配,则通常会被拒绝。
Firewalld 规则
对于所有区域,区域内规则的优先级是相同的。
区域内规则匹配优先级如下:
- 首先匹配为该区域设置的任何端口转发和伪装原则。
- 其次匹配该区域设置的任何允许规则。
- 最后匹配该区域设置的任何拒绝规则。
- 还可以同时为以上3个规则设置记录和审计规则,可以同时生效。
- 富规则中的规则优先级高于区域中其他规则。
- 如果区域中所有规则都不匹配,那么通常会拒绝该包,trusted 例外。
Firewalld 配置
Firewalld 配置方法
- 直接编辑 /etc/firewalld/ 中的配置文件
- firewall-cmd 命令行工具
- firewall-config 图形工具
Firewalld 配置文件
Firewalld 配置配置文件存放在:
- /usr/lib/firewalld/目录,Firewalld软件包自带配置位置。
- /etc/firewalld/目录,目录结构与/usr/lib/firewalld/一致,管理员自定义配置保存在该位置。
**提示:**我们不建议大家通过修改/etc/firewalld/目录配置防火墙。
设置默认zone
当防火墙执行命令的时候,如果不加–zone选项,则代表规则是配置在默认zone
查看默认zone
[root@server ~ 21:03:07]# firewall-cmd --get-default-zone
public
设置默认zone
[root@server ~ 21:05:52]# firewall-cmd --set-default-zone=home
success
[root@server ~ 21:06:08]# firewall-cmd --get-default-zone
home
设置回来,仍然保持为public
[root@server ~ 21:06:10]# firewall-cmd --set-default-zone=public
success
[root@server ~ 21:06:23]# firewall-cmd --get-default-zone
public
设置 source
关联 source 到 zone
[root@server ~ 21:06:24]# firewall-cmd --add-source=10.1.8.0/24 --zone=home
success
[root@server ~ 21:06:55]# firewall-cmd --list-all --zone=home
hometarget: defaulticmp-block-inversion: nointerfaces: sources: services: dhcpv6-client mdns samba-client sshports: protocols: masquerade: noforward-ports: source-ports: icmp-blocks: rich rules:
查看 source
[root@server ~ 13:41:47]# firewall-cmd --list-sources --zone=home
10.1.8.0/24
变更到其他zone
[root@server ~ 21:08:26]# firewall-cmd --change-source=10.1.8.0/24 --zone=internal
success
[root@server ~ 21:09:28]# firewall-cmd --list-sources --zone=internal
10.1.8.0/24
删除 source
[root@server ~ 21:09:32]# firewall-cmd --remove-source=10.1.8.0/24 --zone=internal
success
[root@server ~ 21:10:15]# firewall-cmd --list-sources --zone=internal
重新设置回来
[root@server ~ 21:10:32]# firewall-cmd --add-source=10.1.8.0/24 --zone=internal
success
[root@server ~ 21:10:56]# firewall-cmd --list-sources --zone=internal
10.1.8.0/24
设置 interface
变更到 home
[root@server ~ 21:10:59]# firewall-cmd --change-interface=ens37 --zone=home
success
[root@server ~ 21:11:24]# firewall-cmd --list-interfaces --zone=home
ens37
删除zone中interface
[root@server ~ 21:11:54]# firewall-cmd --remove-interface=ens37 --zone=home
success
[root@server ~ 21:16:24]# firewall-cmd --list-interfaces --zone=home
zone关联interface
[root@server ~ 21:16:40]# firewall-cmd --add-interface=ens37 --zone=home
success
[root@server ~ 21:16:47]# firewall-cmd --list-interfaces --zone=home
ens37
最后活动的 zone
[root@server ~ 21:16:59]# firewall-cmd --get-active-zones
worksources: 10.1.8.0/24
internalsources: 10.1.1.0/24
publicinterfaces: ens33 ens37
综合实验1:配置防火墙
实验要求
- 10.1.8.0/24 关联到 work
- 10.1.1.0/24 关联到 internal
- ens33 ens37 关联到 public
- 设置 public 为默认 zone
- 可以通过 10.1.8.10 地址访问 web 服务,禁止访问 ssh 服务
- 可以通过 10.1.1.10 地址访问 ssh 服务,禁止访问 web 服务
配置过程
准备 web 服务
[root@server ~ 21:18:13]# yum install -y nginx
[root@server ~ 21:18:28]# systemctl enable nginx.service --now
配置默认zone
[root@server ~ 21:18:39]# firewall-cmd --set-default-zone=public
配置 source
--permanent
设置持久化规则
[root@server ~ 21:19:28]# firewall-cmd --permanent --add-source=10.1.8.0/24 --zone=work
success
[root@server ~ 21:19:37]# firewall-cmd --permanent --add-source=10.1.1.0/24 --zone=internal
success
--reload
重新加载规则,也就是使用 --permanent
设置的规则,原先未加 --permanent
设置的规则则失效。
[root@server ~ 21:20:22]# firewall-cmd --reload
success
[root@server ~ 21:20:32]# firewall-cmd --get-active-zones
worksources: 10.1.8.0/24
internalsources: 10.1.1.0/24
publicinterfaces: ens33 ens37
配置 work zone
[root@server ~ 21:20:52]# firewall-cmd --add-service=http --permanent --zone=work
[root@server ~ 21:20:59]# firewall-cmd --remove-service=ssh --permanent --zone=work
[root@server ~ 21:21:05]# firewall-cmd --reload
配置 internal zone
[root@server ~ 21:21:59]# firewall-cmd --add-service=ssh --permanent --zone=internal
[root@server ~ 21:22:07]# firewall-cmd --remove-service=http --permanent --zone=internal
[root@server ~ 21:22:17]# firewall-cmd --reload
设置默认zone 禁止 ssh访问
[root@server ~ 21:22:30]# firewall-cmd --remove-service=ssh --permanent
[root@server ~ 21:22:37]# firewall-cmd --remove-service=ssh
通过 port 放行 http 服务
[root@server ~ 21:22:37]# grep http /etc/services |head -n 5http://www.iana.org/assignments/port-numbershttp 80/tcp www www-http # WorldWideWeb HTTP
http 80/udp www www-http # HyperText Transfer Protocol
http 80/sctp # HyperText Transfer Protocol
https 443/tcp # http protocol over TLS/SSL[root@server ~ 21:23:41]# firewall-cmd --remove-service=http --permanent --zone=work
[root@server ~ 21:24:26]# firewall-cmd --add-port=80/tcp --permanent --zone=work
[root@server ~ 21:24:33]# firewall-cmd --reload
综合实验2:配置防火墙
实验要求
-
配置client网络
-
配置client网关为server(10.1.1.10),设置防火墙允许client访问公网
-
配置客户端访问 10.1.8.10:1022 端口,转发到 10.1.1.11:22
-
配置 client 网络:网卡模式为vmnet1,ip地址为10.1.1.11,网关为10.1.1.10
配置过程
- 配置client网络
[root@client ~ 21:41:42]# nmcli connection modify ens33 ipv4.addresses 10.1.1.11/24 ipv4.gateway 10.1.1.10
[root@client ~ 21:42:00]# nmcli connection up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
[root@client ~ 21:42:05]# nmcli connection
NAME UUID TYPE DEVICE
ens33 4dd56f90-92f5-486f-9055-ba5a4c2ff049 ethernet ens33
[root@client ~ 21:42:09]# ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
ens33 UP 10.1.1.11/24 fe80::20c:29ff:fe55:a3e4/64
- 配置防火墙开启masquerade功能,也就是SNAT,允许client访问公网
[root@server ~ 21:27:28]# firewall-cmd --add-masquerade --zone=public
[root@server ~ 21:27:37]# firewall-cmd --add-masquerade --zone=public --permanent
此时client可以ping通1.1.1.1
- 配置防火墙开启端口转发功能,也就是DNAT,将10.1.8.10:1022 端口,转发到 10.1.1.11:22
[root@server ~ 21:28:06]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11
[root@server ~ 21:28:20]# firewall-cmd --add-forward-port=port=1022:proto=tcp:toport=22:toaddr=10.1.1.11 --permanent
ssh服务 扩展知识:
默认情况 客户端连ssh服务的时候,ssh服务器会解析自己的主机名对应的ip地址。