206 次浏览
NAS服务在无公网IP的的环境中(如公司内网)使用V2Ray反向代理实现内网穿透并将NAS服务暴露在公网。
1、前提条件
需要一台在公网上运行V2ray的服务器作为中转服务器,如阿里云服务器。
数据流量路径:
假设内网NAS为 A,中转服务器为 B,外网客户端为 C。
C to B:外网设备访问http://<B的局域网IP>
B 入站处理:通过 dokodemo-door 入站,监听 80 端口收到的请求
B 出站处理:将请求转发到 127.0.0.1:80
内部机制:V2Ray 发现 127.0.0.1:80 是一个“虚拟地址”,它实际上对应的是通过隧道连接的客户端 A 的 80 端口
B to A:V2Ray 通过 A 与 B 之间已建立的 VMess 隧道,将请求发送给 A
A 处理请求:A 收到请求,访问本地 80 端口的 OMV 管理页面
2、中转服务器的配置
执行官方安装脚本安装V2Ray:
bash <(curl -L -s https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)启动并检查V2ray运行状态:
sudo systemctl start v2ray # 启动
sudo systemctl enable v2ray # 设置开机自启
sudo systemctl status v2ray # 检查服务状态配置V2ray服务端:(使用Vmess+WS+TLS协议并通过Nginx反代)
sudo nano /usr/local/etc/v2ray/config.json内容如下:
{
"log": {
"access": "/var/log/v2ray/access.log", // 访问日志路径
"error": "/var/log/v2ray/error.log", // 错误日志路径
"loglevel": "warning" // 日志等级,可选:debug / info / warning / error / none
},
"reverse": {
"portals": [ // 反向代理实现内网穿透
{
"tag": "omv-portal",
"domain": "omv.local" // 与 NAS 端 bridge 的 domain 对应
},
{
"tag": "nas-portal",
"domain": "nas.local" // 与 NAS 端 bridge 的 domain 对应
}
]
},
"inbounds": [
{
"tag": "vmess-in", // vmess + WebSocket + TLS 入站
"listen": "127.0.0.1", // 只监听本地连接,由 Nginx 反向代理
"port": 10000, // 此端口必须与 Nginx 配置中 proxy_pass 的端口一致,避免直接使用443,以防冲突
"protocol": "vmess",
"settings": {
"clients": [{
"id": "输入UUID", // 使用命令成 UUID cat /proc/sys/kernel/random/uuid
"alterId": 0
}]
},
"streamSettings": {
"network": "ws", // 使用 WebSocket 传输
"wsSettings": {
"path": "/v2ray" // 自定义路径,增加隐蔽性, 此路径必须与 Nginx 配置中的 location 路径一致
}
}
},
{
"tag": "omv-in", // 接收外部请求转发到内网穿透设备
"listen": "0.0.0.0",
"port": 80,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1", // 实际指向内网穿透设备映射过来的OMV服务
"port": 80,
"network": "tcp"
}
},
{
"tag": "nas-in", // 接收外部请求转发到内网穿透设备
"listen": "0.0.0.0",
"port": 445,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1", // 实际指向内网穿透设备映射过来的NAS服务
"port": 445,
"network": "tcp"
}
}
],
"outbounds": [
{
"tag": "direct", // 直接出站标签
"protocol": "freedom", // 使用freedom直接出站
"settings": {}
}
],
"routing": {
"rules": [
{
"type": "field",
"inboundTag": ["omv-in"], // 外部请求入口
"outboundTag": "omv-portal" // 发往 portal(通过反向连接转发给内网穿透设备)
},
{
"type": "field",
"inboundTag": ["nas-in"], // 外部请求入口
"outboundTag": "nas-portal" // 发往 portal(通过反向连接转发给内网穿透设备)
},
{
"type":"field", // 识别内网穿透设备主动发起的反向代理连接
"inboundTag":["vmess-in"],
"domain":["full:omv.local"],
"outboundTag":"omv-portal"
},
{
"type":"field", // 识别内网穿透设备主动发起的反向代理连接
"inboundTag":["vmess-in"],
"domain":["full:nas.local"],
"outboundTag":"nas-portal"
},
{
"type": "field", // 其他流量直连
"inboundTag": ["vmess-in"],
"outboundTag": "direct"
}
]
}
}配置Nginx反向代理:
移除默认配置文件:
sudo rm /etc/nginx/sites-enabled/default
sudo rm /etc/nginx/sites-available/default修改配置文件:
sudo nano /etc/nginx/conf.d/v2ray.conf内容如下:
server {
listen 443 ssl http2; # 启用 HTTP/2 可以提供更好的性能
listen [::]:443 ssl http2; # 启用 IPv6 支持
server_name your-domain.com; # 使用域名匹配
# SSL 证书路径(使用Let's Encrypt生成)
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# 用于 V2Ray WebSocket
location /v2ray { # 此路径与 V2Ray 配置和客户端保持一致
if ($http_upgrade != "websocket") {return 404;} # 不通过ws访问时返回404
proxy_pass http://127.0.0.1:10000; # 此端口需要与 V2Ray 配置中的端口一致
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 超时设置
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
# 外网直接访问时返回伪装页面
location / {
proxy_pass https://google.com; # 代理到google主页
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}测试并重载Nginx和V2Ray:
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl restart v2ray2、NAS端配置
配置V2ray服务端:
配置V2ray服务端:
sudo nano /usr/local/etc/v2ray/config.json内容如下:
{
"reverse": {
"bridges": [ // 反向代理实现内网穿透
{
"tag": "omv-bridge",
"domain": "omv.local"
},
{
"tag": "nas-bridge",
"domain": "nas.local"
}
]
},
// "inbounds": [{}], // 可拓展局域网内代理,实现旁路由
"outbounds": [
{
"tag": "proxy", // 代理出站,连接中转服务器
"protocol": "vmess",
"settings": {
"vnext": [{
"address": "输入代理节点地址或域名",
"port": 443,
"users":[{ "id": "输入UUID", "alterId": 0, "security": "auto"}]
}]
},
"streamSettings": {
"network": "ws",
"security": "tls",
"tlsSettings": {
"serverName": "输入代理节点域名",
"allowInsecure": false
},
"wsSettings": {
"path": "/v2ray"
}
}
},
{
"tag": "direct", // 直接出站
"protocol": "freedom", // 使用freedom直接出站
"settings": {}
}
],
"routing": {
"rules": [
{
"type": "field",
"inboundTag": ["omv-bridge"], // 反向桥接流量
"domain": ["full:omv.local"],
"outboundTag": "proxy" // 转发到代理服务器
},
{
"type": "field",
"inboundTag": ["nas-bridge"], // 反向桥接流量
"domain": ["full:nas.local"],
"outboundTag": "proxy" // 转发到代理服务器
},
{
"type":"field", // 反向连接内部服务
"inboundTag":["omv-bridge", "nas-bridge"],
"outboundTag":"direct" // 直接出站,最终连接本地服务
}
]
}
}重载V2Ray并检查运行状态:
sudo systemctl restart v2ray
sudo systemctl status v2ray