努力
加油

如何在腾讯云Debian服务器上配置iptables防火墙?

在腾讯云(CVM)上使用 Debian 系统配置 iptables,核心逻辑其实就两步:内核层放行 + 云平台安全组放行。很多人只配了 iptables 忘了安全组,或者反过来,结果就是“明明规则写对了,还是连不上”。

下面我把最稳妥、生产环境常用的流程拆解一下。注意,Debian 10/11/12 默认可能没装 iptables 命令,而是用 nftables 作为后端,但为了兼容性和习惯,我们通常还是安装 iptables 包并手动管理。

第一步:前置检查与依赖安装

登录服务器后,先确认环境。

# 更新源
apt update

# 安装 iptables 工具
apt install iptables -y

# 确认版本
iptables --version

注意:Debian 10+ 默认使用 nftables 作为 iptables 的后端。如果你执行 iptables 命令,它会自动转发给 nft。这没问题,但你要知道底层其实是 nft。如果你想彻底切换回 legacy iptables,需要执行 update-alternatives --set iptables /usr/sbin/iptableslegacy,但一般没必要,保持默认即可。

第二步:理解腾讯云的双重防火墙机制

这是最容易踩坑的地方。腾讯云的 VPC 网络模型下,流量经过两个关卡:

  1. 云安全组(Security Group):位于虚拟化层,是入口的第一道门。如果安全组没开 22 端口,数据包根本到不了操作系统内部,iptables 再厉害也没用。
  2. 主机防火墙(iptables/firewalld):位于操作系统内核层,是第二道门。用于更细粒度的控制(比如限制 IP、限制连接数等)。

最佳实践原则:安全组只开必要的业务端口(如 80, 443, 22),iptables 做精细化控制和防御。

第三步:配置 iptables 规则(实操)

1. 备份现有规则(救命稻草)

在修改任何规则前,务必备份。万一配错了把自己锁在外面,你可以去腾讯云控制台通过“VNC 远程连接”进入救援,恢复备份。

cp /etc/iptables/rules.v4 /etc/iptables/rules.v4.bak

2. 设置默认策略(Deny All)

出于安全考虑,建议默认拒绝所有入站流量,只允许特定流量。

# 清空现有规则
iptables -F
iptables -X

# 设置默认策略:INPUT 和 FORWARD 丢弃,OUTPUT 允许(出方向一般不需要太严格,除非你有特殊需求)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

3. 添加关键规则(按顺序执行)

重要:规则是有顺序的,从上到下匹配,命中即停止。

# 1. 允许本地回环接口(localhost)通信,很多服务依赖这个
iptables -A INPUT -i lo -j ACCEPT

# 2. 允许已建立和相关连接的返回流量(状态检测,性能优化关键)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. 允许 SSH (22端口) - 仅限你的固定 IP,或者如果你没有固定IP,先全开但建议尽快改
# 假设你希望允许所有 IP 连接 SSH(测试期),生产环境请替换为你的跳板机 IP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. 允许 HTTP (80) 和 HTTPS (443)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 5. 可选:ICMP Ping 允许(方便排查网络连通性)
iptables -A INPUT -p icmp -j ACCEPT

# 6. 可选:允许 DNS 查询(如果你的服务器需要解析域名)
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p tcp --sport 53 -j ACCEPT

4. 防止 SSH 被暴力破解(进阶)

如果你不想暴露 SSH 给所有人,可以加一个简单的速率限制:

# 每分钟最多新建 5 个 SSH 连接,超过则丢弃
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT --reject-with tcp-reset

第四步:保存规则(持久化)

Debian 不像 CentOS 有 service iptables save。你需要将当前规则保存到文件,并确保开机自动加载。

方法一:使用 iptables-persistent 包(推荐,简单稳定)

apt install iptables-persistent -y

# 此时它会提示你是否保存 IPv4 和 IPv6 规则,选 Yes
# 或者手动保存:
netfilter-persistent save

这样重启后,规则会自动从 /etc/iptables/rules.v4 加载。

方法二:脚本方式(适合喜欢 DIY 的人)

编辑 /etc/network/if-up.d/iptables-restore(需创建该文件并赋予执行权限),写入:

#!/bin/sh
iptables-restore < /etc/iptables/rules.v4

然后确保 /etc/iptables/rules.v4 是你刚才配置好的内容。你可以用 iptables-save > /etc/iptables/rules.v4 来生成这个文件。

第五步:配置腾讯云安全组(控制台操作)

回到腾讯云控制台 -> CVM 实例 -> 安全组 -> 入方向规则。

必须添加的规则:

  • 协议: TCP
  • 端口: 22
  • 来源: 你的公网 IP(或 0.0.0.0/0,如果测试的话)
  • 策略: 允许

建议添加的规则:

  • 协议: TCP
  • 端口: 80, 443
  • 来源: 0.0.0.0/0
  • 策略: 允许

警告:如果你在 iptables 里 DROP 了 22 端口,而安全组也没开 22,你就彻底失联了。所以,先在安全组开放 22,测试 iptables 生效后再收紧 iptables 的 SSH 规则。

第六步:验证与排错

  1. 查看当前规则:

    iptables -L -n -v

    检查 packets 和 bytes 计数是否在增长,说明规则生效了。

  2. 测试连通性:
    从另一台机器 SSH 到你的服务器。如果成功,说明规则正确。

  3. 如果断连了怎么办?

    • 立即去腾讯云控制台,找到实例,点击 “更多” -> “密码/密钥” -> “远程连接”(VNC 方式)。
    • VNC 不经过网络栈,直接连接虚拟机控制台。
    • 登录后,执行 iptables -F 清空所有规则,恢复访问。
    • 重新谨慎配置。

常见坑点总结

  1. SSH 断开后无法重连:因为你在输入 iptables -P INPUT DROP 后,还没添加 SSH 允许规则就执行了。解决方法:不要直接设默认 DROP,而是先添加允许规则,最后再设默认 DROP。或者使用 watch 命令监控,或者用一个定时任务在几分钟后自动重置规则(仅用于紧急调试,生产环境慎用)。
  2. IPv6 问题:Debian 默认可能启用 IPv6。如果你只配了 IPv4 的 iptables,IPv6 流量可能被默认丢弃。如果需要 IPv6,记得配置 ip6tables 同样规则,或者在安全组中关闭 IPv6。
  3. 云厂商的 SNAT/DNAT:如果你做了端口映射,iptables 的 PREROUTING 链要配合使用。但在腾讯云内网环境下,通常由云负载均衡(CLB)或 NAT 网关处理,主机 iptables 较少涉及 DNAT。
  4. UFW vs iptables:Debian 用户常问要不要用 UFW。UFW 是 iptables 的前端,配置更简单。如果你不熟悉 iptables 语法,可以考虑 ufw enable。但对于生产环境,尤其是需要复杂规则时,直接用 iptables 更透明、可控。

最终建议

对于大多数中小型项目,“安全组放行业务端口 + iptables 做基础防护(如防扫描、限频)” 是最平衡的方案。不要过度依赖 iptables 做所有事情,云安全组才是第一道防线,且更容易管理。

记住:配置防火墙前,永远先备份;修改规则时,永远留一条后路(如 VNC 访问)。