使用背景
由于家里的NAS没有公网的IP,所以在在外面(不使用家里的局域网)是没有办法直接访问这台NAS的,需要一台具有公网IP的VPS,通过VPS反向代理来访问家用NAS。
原理说明
假定有A、B、C三个设备,A为不具备公网IP的家用NAS,B为具有公网IP的服务器(如VPS),C为外网需要访问NAS的设备。为了能够实现反向代理,需要做如下操作:
1、A需要知道B的IP,并主动和B建立连接,B开放一个端口的监听。
2、当C需要访问A的时候,会先通过B的监听端口和B建立连接,将数据发送给B。
3、然后由B通过 A 向 B 建立的连接将数据转发给 A。
实际的效果就相当于 C 向 A 发起请求,达到了访问 A 的目的。
使用v2ray实现如下图所示:
服务端v2ray安装
参见https://www.jayyang.cn/archives/v2rayfu-wu-duan-an-zhuang
NAS客户端v2ray安装
1、进入Container Station,创建应用程序,如下所示

yaml文件内容如下:
version: '3'
services:
app:
image: 'v2fly/v2fly-core'
restart: unless-stopped
command: run -config /etc/v2ray/config.json 2、点击创建运行容器
3、进入容器修改配置文件后重新启动容器,配置文件内容见”客户端反向代理配置“章节
服务端反向代理配置
{
"log": {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "error"
},
"reverse": { // 反向代理
"portals": [
{
"tag": "ssl_portal",
"domain": "private.myssl.jason.com" // 这里为bridge与portal通信的域名,可以自己取,不用实际存在,客户端和服务端需要保持一致
}
]
},
"inbounds": [
{
"tag": "extern_ssl",
"port": 443,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1", // 需要访问的内网服务的IP地址
"port": 443, // 需要访问的内网服务的端口
"network": "tcp,udp"
}
},
{
"tag": "tunnel",
"port": 12345,
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "c9915fcd-2dff-f1fc-28ea-5542507f24db",
"alterId": 64
}
]
}
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": [
"extern_ssl"
],
"outboundTag": "ssl_portal"
},
{
"type": "field",
"inboundTag": [
"tunnel"
],
"domain": [
"full:private.myssl.jason.com"
],
"outboundTag": "ssl_portal"
}
]
}
}客户端反向代理配置
{
"log": {
"access": "/var/log/v2ray/access.log",
"error": "/var/log/v2ray/error.log",
"loglevel": "error"
},
"reverse": {
"bridges": [
{
"tag": "ssl_bridge",
"domain": "private.myssl.jason.com"
}
]
},
"outbounds": [
{
"tag": "tunnel",
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "server", // 服务端的IP
"port": 12345, // 服务端地址
"users": [
{
"id": "c9915fcd-2dff-f1fc-28ea-5542507f24db",
"alterId": 64
}
]
}
]
}
},
{
"tag": "backend",
"protocol": "freedom",
"settings": {}
}
],
"routing": {
"settings": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": [
"ssl_bridge"
],
"outboundTag": "tunnel",
"domain": [
"full:private.myssl.jason.com"
]
},
{
"type": "field",
"inboundTag": [
"ssl_bridge"
],
"outboundTag": "backend"
}
]
}
}
}