Debian防火墙禁止国外IP访问:全面指南(2025年更新)

在当今复杂的网络环境中,保护服务器安全是每个系统管理员和开发者的重要任务。对于部署在公网上的Debian系统,来自境外的恶意扫描、暴力破解和攻击行为屡见不鲜。因此,通过配置防火墙禁止国外IP访问,只允许中国大陆或特定地区的流量,是一种高效且实用的安全策略。

Debian防火墙禁止国外IP访问:全面指南(2025年更新)

本文将详细介绍如何在 Debian 12 系统中,利用现代防火墙工具 nftables 实现“只允许国内IP,封禁所有境外IP”的安全配置,帮助您显著提升服务器的抗攻击能力。


为什么选择 nftables?

自 Debian 10 起,nftables 已逐步取代传统的 iptables 成为默认的防火墙框架。相比 iptables,nftables 具有更简洁的语法、更高的性能和更强的可扩展性,尤其适合处理大规模IP地址集合(如国家IP段)。

提示:虽然 ufw(Uncomplicated Firewall)对初学者更友好,但在处理复杂的地理IP过滤时,直接使用 nftables 更加灵活高效。


实现原理:基于GeoIP的IP地址过滤

要封禁国外IP,核心思路是:

  1. 获取中国大陆(CN)的官方IPv4地址段列表。

  2. 在防火墙中创建一个“中国IP集合”。

  3. 配置规则:只允许该集合内的IP访问服务器,其余所有IP一律拒绝

我们将使用 MaxMind 的 GeoLite2 数据库来获取最新的IP地理信息。


详细配置步骤(Debian 12 + nftables)

第一步:安装并启用 nftables

# 更新系统包列表
sudo apt update

# 安装 nftables(Debian 12 通常已预装)
sudo apt install nftables

# 启用并启动服务
sudo systemctl enable nftables
sudo systemctl start nftables

第二步:获取中国大陆IP地址段

  1. 访问 MaxMind 官网(https://www.maxmind.com)注册账号。

  2. 获取免费的 GeoLite2 City 数据库下载链接(需申请 License Key)。

  3. 使用 wget 或 curl 下载数据库(.mmdb 格式)。

🔧 替代方案:可使用开源项目如 17mon/china_ip_list 提供的纯文本IP段列表,简化处理流程。

第三步:生成中国IP集合

安装辅助工具 iprange 来处理IP段:

sudo apt install iprange

假设你已将中国IP列表保存为 cn.txt,每行一个CIDR地址(如 1.0.4.0/22),可通过以下命令生成 nftables 可用的格式:

# 生成格式化IP元素列表
sed 's/^/#CN_IPV4_ELEMENTS#/g' cn.txt > elements.txt

第四步:编写 nftables 配置文件

编辑 /etc/nftables.conf

sudo cp /etc/nftables.conf /etc/nftables.conf.bak  # 备份原文件
sudo nano /etc/nftables.conf

替换为以下内容:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    # 定义中国大陆 IPv4 地址集合
    set cn_ips {
        type ipv4_addr
        flags interval
        elements = {
            # 此处粘贴从 cn.txt 生成的 IP 段列表
            # 例如:
            1.0.4.0/22,
            1.0.8.0/24,
            1.0.9.0/24,
            # ... 更多IP段
        }
    }

    # 定义局域网地址(可选)
    set lan_ips {
        type ipv4_addr
        flags interval
        elements = { 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12 }
    }

    chain input {
        type filter hook input priority 0; policy drop;

        # 允许本地回环接口
        iifname "lo" accept

        # 允许已建立的连接
        ct state established,related accept

        # 允许局域网访问
        ip saddr @lan_ips accept

        # 允许中国大陆IP访问(关键规则)
        ip saddr @cn_ips accept

        # 可选:允许特定端口(如SSH)仅对中国IP开放
        # tcp dport 22 ip saddr @cn_ips accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

⚠️ 注意:请将 # 此处粘贴... 部分替换为实际的中国IP段列表,每行以逗号结尾。

第五步:加载并启用规则

# 停止 nftables 服务
sudo systemctl stop nftables

# 清空临时规则
sudo nft flush ruleset

# 启动并加载配置文件
sudo systemctl start nftables

# 查看当前规则
sudo nft list ruleset

验证与测试

  1. 本地测试:使用国内手机4G网络或家庭宽带访问服务器,确认SSH、Web服务等正常。

  2. 远程测试:可通过境外VPS尝试 ping 或 telnet 目标端口,应无法连接。

  3. 日志监控:查看 /var/log/nftables.log 或使用 dmesg 观察被拒绝的连接。


自动化与维护建议

  • 定期更新IP库:中国IP段会动态调整,建议每月更新一次 cn.txt 并重载规则。

  • 脚本化部署:编写Shell脚本自动下载IP列表、生成配置并重启防火墙。

  • 备用访问通道:配置前请确保有应急管理方式(如云平台VNC),避免误封导致失联。


其他方案对比

方案优点缺点
nftables + GeoIP高效、精准、系统级控制配置复杂,需维护IP库
ufw + 地址集简单易用不原生支持GeoIP,灵活性差
iptables + ipset成熟稳定性能低于nftables,语法复杂

通过在 Debian 系统中配置 nftables 实现“只允许国内IP访问”,是提升服务器安全性的有效手段。虽然初期配置稍显复杂,但一旦部署成功,即可长期自动抵御大量境外恶意流量。

📢 温馨提示:此策略适用于主要服务国内用户的场景。若您有海外业务需求,请谨慎使用,或采用“白名单+端口限制”等更精细化的策略。

发表评论

评论列表

还没有评论,快来说点什么吧~