Linux 网络:如何通过第二个 IPv4 接口将来自互联网的传入 IPv6 连接转发到本地网络中的其他计算机?

Linux 网络:如何通过第二个 IPv4 接口将来自互联网的传入 IPv6 连接转发到本地网络中的其他计算机?

我有某种具有两个网络接口的 Debian 服务器网关僵尸:eth0wlan0(是的,wlan0...我知道。)。

eth0连接到为其分配 IPv6 地址的互联网电缆调制解调器。我们假设这是仅 IPv6 分配。(实际上它使用 DS Lite,但我们现在先忽略这一点。)

wlan0连接到基于 IPv4 的本地网络,主网关是另一个互联网电缆调制解调器。第二个电缆调制解调器仅从提供商处获取 IPv4 地址,并使用 NAT 将端口转发到本地计算机。

服务器僵尸的重要部分/etc/network/interfaces如下所示:

allow-hotplug eth0 iface eth0 inet static
    # Ignore the following IPv4 stuff...
    # I just added this to connect to the cable modem more conveniently
    address 192.168.0.22 
    netmask 255.255.255.0
    gateway 192.168.0.1

auto wlan0 iface wlan0 inet static
    wpa-ssid [ssid] # only required for my wlan connection
    wpa-psk [key] # only required for my wlan connection
    address 192.168.1.22
    netmask 255.255.255.0

    # The following makes sure that the main IPv4 network
    # can be reached from this computer:
    #gateway 192.168.1.1 # can't use this because only one IPv4 gateway is allowed at a time
    post-up ip route add 192.168.1.0/24 dev wlan0 src 192.168.1.22 table rt2
    post-up ip route add default via 192.168.1.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.1.22/24 table rt2
    post-up ip rule add to 192.168.1.22/32 table rt2

我现在想使用我的 server-gateway-zombie 来完成以下任务:来自eth0特定端口上的 IPv6 适配器的连接应作为 IPv4 连接转发到wlan0网络中的计算机。我怎样才能做到这一点?


这里有一些额外的信息,可以帮助你了解我为什么要这样做:

因为我有两个电缆调制解调器,一个仅支持 IPv4,另一个仅支持 IPv6(至少就传入连接而言),所以我想执行某种依赖于 IP 版本的负载平衡。

这意味着,只要客户端可以使用 IPv6 连接到我的网络,它就会到达我的 IPv6 电缆调制解调器,然后该调制解调器会将流量重定向到服务器网关僵尸,然后服务器网关僵尸会再次将其重定向到 IPv4 网络中的服务器。另一方面,只要客户端只能使用 IPv4 连接到我的网络,仅支持 IPv4 的电缆调制解调器的 NAT 就会启动并相应地重定向流量。

这可以通过为我的主机名创建两个 DNS 条目来实现:一个用于 IPv4 地址,一个用于 IPv6 地址。

答案1

另一个答案我发现了一个针对另一个方向(IPv4 -> IPv6)的非常简单的解决方案,它使用socat

基于该解决方案,我只需在 server-gateway-zombie 上设置一个守护进程,并socat附带以下socat参数:

TCP6-LISTEN:80,su=nobody,fork,reuseaddr TCP4:192.168.1.23:80

这样,端口 80 上的任何传入数据包都将被重新打包,然后发送到仅支持 IPv4 的 HTTP 服务器。问题解决了!

答案2

无法将 IPv6 连接(例如来自 IPv6 地址的连接)转发到 IPv4 主机。因此,“来自特定端口上的 IPv6 eth0 适配器的连接应作为 IPv4 连接转发到 wlan0 网络中的计算机”是不合理的。IPv6 地址只能与其他 IPv6 主机通信,而 IPv4 地址只能与其他 IPv4 主机通信。

但如果我理解正确的话,下面的解释会使其更合理:来自 IPv6 地址的连接应该到达您的服务器(通过一个链接),而来自 IPv4 地址的连接应该到达您的服务器(通过另一个链接)。

为了实现这一点,有两种可能性:

1)使您的服务器具有双栈功能(同时具有本地 IPv4 和全局 IPv6 地址)。

对于这种情况,只需让您的路由器具有 IPv4 DNAT 到服务器本地 IPv4 地址(就像 IPv6 之前一样),并设置从路由器到服务器的常规 IPv6 路由。从互联网到服务器 IPv6 地址的主机将通过 eth0 接口进入路由器,并路由到您的服务器全局 IPv6 地址。从互联网到您的 IPv4 公共地址的主机将被 DNAT 到您的服务器本地 LAN 地址。

2)让您的服务器仅保留 IPv4,并在路由器上为您需要的每种协议安装协议反向代理。

在这种情况下,从互联网到您的 IPv4 公共地址的主机将被 DNAT 到您的服务器本地 LAN 地址,与上述相同(与您拥有 IPv6 之前相同)。但是,来自 IPv6 地址的主机将终止于在您的路由器上运行的双栈守护进程(例如,在 HTTP 协议的反向代理设置中的 squid 上),然后守护进程将创建到您的服务器的新 IPv4 连接(并将其收到的任何内容传递回原始 IPv6 主机)。

(2) 的优点是您不需要重新配置您的服务器,但缺点是您需要为您想要在服务器上访问的每个协议实现反向代理,这大大增加了路由器所需的复杂性(和功率)。

相关内容