Linux防火墙配置指南:限制特定IP访问并允许其他所有流量
概述
本指南展示如何配置 Linux 防火墙(firewalld),实现仅限制特定IP/网段的访问,同时允许其他所有IP自由访问任意端口的方案。这种配置适用于需要隔离恶意IP但保持其他客户端无限制访问的场景。
完整配置脚本
#!/bin/bash
# ==============================================
# Linux 防火墙配置脚本
# 功能:限制特定IP访问,允许其他所有IP自由访问
# 版本:1.2
# ==============================================# 1. 启动并启用 firewalld 服务
echo "[1/6] 启动并启用防火墙服务..."
sudo systemctl start firewalld
sudo systemctl enable firewalld# 2. 设置默认区域为 trusted(允许所有流量)
echo "[2/6] 配置默认区域为 trusted..."
sudo firewall-cmd --set-default-zone=trusted
echo "默认区域已设置为: $(sudo firewall-cmd --get-default-zone)"# 3. 创建新区域用于管理被禁止的IP
echo "[3/6] 创建 blocked_ips 区域..."
sudo firewall-cmd --permanent --new-zone=blocked_ips
sudo firewall-cmd --reload# 4. 将网络接口分配到 trusted 区域(关键步骤!)
echo "[4/6] 分配网络接口到 trusted 区域..."
# 获取活动接口(自动适配不同服务器)
INTERFACE=$(sudo firewall-cmd --get-active-zones | grep -v '^[[:space:]]' | head -1 | awk '{print $1}')
sudo firewall-cmd --permanent --zone=trusted --change-interface=$INTERFACE
echo "接口 $INTERFACE 已分配到 trusted 区域"# 5. 配置 blocked_ips 区域
echo "[5/6] 配置 blocked_ips 区域规则..."
# 设置区域目标为 DROP(拒绝所有流量)
sudo firewall-cmd --permanent --zone=blocked_ips --set-target=DROP# 添加要禁止的IP或网段(按需修改)
BANNED_IPS=("10.132.0.0/24" "10.0.0.50")
for ip in "${BANNED_IPS[@]}"; do
echo "禁止IP访问: $ip"
sudo firewall-cmd --permanent --zone=blocked_ips --add-source="$ip"
done# 6. 应用配置并验证
echo "[6/6] 应用防火墙配置..."
sudo firewall-cmd --reload# 验证配置
echo -e "\n=== 验证配置 ==="
echo "默认区域: $(sudo firewall-cmd --get-default-zone)"
echo "活动区域:"
sudo firewall-cmd --get-active-zones
echo -e "\n被阻止的IP列表:"
sudo firewall-cmd --zone=blocked_ips --list-all --permanent
关键配置说明
1. 区域策略说明
区域名称 | 目标策略 | 功能描述 |
---|---|---|
trusted | ACCEPT | 允许所有传入和传出流量 |
blocked_ips | DROP | 拒绝指定来源IP的所有流量 |
2. 配置步骤详解
- 启用防火墙服务
启动 firewalld 并设置为开机自启:
sudo systemctl start firewalld
sudo systemctl enable firewalld
- 设置默认区域为 trusted
使所有流量默认被允许:
sudo firewall-cmd --set-default-zone=trusted
注意:此命令无需 --permanent
参数,直接生效且持久化
- 创建专用区域 blocked_ips
用于管理被禁止的IP地址:
sudo firewall-cmd --permanent --new-zone=blocked_ips
sudo firewall-cmd --reload
- 分配网络接口到 trusted 区域
关键步骤:确保网络接口使用正确的区域策略:
# 获取活跃接口(自动适配)
INTERFACE=$(sudo firewall-cmd --get-active-zones | grep -v '^[[:space:]]' | head -1 | awk '{print $1}')
sudo firewall-cmd --permanent --zone=trusted --change-interface=$INTERFACE
- 配置 blocked_ips 拒绝规则
设置区域策略并添加被禁IP:
# 设置DROP策略
sudo firewall-cmd --permanent --zone=blocked_ips --set-target=DROP# 添加被禁IP(支持IP和CIDR网段)
sudo firewall-cmd --permanent --zone=blocked_ips --add-source=10.132.0.0/24
sudo firewall-cmd --permanent --zone=blocked_ips --add-source=10.0.0.50
3. 管理被禁IP的命令
添加新IP到禁止列表:
sudo firewall-cmd --permanent --zone=blocked_ips --add-source=192.168.1.100
sudo firewall-cmd --reload
从禁止列表移除IP:
sudo firewall-cmd --permanent --zone=blocked_ips --remove-source=10.0.0.50
sudo firewall-cmd --reload
禁止整个子网:
sudo firewall-cmd --permanent --zone=blocked_ips --add-source=192.168.2.0/24
sudo firewall-cmd --reload
配置验证方法
- 检查区域配置:
# 查看默认区域
firewall-cmd --get-default-zone# 查看活动区域
firewall-cmd --get-active-zones
- 列出被禁IP:
firewall-cmd --zone=blocked_ips --list-sources
- 测试连接:
# 从被禁IP测试(应失败)
ping -c 4 10.0.0.50# 从其他IP测试(应成功)
ping -c 4 8.8.8.8# 测试端口访问
telnet your-server-ip 22
常见问题解决
1. 配置后无法访问服务器
原因:接口未分配到 trusted 区域
解决:
# 查看接口分配情况
sudo firewall-cmd --get-active-zones# 手动分配接口
sudo firewall-cmd --permanent --zone=trusted --change-interface=eth0
sudo firewall-cmd --reload
2. 被禁IP仍能访问
原因:IP未正确添加到 blocked_ips
解决:
# 检查IP是否在列表
sudo firewall-cmd --zone=blocked_ips --list-sources# 添加后重载
sudo firewall-cmd --permanent --zone=blocked_ips --add-source=problem_ip
sudo firewall-cmd --reload
3. 防火墙规则丢失
原因:未使用 --permanent
参数
解决办法:所有规则变更都应包含 --permanent
参数,变更后执行 sudo firewall-cmd --reload
安全建议
- 定期备份配置:
sudo cp -a /etc/firewalld /etc/firewalld-backup-$(date +%F)
- 监控被阻止的IP:
# 查看实时阻止日志
sudo journalctl -u firewalld -f | grep DROP
- 结合堡垒机使用:
- 将堡垒机IP加入白名单
- 其他管理访问通过堡垒机跳转
重要提示:trusted 区域会允许所有流量,仅推荐在内网环境或测试环境中使用。面向公网的服务器应使用更严格的默认策略(如 public 区域)。