我在虚拟机内运行一个可从外部访问的服务器。我的本地路由器配置为使用 DDS 将我的 IP 地址映射到我拥有的域,并将数据包转发到端口 80 和 443 到我的 Windows PC。VirtualBox VM 配置了 NAT 网络并遵循以下端口转发规则:
直到最近,使用 IPv4 一切都运行良好。不幸的是,我最近更换了 DSL 提供商,他们使用 DS Lite 隧道,这意味着我没有公共 IPv4 地址,只有 IPv6。因此,我重新配置了 DDNS 规则以将我的域映射到我的动态 IP 地址。看来数据包到达了我的 PC*,但没有转发到 VM。
为什么?我是否需要在某处配置 IPv6 和/或在“附加到:”下拉菜单中使用不同的网络类型?我能否以某种方式将 IPv6 数据包转发到 VM 内的 IPv4 地址?
* 实际上,在主机上运行服务器时,我也无法通过外部 IPv6 地址访问它。我被重定向到我的路由器页面。所以也许我还需要以某种方式修复我的路由器配置。我认为这与“IPv6 前缀”有关,这对我来说是一个新概念。在端口转发设置中,我的 PC 似乎还有一个专用的 IPv6 地址,这似乎意味着有多个外部 IPv6 地址分配给我。看来我需要阅读更多相关信息。
答案1
虽然理论上 VirtualBox 的 NAT 实现可以将 IPv6 连接转发到 IPv4 主机,但这种协议转换往往会带来很多麻烦,例如“目标主机应该看到什么 IPv4 源地址?”(因为原始 v6 地址当然不能放入 IPv4 标头中)。因此,实践中唯一的选择是 v4-to-v4 和 v6-to-v6。
VirtualBox 中的默认 NAT 网络不支持 IPv6。您需要打开“工具→网络”在 VirtualBox 主窗口中创建自定义 NAT 网络,启用 IPv6 并配置一些地址前缀;然后您将看到“端口转发”选项卡现在有“IPv4”和“IPv6”子选项卡。
然后,在虚拟机的设置中,将网络接口从“NAT”切换到“NAT网络”,并选择刚刚创建的网络。
(与默认 NAT 模式不同,这些自定义 NAT 网络可以在多个 VM 之间共享,因此端口转发是通过网络设置而不是通过 VM 设置来配置的。)
选项 B:不要使用 NAT 模式,而是使用“桥接”模式这样虚拟机就可以直接出现在主 LAN 中。虚拟机将拥有自己的 IPv6 地址(以及自己的 IPv4 LAN 地址),就像 Windows 主机一样,因此您根本不需要端口转发配置。
选项C:可以在 Windows 主机上运行 HTTP 反向代理和 TCP 代理,代理与虚拟机的连接(通过 VBox NAT“端口转发”或通过“仅主机”接口)。代理能在 IPv4 和 IPv6 之间进行转换,因为它们不会尝试保留原始 IP 地址;它们只是从主机自己的 IP 建立新连接。(原始客户端 IP 将通过 X-Forwarded-For 或类似方法提供。)
选项D:Windows 具有内置 TCP 代理服务,同样支持 IPv4 和 IPv6 之间的中继。您可以在netsh
下方找到它interface portproxy
(尝试add
命令)。它不支持 X-Forwarded-For 或类似的东西。
前缀(扩展自评论)
“前缀”在 IPv4 和 IPv6 中是同一个东西;它们只是表示某个特定大小的网络(地址范围)。例如,您家局域网的内部前缀很可能是 192.168.1.0/24,其中“/24”是前缀长度(以位为单位)(这是 255.255.255.0 网络掩码的更紧凑的写法)。
这个术语在住宅 IPv4 连接中并不常见,因为这些连接充其量只是一个不值得称为“前缀”的地址,而它唯一的前缀就是它自己(尽管你仍然可以称它为 /32 前缀)。
与此同时,有了 IPv6,地址池就足够大了,你的 ISP 可以容易地可以为您分配多个外部地址。但 ISP 不会将这些地址单独租给每台设备,而是一次为您分配整个子网,然后让您的路由器处理其余部分 – “IPv6 前缀”只是用于您的网络的 IPv6 地址范围。
(与 IPv4 一样,前缀长度(例如 /64)仍然只是一种记下网络掩码的方式,但它很多比“ffff:ffff:ffff:ffff:0:0:0:0”更紧凑。)
您的路由器使用 DHCPv6-PD(“前缀委托”)租用您的 LAN 前缀,其方式与使用传统 DHCP 租用 IPv4 地址的方式大致相同。这允许路由器直接将公共 IPv6 地址分发给 LAN 设备,这意味着它不再需要执行 NAT - 无论是出站还是入站,因此“端口转发”规则也不适用于 IPv6 连接;客户端直接访问您的 LAN 地址。(路由器仍然具有防火墙以保护 LAN。
(单个 IPv6 子网几乎始终使用 /64 前缀;这是您的家用路由器为您的 LAN 默认获得的前缀,但您的 ISP 通常能够为您分配更大的网络(更短的前缀),例如 /60 或 /56,然后将其细分为相当数量的 /64 子网。当您使用“唯一本地前缀生成器",您还需要将 /48 细分为 /64 大小的子网。)
一旦获得前缀,路由器就会使用 ICMPv6 路由器通告将其通告到 LAN;然后每个设备独立决定在其后附加哪些后缀,并以此方式生成自己的地址。路由器不会跟踪“租用”的 IPv6 地址。
根据操作系统,地址后缀可以是完全静态的(例如基于 MAC)或部分静态的(仅在前缀更改时更改)。此外,PC 通常会启用“IPv6 隐私扩展”,并会生成额外的临时 IPv6 地址与永久地址一起;有一个关于禁用该功能的单独线程。
(上面描述的协议是“SLAAC”。尽管 IPv6 确实有 DHCPv6 作为地址分配的更传统的选项,但它并不常见。)
由于每台设备现在都有一个唯一的外部地址,因此 DynDNS 客户端应该在该特定设备上运行 - 是的,这意味着您需要为每台服务器使用单独的子域。但是,您的 ISP应该允许您拥有静态 IPv6 前缀,从而避免使用 DynDNS,因为他们完全负担得起……除非他们决定收取“因为我们可以”税。(或者除非您在德国,根据法律,您显然需要明确选择使用静态前缀?)