给服务器配置firewalld服务,启动服务没有报错,但是查看服务状态是没拉起来的
报错: ERROR: Failed to read file "/proc/sys/net/netfilter/nf_conntrack_helper": [Errno 2] No such file or directory: '/proc/sys/net/netfilter/nf_conntrack_helper'
然后在
kernel - Centos 7 Firewall Defaultly Not Working - Unix & Linux Stack Exchange
中找到了一个解决办法(我也不知道引起这个的原因是什么,用下面的指令可以解决该报错)
depmod
systemctl restart firewalld
防火墙策略配置
不知道为什么我的访问策略设置了之后,要么就所有的ip都可以访问,要么就大家都不可以访问
比如我本机ip是:192.168.0.1;服务器的ip是:192.168.0.100
我配置了的语句是
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.0.1' port port='22' protocol='tcp' accept"
单这一句的话,我自己的机器可以访问服务器,但是隔壁的 192.168.0.2机器也可以访问服务器
然后在网上看了之后又加了一句“拦截所有对22端口的访问”
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" reject
网上查到说:这句要放在放行那句的后面,因为防火墙的策略是从上往下的
但是添加了这条之后我的本机也不能访问服务器了…
于是弃用了这个方法,改用别的方法,见下文
Zone的概念
这篇文章中介绍了zone的概念(以下内容引用于上面的两篇文章)
- firewalld提供了9个zone:
- drop 任何流入的包都被丢弃,不做任何响应。只允许流出的数据包。
- block 任何流入的包都被拒绝,返回icmp-host-prohibited报文(ipv4)或icmp6-adm-prohibited报文(ipv6)。只允许由该系统初始化的网络连接
- public 默认的zone。部分公开,不信任网络中其他计算机,只放行特定服务。
- external 只允许选中的服务通过,用在路由器等启用伪装的外部网络。认为网路中其他计算器不可信。
- dmz 允许隔离区(dmz)中的电脑有限的被外界网络访问,只允许选中的服务通过。
- work 用在工作网络。你信任网络中的大多数计算机不会影响你的计算机,只允许选中的服务通过。
- home 用在家庭网络。信任网络中的大多数计算机,只允许选中的服务通过。
- internal 用在内部网络。信任网络中的大多数计算机,只允许选中的服务通过。
- trusted 允许所有网络连接,即使没有开放任何服务,那么使用此zone的流量照样通过(一路绿灯)。
白名单配置
1、配置信任源
# 添加 IP 地址范围到 "trusted" 的区域
# firewall-cmd --permanent --zone=trusted --add-source=10.60.22.0/24 这条的文章里的firewall-cmd --permanent --zone=trusted --add-source=192.168.0.1
# 删除IP
firewall-cmd --permanent --zone=trusted --remove-source=192.168.0.1
2、配置默认拒绝
# 将默认的防火墙区域设置为 "drop",drop区域会把所有的包丢弃,但是trusted区域优先级会更高就不会被丢弃
firewall-cmd --set-default-zone=drop
# 将网络接口 eth0 分配给 "drop" 区域
firewall-cmd --permanent --zone=drop --change-interface=eth0
3、重新加载防火墙配置
firewall-cmd --reload
firewall-cmd --get-active-zones
配置成功应该得到如下结果
drop
interfaces: eth0
trusted
sources: 192.168.0.1
现在测试,就可以让白名单中的ip正常访问了 。
#!/bin/bash
# 定义一个数组,保存所有要放行的IP地址范围
trusted_sources=(
"10.60.22.0/24"
"10.60.23.0/24"
)
# 遍历数组,添加 IP 地址范围到 "trusted" 区域
for ip in "${trusted_sources[@]}"; do
firewall-cmd --permanent --zone=trusted --add-source="$ip"
done
# 配置默认拒绝
firewall-cmd --set-default-zone=drop
# 将网络接口 eth0 分配给 "drop" 区域
firewall-cmd --permanent --zone=drop --change-interface=eth0
# Reload 防火墙
firewall-cmd --reload
# 显示当前活动的防火墙区域
firewall-cmd --get-active-zones
到这里我还不明白为什么一开始给public配置的策略不生效
下面是一个脚本,用来配置firewalld,放行指定ip访问指定端口(emmm不好用,建议不用)
#!/bin/bash
# 启动 firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 定义一个包含允许访问的IP地址的数组
ALLOWED_IPS=("192.168.1.1" "192.168.1.2" "192.168.1.3") # 添加更多 IP 地址到数组中
# 遍历数组并为每个 IP 地址添加防火墙规则
for IP in "${ALLOWED_IPS[@]}"; do
echo "Allowing access from $IP to ports 3306 and 22..."
# 允许 IP 访问 3306 端口
sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$IP' port port='3306' protocol='tcp' accept"
# 允许 IP 访问 22 端口
sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$IP' port port='22' protocol='tcp' accept"
done
# 拒绝所有其他 IP 对 3306 端口的访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" reject'
# 拒绝所有其他 IP 对 22 端口的访问
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" reject'
# 重新加载 firewalld 以应用更改
sudo firewall-cmd --reload
# 显示当前配置以供验证
sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
echo "Firewalld configuration completed."