![高级 NAT - 将 PAT 与 NAT 混合](https://linux22.com/image/617835/%E9%AB%98%E7%BA%A7%20NAT%20-%20%E5%B0%86%20PAT%20%E4%B8%8E%20NAT%20%E6%B7%B7%E5%90%88.png)
我刚刚将 Ubuntu Server 配置为具有 NAT/PAT 的路由器,并且正在尝试执行以下操作:
我在一所学校工作,学校将整个网络划分为多个通过路由器连接的小型网络。我需要创建一个在某个房间的内部网络上可见的 IP 地址,以便将所有流量转发到外部 IP 地址。
为了解释一下,这是配置:
NAT 外部:eth1 - 192.168.1.254/24
NAT 内部:br0 - 192.168.2.10,启用伪装
我需要为 br0 创建一个类似 192.168.2.1 的地址,它会将所有流量转发到 ip 192.168.1.1,并且看起来好像该 IP 直接连接到网络,但不会启用伪装。
基本思路是将路由器 br0 的地址设置为 192.168.2.10,同时将 br0 设置为另一个不伪装的地址,并将所有流量转发到 192.168.1.1,即主路由器的地址。这样做的原因是 br0 是物理网络和 VPN 之间的桥梁,可以从路由器后面访问,该路由器的地址与目标 NAT IP 地址相同 - 192.168.1.1。由于我无法保证客户端始终可以发出“route add”命令,因此我需要一种方法来规避这种情况。
我发现了如何为 br0 配置辅助 IP 地址,并且我已将 br0:1 配置为 192.168.2.1,但似乎无法将所有流量转发到 192.168.1.1。
我提前感谢您的帮助。
答案1
如果我理解正确的话,您尝试执行的操作实际上是一种涉及 NAT 的策略路由形式。听起来您只是想为该子网上特定路由子网之外的某个主机创建别名。
您可以创建 DNAT 规则,而无需相应的 SNAT(或伪装)。不这样做的原因仅仅是大多数 NAT 旨在解决连接问题,即 NAT“内部”的地址无法从“外部”路由。如果主机 192.168.1.1 实际上有一条返回 192.168.2.0/24 或任何其他地址的路由,如果我没记错的话,您确实可以设置 DNAT 规则:
iptables -t nat -A PREROUTING -s 192.168.2.0/24 -d 192.168.2.1 -j DNAT --to 192.168.1.1
现在,暂停一下,先不要这么做。
当 192.168.2.1 是目标地址时,这种方法有效(并且会产生一个奇怪的怪癖,即回复流量的地址与原始目标不同)。从您的描述来看,我认为这不是您想要做的,尽管我真的不确定。如果 192.168.2.1 主机应该充当路由器而不是目标,那么执行 DNAT 根本无济于事。如果它应该充当路由器,NAT(或 PAT)根本无济于事。
听起来好像您有 VPN 流量进入,最终桥接到此子网 192.168.2.0/24(如果我没有看错,并且按原样填写了空格),并且需要通过此网关 192.168.1.1 到达外部世界或其某个子集。在这种情况下,要做的是只需将 192.168.2.1/24(我想你已经将其设置为 VPN 客户端上的默认网关)分配给你的路由器,确保已启用转发,一切就绪 - VPN 客户端无需担心下一跳是否为 192.168.1.1,就像其原始默认非 VPN 网关(家庭网关?)一样;在数据包传输时,它们完全不知道这一点。ISP 始终将这种方案与 RFC1918 地址结合使用,以避免浪费意外稀缺的可路由地址;路径上的所有路由器都不需要具有唯一的地址(尽管如果它们具有唯一的地址,则会使故障排除变得容易得多)。这里的技巧是 TCP 连接的端点不需要知道除下一跳的 IP 地址之外的任何信息。
如果您已经这样做了,但遇到了问题,请检查返回路径。很有可能您的网关 192.168.1.1 在将这些地址的流量发送到 NAT 之外时没有对这些地址进行 NAT(它仍然会将其视为 192.168.2.0/24),正在对它们进行防火墙保护,或者没有返回 192.168.2.0/24 的适当路由。
如果我对你的两点理解有误,还有第三件事可能会对你有所帮助。在 iptables 中指定网关的唯一方法是使用 TEE 目标,它会克隆数据包并将克隆的数据包不加改变地路由到某个任意主机。不过,你需要以某种方式处理未克隆的数据包。该目标可以添加到 mangle PREROUTING 链中:
iptables -t mangle -A PREROUTING -s 192.168.2.0/24 -j TEE --gateway 192.168.1.1
这样做很奇怪;它旨在记录流量,而不是路由流量。我想您可以在 iptables 的某个后续阶段处理原始数据包,尽管这只会造成混乱,我真的不推荐这样做。
顺便说一句,您可以使用该ip addr add
命令向接口添加其他 IP 地址。不要使用 net-tools (ifconfig);它很古老,缺少许多功能,从长远来看只会给您带来麻烦。