在腾讯云(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 网络模型下,流量经过两个关卡:
- 云安全组(Security Group):位于虚拟化层,是入口的第一道门。如果安全组没开 22 端口,数据包根本到不了操作系统内部,
iptables再厉害也没用。 - 主机防火墙(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 规则。
第六步:验证与排错
-
查看当前规则:
iptables -L -n -v检查
packets和bytes计数是否在增长,说明规则生效了。 -
测试连通性:
从另一台机器 SSH 到你的服务器。如果成功,说明规则正确。 -
如果断连了怎么办?
- 立即去腾讯云控制台,找到实例,点击 “更多” -> “密码/密钥” -> “远程连接”(VNC 方式)。
- VNC 不经过网络栈,直接连接虚拟机控制台。
- 登录后,执行
iptables -F清空所有规则,恢复访问。 - 重新谨慎配置。
常见坑点总结
- SSH 断开后无法重连:因为你在输入
iptables -P INPUT DROP后,还没添加 SSH 允许规则就执行了。解决方法:不要直接设默认 DROP,而是先添加允许规则,最后再设默认 DROP。或者使用watch命令监控,或者用一个定时任务在几分钟后自动重置规则(仅用于紧急调试,生产环境慎用)。 - IPv6 问题:Debian 默认可能启用 IPv6。如果你只配了 IPv4 的 iptables,IPv6 流量可能被默认丢弃。如果需要 IPv6,记得配置
ip6tables同样规则,或者在安全组中关闭 IPv6。 - 云厂商的 SNAT/DNAT:如果你做了端口映射,iptables 的 PREROUTING 链要配合使用。但在腾讯云内网环境下,通常由云负载均衡(CLB)或 NAT 网关处理,主机 iptables 较少涉及 DNAT。
- UFW vs iptables:Debian 用户常问要不要用 UFW。UFW 是 iptables 的前端,配置更简单。如果你不熟悉 iptables 语法,可以考虑
ufw enable。但对于生产环境,尤其是需要复杂规则时,直接用 iptables 更透明、可控。
最终建议
对于大多数中小型项目,“安全组放行业务端口 + iptables 做基础防护(如防扫描、限频)” 是最平衡的方案。不要过度依赖 iptables 做所有事情,云安全组才是第一道防线,且更容易管理。
记住:配置防火墙前,永远先备份;修改规则时,永远留一条后路(如 VNC 访问)。
云技术博客