为什么到 127.0.0.1 的 DNAT 需要特别小心
了解在把外部流量重定向到绑定于回环地址的代理组件时 route_localnet 的作用。
某个服务监听在 127.0.0.1:1080 上。一条 DNAT 规则把进入的流量指向该地址,但连接仍然失败。服务可能是健康的,NAT 规则也可能命中:IPv4 的回环地址在路由上有特殊处理。
Linux 的 route_localnet 决定路由时是否把 127/8 地址当作火星地址。其默认值保留了通常的回环边界。针对某个接口的例外,对于刻意设计的本地重定向方案可能是相关的。
这就解释了为什么在另一台机器上可用的规则,可能依赖一个你并未复制的 sysctl。但这不构成在所有地方都开启该选项的理由。
安全假设随路由而改变
绑定到回环地址常常是因为某个辅助组件没有独立的客户端认证。如果来自其他接口的流量可以被路由到它,那么仅凭绑定地址已不再能描述可达的受众。请在实际规则集中限制入站来源、目的地址和端口,并在相关时把声称回环源或目的地址的流量也纳入考虑。
请检查包含该服务的网络命名空间。容器的回环不是主机的回环,修改主机接口设置并不会自动在容器内创建监听者。
rp_filter 回答的是关于源路径校验的另一个问题。全局关闭它并不是理解回环路由的通用替代。同样,ip_nonlocal_bind 涉及把套接字绑定到非本地地址,而不是让这条 DNAT 路径变正确。
最后,被重定向的协议必须与监听方匹配。把原始 HTTP 或 TLS 流量发往 SOCKS 端口,仍然需要转换器;路由例外无法提供缺失的协商。