如何优雅地使用NAS(三)更安全的内网穿透

177 次浏览

NAS服务在无公网IP的的环境中(如公司内网)使用V2Ray加密隧道实现内网穿透和安全的外网访问。

1、前提条件

需要一台在公网上运行V2ray的服务器作为中转服务器,如阿里云服务器。
假设内网NAS为 A,中转服务器为 B,外网客户端为 C。
原理与上一节的反向代理大同小异,差别在于 B 的 dokodemo-door 改成 VMess,然后 C 需要安装 V2Ray 连接 B 的 VMess。最终的效果就是 C 通过 V2Ray 连接 B,B 反向代理给 A,就相当于 C 使用 V2Ray 通过 A 代理上网。
最终实现 C 访问任何网络就相当于通过 A 访问一样。

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": "portal",
        "domain": "reverse.local"   // 与内网穿透设备 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 路径一致
        }
      }
    }
  ],

  "outbounds": [
    {
      "tag": "direct",          // 直接出站标签
      "protocol": "freedom",    // 使用freedom直接出站
      "settings": {}
    }
  ],

  "routing": {
    "rules": [
      {
        "type":"field",          // 识别内网穿透设备主动发起的反向代理连接
        "inboundTag": ["vmess-in"],
        "domain":["full:reverse.local"],
        "outboundTag":"portal"
      },
      // 所有请求转发给内网穿透设备
      {
        "type":"field",
        "inboundTag": ["vmess-in"],
        "outboundTag":"portal"
      }
      // 仅把对局域网内的请求转发给内网穿透设备,其他访问直连
      //{
      //  "type": "field",
      //  "inboundTag": ["vmess-in"],
      //  "ip": ["geoip:private"], // 私有地址
      //  "outboundTag": "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": "bridge",
        "domain": "reverse.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": ["bridge"],      // 反向桥接流量
        "domain": ["full:reverse.local"],
        "outboundTag": "proxy"         // 转发到代理服务器
      },
      {
        "type":"field",                // 反向连接内部服务
        "inboundTag": ["bridge"],
        "outboundTag": "direct"        // 直接出站,最终连接本地服务
      }
    ]
  }
}

重载V2Ray并检查运行状态:

sudo systemctl restart v2ray
sudo systemctl status v2ray

发表评论

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

滚动至顶部