事情本身不复杂,线索都在日志里。机房自建网关做端口映射,公网用户访问正常,可内网机器用域名解析到的公网 IP 访问同一服务时一直超时,换成内网地址就通。

第一反应是「云上 NAT 网关不处理同 VPC 内访问 EIP 的回环流量」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。DNAT 只改写目的地址,内网发起时回程包没再经过网关出门。另一种情况是缺少对内网源地址做 SNAT 的回环规则,回包被送到内网机器自己。

还有一种情况,安全组只放行了公网来源,内网源地址被拒。

先在内网机器上复现并抓包

curl -sv --max-time 5 http://203.0.113.20/health

接着看网关上的 DNAT 和 SNAT 规则

iptables -t nat -S | grep -E 'DNAT|SNAT|MASQUERADE'

补一条内网访问时的 SNAT 回环规则

iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -d 10.0.0.5 -j MASQUERADE

从内网再次访问验证

curl -s -o /dev/null -w '%{http_code}\n' http://203.0.113.20/health

怎么算真的好了,看的是同一批现象。内网机器访问公网地址返回 200,网关的 conntrack 里能看到双向会话,服务端日志里的来源地址是网关内网口。

补一句。回环规则要限定源和目的网段,别写成全量 MASQUERADE;云上更推荐内网走内网地址,域名做内外网分离解析。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189