我有一个 VPN 线卫虚拟接口wg0
(可以是其他任何接口)和一个物理接口eth0
。我想将数据包从 VPN 路由到 LAN,或者从一个接口路由到另一个接口。
几乎所有博客、文章、教程都建议使用MASQUERADE
或Source NAT
仅使用:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
而且,IP masquerade
只是一个SNAT(源NAT),它不会改变源端口。
主机生成并从wg0
(或任何其他虚拟/物理接口)转发的数据包之间可能存在(源端口)冲突。恕我直言,必须使用 NAPT 来避免这些冲突。
您在某种程度上错误地区分了SNAT/MASQUERADE
和NAPT/PAT
。它不在那里。
在 Linux 中,有两种类型的动态 NAT 规则,都称为“NAPT”:
SNAT
和MASQUERADE
。它们之间的区别在于,使用 SNAT 时,您需要在规则中指定要转换为哪个地址(以及可能要使用的端口范围),而使用 MASQUERADE 时,它会根据数据包的接口自行做出选择注定要出口。POSTROUTING
在进行大多数其他处理(包括数据包的路由)之后,它们都将被安装到链中。这种类型的规则用于允许许多计算机隐藏在单个出口IP 地址后面,例如通过LAN 访问Internet 等。如果您打算通过 VPN 访问互联网,这也包括任何 VPN 用户。DNAT
,,可能REDIRECT
还有CLUSTERIP
其他一些,我不记得了;这些被安装到PREROUTING
链中,因为路由决策通常应该在规则的影响下改变。最初发往机器本身(将其地址作为目的地)并要遍历INPUT
并到达某个本地进程的数据包正在被转换,并且在遍历FORWARD
链之后,它被进一步转发到某个其他系统。或相反亦然。去哪里,INPUT 或 FORWARD,是我们必须根据规则更改的路由决策。此类规则用于从 Internet 访问某些内部系统。顺便说一句,有时,两个规则都可能用于单个数据包(和连接)。这是特殊情况,但如果您需要来自某个外部系统的数据包(因此必须在 PREROUTING 中使用 DNAT)显示为来自某个内部地址(在 POSTROUTING 中使用 SNAT),则很有用。
Linux中还有静态NAT类型的规则,NETMAP
这种规则比较特殊,很少使用。我怀疑您是否在谈论它,并且您是否看过任何提及此类规则的指南。
Linux完全不区分私有地址 (RFC1918) 和公共地址。如果需要,您可以对公有子网进行 NAT(但这会浪费地址)。您可以保留私有 IP 而不进行转换(但这通常会导致它们无法连接互联网)。
VPN只不过是机器中的附加网络接口,应该这样对待。因此,如果您有公共地址,则可以使用 VPN 的公共地址。例如,我可能有一些 /29 子网由 VPN 路由器路由到并设置 OpenVPN,因此整个公共子网将是我的 VPN 网络!虽然 OpenVPN 示例看起来很人为,但 WireGuard更有可能是这样配置的。例如,新的命名空间解决方案允许wireguard成为系统中的唯一接口。如果系统需要直接拥有公共IP(我不会讨论此要求可能来自的任何原因),那么您最终将不可避免地在VPN内使用公共IP!最有可能的是,他们没有任何 NAT。
如果目标可以将其流量路由到源,则不需要 NAT 或 PAT。
例如,如果 10.8.0.0/24 中的 VPN 客户端想要与 192.168.1.0/24 中的 LAN 设备通信,则不需要 NAT/PAT,只要相关设备可以路由到其他网络(通过其网关) )。
当源位于 rfc1918(私有 IP)网络中且目标为公共 IP 时,由于 rfc1918 网络不可通过 Internet 路由,因此需要 NAT 将私有 IP 替换为公共 IP。这就是源地址转换。这项工作可以通过 SNAT 而不是 PAT 来完成。
此外,假设 SNAT/MASQUERADE 不会更改源端口是错误的。
--to-source 选项用于指定数据包应使用哪个源。最简单的是,此选项采用一个 IP 地址,我们希望将其用作 IP 标头中的源 IP 地址。如果我们想在多个 IP 地址之间进行平衡,我们可以使用一系列 IP 地址,并用连字符分隔。例如,--to--source IP 号码可能类似于上面的示例:194.236.50.155-194.236.50.160。然后,我们打开的每个流的源 IP 将从这些中随机分配,并且单个流将始终对该流中的所有数据包使用相同的 IP 地址。我们还可以指定 SNAT 使用的端口范围。所有源端口将被限制为指定的端口。规则的端口位将如上例所示:1024-32000。仅当在相关规则的匹配中的某处指定了 -p tcp 或 -p udp 时,这才有效。如果可能的话,iptables 将始终尝试避免进行任何端口更改,但如果两个主机尝试使用相同的端口,iptables 会将其中一个端口映射到另一个端口。如果未指定端口范围,则如果需要,所有低于 512 的源端口将映射到低于 512 的其他端口。源端口 512 和 1023 之间的端口将映射到低于 1024 的端口。所有其他端口将映射到1024或以上。如前所述,iptables 将始终尝试维护进行连接的实际工作站所使用的源端口。请注意,这与目标端口无关,因此如果客户端尝试与防火墙外部的 HTTP 服务器联系,则不会将其映射到 FTP 控制端口。
https://www.frozenux.net/iptables-tutorial/iptables-tutorial.html#SNATTARGET
请注意,如果您的设备想要访问给定目标端口上的远程服务器,则操作系统可能已经分配了超过 1024 的随机源端口。在端口 443 上访问远程 HTTPS 服务器并不涉及源端口是443.
归档时间: |
|
查看次数: |
9135 次 |
最近记录: |