前言

之前X-NUCA的时候想到要寻求场外援助(虽然最终没人),但为了以后学校去外面打比赛等能为场外人员提供网络环境,于是绝对自己搭建一个,经学校某大大佬建议,用v2ray来搞,拓扑图大致如下。这里只说感想:v2ray的反向代理配合路由真的可以玩出很多骚操作!

image.png

理论基础

这里不多说,放一个链接吧,写的很很详细了。
V2Ray 配置指南

反向代理


这里的A是场内人员,B为VPS,C为场外人员。在设置好配置文件并运行 V2Ray 之后,反向代理中连接建立的次序为:
1、A 会主动向 B 发起请求,建立起一个连接;
2、用户在 C 上向 B 发起请求,欲访问 A 上的私有网盘;
3、B 接受 C 的请求,通过 A 向 B 建立的连接转发给 A(即 B 反向连接了 A);
以上过程效果就相当于 C 向 A 发起请求,达到了访问 A 的私有网盘等的目的。

图解

A 向 B 发起请求,A 需要一个 outbound ,B 需要一个 inbound(因为 A 的 outbound 是连接到 B 的 inbound,用的协议是:VMess);C 向 B 发起请求,B 还需要一个 inbound,C 运行V2( B 的 inbound 要接受来自C的流量,用的协议是:VMess);因为是 A 来访问最终的服务器(私有网盘),所以 A 还需有一个 outbound,即 freedom。也就是说 A 需要两个 outbound(VMess 和 freedom),B 需要两个inbound(VMess 和 VMess)。然后为了让 A 能够主动连接 B,A 需要配置反向代理(reverse);同样的,为了能够让 B 反向连接 A,B 也需要配置反向代理(reverse)。最后通过配置好路由就vans了。

应用场景

本节所说的反向代理可以实现:

  • 对于留学生等海外华人,有时候想看中文的视频或听中文音乐等,因为版权原因,没法直接上大陆的网站观看,买大陆的 VPS 又太贵。如果在大陆家里搭建一个 V2Ray,再买一个海外的 VPS,利用反向代理就可以随便看大陆可以看的视频
  • 对于大学生,可以利用反向代理在校外访问校园网的资源,无限制下载论文等
  • 对于程序员,可以在家里查看公司的代码仓库
  • 对于普通用户,可以在外面看家里的监控

配置文件

下面直接给一个成功能用的配置。

为方便理解和统一称呼,我们把没有公网IP的主机,即欲访问的内网服务器称为bridge;把具有公网IP的主机,即外网直接访问的服务器称为portal;所有的外网设备都称为client

# A的配置
{
  "reverse":{
    // 这是 A 的反向代理设置,必须有下面的 bridges 对象
    "bridges":[
      {
        "tag":"bridge", // 关于 A 的反向代理标签,在路由中会用到
        "domain":"private.cloud.com" // A 和 B 反向代理通信的域名,可以自己取一个,可以不是自己购买的域名,但必须跟下面 B 中的 reverse 配置的域名一致
      }
    ]
  },
  "outbounds": [
    {
      //A连接B的outbound
      "tag":"tunnel", // A 连接 B 的 outbound 的标签,在路由中会用到
      "protocol":"vmess",
      "settings":{
        "vnext":[
          {
            "address":"xxxxxxxxxxxxx", // B 地址,IP或实际的域名
            "port":16823,
            "users":[
              {
                "id":"b831381d-6324-4d53-ad4f-8cda48b30811",
                "alterId":64
              }
            ]
          }
        ]
      }
    },
    // 另一个 outbound,最终连接私有网盘
    {
      "tag":"bridgeout",
      "protocol":"freedom",
      "settings":{}
    }
  ],
  "routing":{
    "rules":[
      {
        // 配置 A 主动连接 B 的路由规则
        "type":"field",
        "inboundTag":["bridge"],
        "domain":["full:private.cloud.com"],
        "outboundTag":"tunnel"
      },
      {
        // 反向连接访问私有网盘的规则
        "type":"field",
        "inboundTag":["bridge"],
        "outboundTag":"bridgeout"
      }
    ]
  }
}
# B的配置

{
  "reverse":{
    "portals":[
      {
        "tag":"portal",
        "domain":"private.cloud.com"
      }
    ]
  },
  "inbounds":[
    // to C
    {

      "tag":"toC",
      "port":11872,
      "protocol":"vmess",
      "settings":{
        "clients":[
          {
            "id":"a26efdb8-ef34-4278-a4e6-2af32cc010aa",
            "alterId":64
          }
        ]
      }
    },
    // to A
    {
      "tag": "tunnel",
      "port":16823,
      "protocol":"vmess",
      "settings":{
        "clients":[
          {
            "id":"b831381d-6324-4d53-ad4f-8cda48b30811",
            "alterId":64
          }
        ]
      }
    }
  ],
  "routing":{
    "rules":[
      {
        "type":"field",
        "inboundTag":["toC"],
        "outboundTag":"portal"
      },
      {
        "type":"field",
        "inboundTag":["tunnel"], 
        "outboundTag":"portal"
      }
    ]
  }
}
# C的配置
{
  "log": {
    "loglevel": "log"
  },
  "inbounds": [
    {
      "port": 1080,
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "xxxxxxxxxxxxx",    //B的地址
            "port": 11872,  
            "users": [
              {
                "id": "a26efdb8-ef34-4278-a4e6-2af32cc010aa",  
                "alterId": 64
              }
            ]
          }
        ]
      }
    }
  ]
}

配置好 bridge、portal 和 client 的 v2ray 后,先后运行 bridge 和 portal 的 v2ray,再在 client 上运行v2ray即可。

在本场景的实际使用中,在 client 看来,portal 和 bridge 就像成为了一个整体,通过 v2ray 客户端连接后访问任何网站就如同是从 bridge 上访问的一样,就如同置身于家中的内网环境中。此时如要访问家中的设备,直接在浏览器中访问192.168.1.x这样的内网地址就行了。

效果