如何在内部 IP 空间上使用 iptables 将 IP 伪装(PAT/Overload)与目标 NAT 重叠?
我想要的是私有网络,即10.0.0.0/24
一些公共 IP 被映射到其中的各种地址。但是,如果有来自 10.0.0.0/24 内的连接,无论它是否具有 DNAT 公共 IP,它都会过载到特定的公共 IP。
答案1
我希望我也理解了你的问题。你对卢克在鲍姆加特的回答的评论中的回应让我怀疑我是否理解了你的要求,但我还是要发布这个。
鲍姆加特在回答中告诉你要做的事情是可行的,但他最后一段中提到的“……可能会导致客户端-服务器应用程序出现问题……”是不正确的。他忘记了 Netfilter 的 NAT 实现是有状态的。Netfilter 中 NAT 引擎的状态特性在这里是你的朋友。
当 Internet 主机和您的某个公共 IP 之间的对话被 DNAT 到私有 IP 地址时,Netfilter 不会将来自私有 IP 的响应数据包“伪装”回 Internet 主机。这并不是说响应数据包没有被 NAT,而是它们没有被“伪装”。相反,Netfilter 隐式地“做正确的事情”,并将来自私有 IP 的响应数据包 SNAT 回 Internet 主机发起对话的公共 IP 地址。这真的非常巧妙。
同时,对于从私有 IP 地址发起到互联网的对话(不是响应来自互联网的传入请求),将适用“MASQUERADE”规则。
基本上,Netfilter 可以“开箱即用”地完成您想要的功能。我花了一些时间在测试设置上模拟了这一点,以确保万无一失,只要我正确理解了您的要求,它就能完全满足您的要求。
(抱歉今天早些时候没能回答——我今天早些时候忙着做一些事情,不能像我喜欢的那样玩 Server Fault。)
答案2
我希望我理解了你的问题......
听起来你想有一个从内部网络出站到外部单个 IP 的标准 NAT - 是吗?这部分可以通过以下方式完成:
iptables -t nat -A POSTROUTING -o $EXTERNAL_NIC -j MASQUERADE
至于将公共 IP 映射到内部 IP,这应该对每个 IP 都有效:
iptables -t nat -A PREROUTING -d $EXTERNAL_IP -j DNAT --to $INTERNAL_IP
这将为您提供外部到内部 IP 的单向映射。来自一个公共 IP 的流量将被网络地址转换到内部框,然后它将响应,但响应将通过默认的外部 IP 进行网络地址转换。它可能不是同一个。这可能会导致客户端-服务器应用程序出现问题。