警告:本指南由自动系统翻译。在任何时候,如果您有任何疑问,请将语言更改为 “EN ”并打开新窗口,查阅英文版本。
常见问题有时需要不常见的解决方案
当起点是 IPv6 地址时,偶尔会有一个或其他(未更新/懒惰的)应用程序不支持直接使用,因为它们是为使用 IPv4 格式的地址而设计的。尽管如此,它们通常对你使用的 IPv4 范围持宽容态度,允许你指定内部 IPv4(范围为 10.x.x.x/8、172.16.x.x/12 - 172.32.x.x/12,或 192.168.x.x/16),就像你在任何其他购买的 NAT VPS 上一样,因为它们不区分地址。
C-Servers 与其他供应商在 NAT VPS 上的唯一区别是,其他供应商默认提供一个 IPv4 NAT 内部地址(不是公开的,只是私有的),而我们更倾向于提供一个具有双重功能的 IPv6 公开地址(也发送/接收 IPv4 请求),然后将您的请求翻译 + 内部路由到/从主服务器的 IPv4。
由于 SolusVM 2 模板和云启动镜像无法预测其他内部 IPv4 地址,而 C-Servers 又是一家 IPv6 优先的公司,因此我们默认不提供此类地址。不过,在本指南中,我们将向你展示如何在需要仅 IPv4 地址的应用程序上实现 IPv4 连接。只需简单的三个步骤即可实现:
- 在 VPS 上禁用 cloud-init;
- 为系统添加内部 IPv4 地址;
- 在 IPv4 和 IPv6 之间创建一个内部 socat,以实现完全连接。
从 IPv6 发送到 VPS 的数据包已经完成,重定向完全是在 TCP/IP 套接字级别的内部进行的,这种解决方案已经使用了很长时间。
如何在 MultiVPS 上实现原生内部 IPv4 连接
首先,停用 VPS 的云启动变更。这只是一个例子;你可能需要手动编辑不同的区域来停用云启动,甚至直接编辑你的 Linux 发行版的网络部分。
通过 SSH 或 VNC 进入您的服务器,创建一个文件以防止 cloud-init 在后续启动时运行:
sudo touch /etc/cloud/cloud-init.disabled
如果这不起作用,您不妨直接编辑文件,以避免任何界面重现,从而删除我们要做的事情。由于 cloudinit(有时格式化为 cloud-init)只是 SolusVM 2 在每次重启结束时运行的脚本,您只需执行
云启动
或
哪个云启动
以查看脚本在磁盘上的位置--有时它是从网络配置文件部分加载的,有时它本身就是一个完整的脚本。另一种方法是直接查看 Linux 系统日志。只需在命令行中写入
journalctl
并使用键盘上的 PgDn / Page Down 键向下滚动,直到你在 VPS 上创建的最后一个启动日志--这正是你在每次 Linux 启动时看到的屏幕。请注意每条日志左侧提供的小时/天数,以追踪云启动操作和位置。
如需更多支持,您可以在配置时使用 Google 或人工智能。
为网络接口添加静态 IPv4 地址。编辑网络配置文件(位置取决于发行版):
对于 Ubuntu 22.04/24.04(使用 Netplan):
sudo nano /etc/netplan/01-netcfg.yaml
在该文件中,不要删除任何其他内容,然后添加(同样,这只是一个示例,请查看您操作系统的进程):
network:
version: 2
ethernets:
eth0: # 接口名称可能不同
addresses:
- 10.0.0.10/24 # 添加条目并最终替换为所需的内部 IPv4 范围和子网(区块 172.16.x.x/12, 192.168.x.x/16)
Ctrl+O 保存,Enter 确认,Ctrl+X 退出 Nano 编辑器。
对于企业级 Linux(RHEL/CentOS/Tencent/AlmaLinux/Rocky Linux,以 RHEL 9/AlmaLinux 9 为例),通过 SSH 或 VNC 在普通命令行上写入
nmcli con mod eno1 ipv4.addresses 192.168.1.100/24 [你可以插入任何其他私有 IPv4 范围,确保子网和 IP 都没问题]
nmcli con mod eno1 ipv4.gateway 192.168.1.1 [来自所选的同一私有 IPv4 范围,始终是其中的第一个地址]
nmcli con mod eno1 ipv4.dns 8.8.8.8 [使用任何常规 IPv4 DNS]
nmcli con mod eno1 ipv4.method manual [不要插入 auto,这是一个非 DHCP 地址]
要建立连接,只需插入
nmcli con up eno1
如果尚未安装 socat,请安装它:
sudo apt update && sudo apt install socat -y # 对于 Debian/Ubuntu,或
sudo dnf install socat # 适用于基于 RHEL 的发行版(示例适用于基于 RHEL8/RHEL9 的发行版)
在 sysctl 中激活 IPv4 和 IPv6 转发支持:
echo “net.ipv4.ip_forward=1” | sudo tee -a /etc/sysctl.conf
echo “net.ipv6.conf.all.forwarding=1” | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
创建一个 systemd 服务来运行 socat,并将内部 IPv4 流量转发到 IPv6:
sudo nano /etc/systemd/system/ipv4-to-ipv6-routing.service
添加以下内容
单元
Description=IPv4 to IPv6 Socat 路由服务
之后=network.target
服务
类型=简单
ExecStart=/usr/bin/socat TCP4-LISTEN:PORT,bind=10.0.0.10,reuseaddr,su=nobody,fork TCP6:[YOUR_IPV6_ADDRESS]:PORT
重启=始终
重启秒数=5
安装
WantedBy=multi-user.target
替换:
10.0.0.10 替换为所需的内部 IPv4 地址
[YOUR_IPV6_ADDRESS] 替换为 VPS 的公共 IPv6 地址
端口]改为要转发的端口号
启用并启动服务:
sudo systemctl enable ipv4-to-ipv6-proxy.service
sudo systemctl start ipv4-to-ipv6-proxy.service
现在该服务会在每次启动时自动启动。
如果需要转发多个端口,可以创建多个服务文件或修改 socat 命令来处理多个端口。
Socat 适用于 TCP/UDP、从 IPv4 到 IPv6 以及从 IPv6 到 IPv4。命令示例如下
socat UDP4-LISTEN:10683,bind=10.0.0.10,reuseaddr,su=nobody,fork UDP6:[2a00::212:4b00:615:a1f7]:10683 " 表示在内部 IPv4 连接的 10683 端口监听 UDP,并以给定地址和相同端口路由到公共 IPv6 地址。
socat TCP6-LISTEN:10022,bind=[2a00::212:4b00:615:a1f7],reuseaddr,su=nobody,fork TCP4:10.0.0.10:10022 " 表示监听 IPv6 下指定公共 IPv6 地址 10022 端口的 TCP,路由到相同端口的 IPv4 VPS 内部 IP 栈。
合理警告
此解决方案是持久性的,每次重启都会继续使用。
不过,如果由于某种原因(如更新更改了 systemd、socat 或网络功能)而导致失败,你可能需要创建一个脚本,在每次启动时运行--crontab 或类似的脚本工具可能对此很有帮助--比如在每次启动 VPS 时重新插入 IPv4。如果有必要,对 socat 也做同样的处理也是个好主意。
Solus VM 2 具有云启动功能,它通常会在每次启动时提供网络信息,并删除之前的信息,除非用户禁用它,并在 VPS 启动时自动加入 IP(因为它来自用户空间,所以不会与云启动冲突)。
如果出现其他问题,只需使用我们的 C-Servers GoBack 备份服务将 VPS 恢复到较早的时间点,或使用我们的操作系统模板从头开始重新安装 VPS。
可以肯定的是
此解决方案将解决仅限 IPv4 应用程序的大多数问题。