如何优雅地使用NAS(五)中转服务器

247 次浏览

为了让中转服务器同时实现内网穿透和科学上网,可利用V2Ray和Nginx分流,将内网穿透的中转服务器流量和科学上网流量进行分流。

服务器的配置

执行官方安装脚本安装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 路径一致
        }
      }
    },
    {
      "tag": "reverse-in",      // 内网穿透服务入站
      "listen": "127.0.0.1",    // 只监听本地连接,由 Nginx 反向代理
      "port": 10001,            // 此端口必须与 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": "/reverse"    // 自定义路径,此路径必须与 Nginx 配置中的 location 路径一致
        }
      }
    }
  ],

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

  "routing": {
    "rules": [
      {
        "type":"field",          // 识别内网穿透设备主动发起的反向代理连接
        "inboundTag": ["reverse-in"],
        "domain":["full:reverse.local"],
        "outboundTag":"portal"
      },
      {
        "type":"field",          // 来自 reverse-in 的所有请求转发给内网穿透设备
        "inboundTag": ["reverse-in"],
        "outboundTag":"portal"
      },
      {
        "type":"field",          // 对来自 vmess-in 的请求进行广告拦截
        "inboundTag": ["vmess-in"],
        "domain": ["geosite:category-ads-all"],  // 需要 geosite.dat数据
        "outboundTag": "block"
      },
      {
        "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 /reverse {            # 此路径与 V2Ray 配置和客户端保持一致
        if ($http_upgrade != "websocket") {return 404;}  # 不通过ws访问时返回404
        proxy_pass http://127.0.0.1:10001;  # 此端口需要与 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;
    }
    
    # 外网直接访问时指向内部web服务
    location / {
        proxy_pass http://127.0.0.1:80;     # 内部web服务端口,如wordpress
        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;
    }
}

# 重定向所有HTTP(80)请求到HTTPS(443)
server {
    listen 80;
    listen [::]:80;
    server_name your-domain.com;   # 使用域名匹配
    
    # 告诉搜索引擎和浏览器这是一个永久重定向
    return 301 https://$server_name$request_uri;
}

测试并重载Nginx和V2Ray:

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl restart v2ray

发表评论

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

滚动至顶部