如何透明地将端口从 IPv4 隧道传输到远程 IPv6 设备?

jav*_*vex 16 networking linux vpn ipv6 iptables

在家里,我连接了一个 IPv6 地址,此外,我的提供商提供了一个类似 NAT 的设置,通过它我可以收到一个公共 IPv4 地址,我与其他客户共享(原因显然是我们的 IPv4 地址不足)。

因此,当我在 IPv4 网络上时,我无法访问家里的设备(例如我的 VPN 网关)。但是,我确实有一台同时具有 IPv4 和 IPv6 地址的服务器。因此,如果我通过我的服务器,应该可以访问我的家庭设备。

到目前为止,这是我的想法:由于在 IPv6 上,每个设备都有自己的 IP,我家中的服务器获得静态 IPv6 IP。我的远程服务器已经有静态 IPv4 和 IPv6。

当我现在想访问家里的 OpenVPN 服务器时,以前我会在路由器中打开端口 1194,NAT 会将连接传递到那里的服务器。在我的新场景中,我想连接到远程服务器上的端口 1194(或不同的,无关紧要),它应该采用该连接并将其隧道连接到我的主服务器(因为它们都具有 IPv6)。

从图形上看,这意味着:

移动设备 (IPv4) --> 远程服务器 (IPv4+IPv6) --> 家庭服务器 (IPv6)

但这应该只发生在选择的端口上(或者有比按端口选择更聪明的方法吗?)。

我的问题是,如何实现此设置?

这应该在哪个级别运行?如果我想通过端口来做,我显然必须在 TCP/UDP 层转发数据包。我的第一个想法是 iptables,但是 iptables 可以将数据包转发到远程 IP 吗?或者有其他软件可以吗?或者我应该在两台服务器之间创建一个隧道,然后在本地转发?我该怎么做?

jav*_*vex 16

我终于找到了一个将IPv4 端口转发到 IPv6-only 主机的解决方案,它基本上使用 socat:

socat TCP4-LISTEN:22,fork,su=nobody TCP6:[2a01:198:79d:1::8]:22
Run Code Online (Sandbox Code Playgroud)

我的解决方案基本上是相同的,除了我使用主机名,除了那里的静态 IP。注意不要在主机名中使用方括号,因为它会将其解释为 IP。