如何优雅地使用NAS(二)内网穿透

205 次浏览

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 v2ray

2、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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部