IPv6 与 IPv4 转换,在 IPv4 网络中访问 IPv6 的设备
在公司想访问家里的设备来摸鱼、查资料、下载文件、做一些小项目,好处是可以使用一个自己非常熟悉的环境、并且所有内容都能集中管理,而不把不必要的文件放得到处都是甚至公司电脑里。
既然目标是公司的电脑上进行远程访问,那么应该尽可能地避免安装第三方软件、私自组网以规避可能存在的权限和合规问题。
在此之前,为了把开发和实验环境从我的电脑上隔离开,我特地花了 1400 块从腾讯云租了一年 windows server,从公司能直接通过 RDP 远程上去。为了节省开销,现在打算退掉这个服务器,改用家里那台常年开机的 Mac mini。
当前的网络环境
公司给笔记本提供的网络有公网访问权限可以访问外部网络,但只支持 IPv4 网络、没有 IPv6 能力。
家里的宽带倒是同时支持两种协议,并提供了一个公网 IPv6 地址,但要能从外部进行访问还有个隐藏条件,需要在光猫上设置桥接或者混合模式,而不是默认的路由模式。
家宽的调整
把路由模式改为桥接或者混合,需要光猫的超级管理员权限,安装师傅通常不会给,淘宝或咸鱼上可以找到商家付费查询。拿到密码后登录光猫配置界面去改,确保自己清楚宽带账号和密码,否则先不要继续进行下去了。
模式修改好了后,到路由器配置后台把上网设置改为拨号上网,输入宽带账号和密码并确认连接成功。然后检查一下 IPv6 的设置,像 TP-LINK 的某些型号是把 IPv6 的设置单独放的,并且能直接复用 IPv4 的拨号链路。

到这里,家庭网络中的其他支持 IPv6 的设备就能从外部访问了。为了方便,还需要给被远程连接的设备配置 DDNS,之后通过域名来访问,这个之后单独写一篇。
如何让 IPv6 和 IPv4 的设备连接
要从公司网络访问家里的设备,必须先处理一下两个网络协议不能互相访问的问题。
我是直接买了一台阿里云的低配 ECS 服务器(一年 150 不到),并给它开通公网 IPv6,这样这台服务器就同时拥有了双栈网络,可以用它来做一个 IPv6 和 IPv4 的中转。
这台服务器的配置是 512M 的内存,2 核 vCPU + 80Mbps 的带宽,实例地域选了上海,并安装了 Debian 13.5 的 64 位系统。我的家宽是江苏电信的,从服务器上 ping Mac mini 的 IPv6 域名,延迟在 15ms 左右,非常优秀。
实现过程
一般情况下,直接用 gost 转发需要的地址和端口就能搞定:
gost -L=tcp://:5900/macmini-domain:5900
此时用外部网络已经能通过服务器的域名访问到 Mac mini 了,但公司的网络防火墙挺严格,根本不让通过。这里面还存在一个问题,一旦尝试在公司电脑上通过浏览器访问服务器的域名,就会遇到安全提示页面,并表明 URL 已经被拦截,因为存在风险:
Webpage blocked due to potential security risk The page you are requesting poses a potential threat to our infrastructure and is therefore blocked! URL: Identified Category: high-risk
这个是 Palo Alto NGFW 给出的提示,但其实可以申请对域名进行重新分类,让它正常通过。
前置条件
上面只是遇到过的部分问题,这里写一下方案实施必要的前置条件
- 给服务器申请一个域名并添加服务器的 IPv4 地址,后面公司笔记本靠这个域名连接服务器
- 给服务器域名申请证书,我用的是阿里云的个人测试证书,免费但每 3 个月需要重新申请一次
- 把 nginx 证书上传到服务器(用 sftp 就好)
- 访问 https://urlfiltering.paloaltonetworks.com 检查服务器的域名有没有分类、是不是 high-risk,可能要手动申请分类来确保不被拦截
- 给需要被访问的家里的设备(我的 Mac mini)申请一个域名并添加其 IPv6 地址,这里应该用 DDNS 自动同步
配置 nginx
nginx 需要安装 full 版本
sudo apt update
sudo apt install nginx-full
即使已经安装了 nginx 也没关系,apt 会自动处理冲突。
新建一个独立目录,之后会把转发配置放到这里:
sudo mkdir -p /etc/nginx/stream.d
在 /etc/nginx/nginx.conf 文件末尾(http 块结束之后)追加:
sudo tee -a /etc/nginx/nginx.conf << 'EOF'
include /etc/nginx/stream.d/*.conf;
EOF
编写 stream 转发配置,创建 /etc/nginx/stream.d/stream-macmini.conf,文件内容如下:
stream {
server {
listen 3389 ssl;
proxy_pass macmini-domain:5900;
ssl_certificate /home/ecs-user/server-domain/fullchain.pem;
ssl_certificate_key /home/ecs-user/server-domain/privkey.key;
}
}
将 macmini-domain 和证书路径换成实际值,监听端口选择伪装成常见服务端口(如 RDP 3389)以降低可疑度,记得给服务器防火墙放行端口。
校验并重载 nginx:
sudo nginx -t
sudo systemctl reload nginx
公司电脑安装 stunnel
从官网下载安装包:https://www.stunnel.org/downloads.html ,安装好后在开始菜单中有一个叫 Edit stunnel.conf 的快捷方式,点开后对配置文件进行编辑。
可以注释掉已有的配置,然后插入:
[macmini-vnc]
client = yes
accept = 127.0.0.1:5901
connect = server-domain:3389
注意替换掉 server-domain 为实际域名,3389 和 /etc/nginx/stream.d/stream-macmini.conf 中的监听端口保持一致。
配置保存好后,在开始菜单中点开 stunnel GUI Start,确保能跑起来。到这里连接路径就已经就绪了。
通过 ARD 协议连接 Mac mini
在 Windows 上远程连接 macOS 原生远程协议,免费又理想的工具只有 RDM (Remote Desktop Manager)。
stunnel 跑起来后,在 RDM 中新建一个 Apple 远程桌面 (ARD) 连接,主机名填写 127.0.0.1,端口号改成 5901。另外我还在设置中把性能改为自适应质量、分辨率质量改为高、另一个登录正在使用显示器时共享显示。
如果连的是 Windows 电脑
如果要连的是家里的 Windows 电脑,修改一下服务器上 /etc/nginx/stream.d/stream-macmini.conf 中的 proxy_pass 为电脑的域名,端口号改成 RDP 端口,然后公司电脑这边的 stunnel.conf 中的 connect 也同步修改。
之后用系统自带的远程桌面工具使用 127.0.0.1:5901 应该就能连上了。
后记
即使已经用 RDM 成功远程上 Mac mini 了,但颜色显示有点异常,估计颜色映射有问题。文字大小也偏小,即使是 Hidpi,显示清晰度不错但缩放和 Windows 的效果就是不一致。
…算了我觉得还是继续用腾讯云的服务器得了。