云服务商元数据访问阻断,iptables禁止访问169
在云服务器上,169.254.169.254 是云服务商提供的实例元数据服务地址,里面通常包含临时密钥、实例 ID、内部网络信息等敏感数据。
一旦应用存在 SSRF 漏洞,攻击者就可能通过这个地址拿到高权限凭证。
所以很多安全基线都要求:用 iptables 禁止访问 169.254 地址段,从源头阻断元数据访问。
本文直接用命令演示,零基础也能照做。
动手前需要确认的三件事
第一,确认你要阻断的方向。 如果你的服务器需要向外提供 Web 服务,并担心外部请求利用 SSRF 跳转访问元数据,那重点阻断 OUTPUT 链即可,因为服务器发起的请求都要经过这个链。
如果内网还有其他机器可能直接访问这台服务器的 169.254 地址,可以顺手把 FORWARD 链也加上。
第二,确认 iptables 是否可用。 执行下面命令:
iptables -L -n
能正常输出规则列表就说明已经安装可用。
如果提示 command not found,需要先安装 iptables,不同系统安装命令不同:
# CentOS / RHEL
yum install -y iptables
# Ubuntu / Debian
apt install -y iptables
第三,确认你的云厂商元数据地址。 主流云厂商都使用 169.254.169.254,但个别私有云或 VPC 环境可能使用其他链路本地地址。
为了稳妥,可以直接对整个 169.254.0.0/16 网段做拦截,这样既能覆盖全部可能地址,也避免漏网。
用 iptables 禁止访问 169.254 地址段
1. 查看当前规则,避免冲突
先看一眼现有规则,防止之前已经配置过相关放行:
iptables -L OUTPUT -n -v
iptables -L FORWARD -n -v
如果已经存在 ACCEPT 规则允许访问 169.254,而且优先级更高,那么你新加的 DROP 规则可能不会生效。
后续操作时要注意插入位置。
2. 添加拦截规则
在 OUTPUT 链最前面插入规则,禁止本机访问整个 169.254 网段:
iptables -I OUTPUT -d 169.254.0.0/16 -j DROP
如果还需要同时阻断转发流量(防止其他机器通过这台服务器跳板访问),再加一条:
iptables -I FORWARD -d 169.254.0.0/16 -j DROP
如果你只希望阻断 169.254.169.254 这一个元数据地址,可以更精准:
iptables -I OUTPUT -d 169.254.169.254/32 -j DROP
注意:这里的 -I 是把规则插入到链的最前面。 如果之前有 ACCEPT 规则放行了这个地址,使用 -I 仍然可以优先拦截。
如果你希望恢复访问,把 -D 换成 -D 即可删除对应规则。
3. 验证规则是否生效
查看规则列表:
iptables -L OUTPUT -n --line-numbers
你会看到类似这一条:
1 DROP all -- 0.0.0.0/0 169.254.0.0/16
然后尝试访问元数据地址:
curl --connect-timeout 3 http://169.254.169.254/latest/meta-data/
正常情况下,curl 会一直卡住直到超时,不会返回任何内容。
如果能看到数据,说明规则没有生效,需要检查是否插入到了正确位置,或者 iptables 规则顺序有问题。
让规则重启后依然生效
iptables 规则默认保存在内存中,服务器重启后会被清空。
根据不同系统,用不同方式保存:
CentOS / RHEL 7+:
iptables-save > /etc/sysconfig/iptables
Ubuntu / Debian:需要先安装 iptables-persistent:
apt install -y iptables-persistent
netfilter-persistent save
保存后建议重启一下 iptables 或直接重启服务器测试。
如果你用的是宝塔面板等运维工具,也可以在面板的“安全”功能中添加入站/出站规则,但原理一致,核心还是保证规则持久化。
避坑指南:不要只加规则就算完事
坑 1:阻断后影响正常业务。 某些云产品的初始化脚本、监控组件、验证 Token 的插件会请求元数据服务,比如阿里云云监控、腾讯云自动化助手。
你阻断整个 169.254 网段后,这些组件可能会报错或拉取不到配置。建议在阻断前先检查服务器上是否有依赖云元数据的服务,如果确实需要,可以只阻断 169.254.169.254 的特定端口,或把这些服务的源 IP 加白名单。
坑 2:误删规则导致风险暴露。 排查时建议先执行 iptables -L -n --line-numbers 看清楚规则编号,再用 -D 删除,不要手动清空链。
坑 3:只配 OUTPUT 链不够。 如果你的场景是防护外网 SSRF,通常只需要 OUTPUT 链;
但如果这台服务器同时作为内网网关,流量会走 FORWARD 链,两条链都要加。
判断方法很简单:在你的服务器上执行 curl 测试的是 OUTPUT,从内网其它机器通过这台服务器访问元数据测试的是 FORWARD。
坑 4:IPv6 地址同样需要处理。 部分云厂商的元数据服务也支持 IPv6 访问,比如 AWS 的 fd00:ec2::254。
如果你需要彻底阻断,还要在 ip6tables 里加对应规则:
ip6tables -I OUTPUT -d fd00:ec2::254/128 -j DROP
不过目前国内主流云厂商仍以 IPv4 为主,你可以按需配置。
结果验证与判断标准
配置完成后,最终效果可以用三句话验证:
iptables -L OUTPUT -n能看到对169.254.0.0/16的 DROP 规则。curl http://169.254.169.254/latest/meta-data/无法返回任何数据,显示连接超时或拒绝。- 业务系统不受影响,云监控等依赖元数据的功能若出现异常,则按上面坑 1 的处理方式调整。
如果你正在处理云服务商元数据访问阻断的需求,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先检查规则顺序、持久化配置和依赖元数据的系统组件。
对于使用了宝塔或其他面板的机器,记得确认面板自身的防火墙组件是否会覆盖 iptables 规则,避免两者冲突导致配置不生效。