概述

家庭主机 (NAS) 有公网 IPv6 地址,相对固定。用户希望能够在一个 IPv4-only 的网络环境下远程访问 NAS 提供的服务:例如 ssh, VNC, Samba, RDP 等服务。

由于 IPv4 和 IPv6 本身是不兼容的:一个 IPv6-only 的 host 和一个 IPv4-only 的 host 无法仅通过 IP 地址和对方通信,因为 IPv6 的帧头部和 IPv4 的帧头部格式不一样,因此,我们需要利用一台同时是 IPv4 使能和 IPv6 使能的双栈 (DualStack) 机器来为这两台机器牵线搭桥,具体来说是扮演一个做网络地址转换 (NAT) 的中间人角色。

在本文中,我们探讨这种 NAT 的具体实现方式,以 vxlink 为例。

过程与原理

首先创建一个 vxlink 加速服务,注意要选择支持 IPv6 的节点(列表项中有显眼 IPv6 标识),一个 vxlink 加速服务本质上是一个 1-to-1 NAT, 具体运作方式如下:

  1. 你在创建此服务时指定一个目标 IP 地址 (dst ip) 和目标端口 (dst port);
  2. vxlink 成功创建服务后,给你返回一个访问主机地址 (entry host) 和访问端口 (entry port);
  3. 在没有白名单的情况下,你发给 entry host: entry port 的 packet 会被 vxlink 转发到 dst ip: dst port, 并且在出站时 vxlink 将 packet SNAT 成 vxlink 它自己的地址;
  4. dst ip 的主机会收到 sender 是 vxlink, target 是它自己的 packet;
  5. dst ip 的主机把 reply packet 发给 vxlink;
  6. vxlink 根据 NAT 记录,把地址换回来,把 dst ip 主机发给它的 packet 发给你(最初的 sender);

vxlink 的加速服务强大的地方在于它是支持跨协议的 1-to-1 NAT 的,entry host 一般而言是 dual stack 使能的,也就是说 entry host 的 DNS 服务器支持解析它的 A 类型的资源记录,也支持解析它的 AAAA 类型的资源记录,同时 vxlink 的主机也是 dual stack 使能的。

截屏2023-10-27 下午12.21.31.png

一般而言我们可以将 dst port 选为 NAS 的 ssh 端口,方便后续用 ssh 进行进一步的操作。

服务创建成功后,我们应当可以用 vxlink 的地址 ssh 连接 NAS 了:

ssh -4 -i <keyfile-path> <user>@<vxlink-host> -p <vxlink-port>

我们发现,即便用了 -4 选项模拟 IPv4-only 环境,我们也能通过这行命令连上家里的 IPv6 主机,这也意味着当前主机到最终目的主机间的 4-to-6 NAT 实现成功了。

接下来我们可以将该条 ssh 连接命令中的参数保存在 ssh 用户配置文件,后续就可以以 ssh 快捷方式的方式使用它: