通过V2Ray获取自由

前几天由于开会,我的梯子又双叒叕废了,受不了了,不用SS了。毕竟烂大街容易被ban,于是就试了下号称很厉害的V2,配置起来还是有点复杂的,而且需求比较多,萌新劝退。
14110142.png

References:

\>\>\>\>update 20200202
貌似最近墙又升级了,就目前情况来看,有效的上网方式有两种,一种是V2ray的Websocket+TLS方式,注意直接用VMESS协议已经不行了。另一种是使用trojan,一个Websocket+TLS的简化版,由于trojan没有VMESS加密,所以速度和资源消耗都比Websocket+TLS方式稍低,但也没差多少,不过V2ray的客户端支持要比trojan好很多。Websocket+TLS方式相比trojan的优势在可以套CDN,选择哪个看自己的需求。
<<<<

折腾的过程还是挺复杂的,关键是配置比较麻烦,而且通用性不强,可能适合我的不一定适合你。下面说下我的需求和配置。
因为我懒,所以可能只给出过程,具体的操作需要你自行去搜索解决。
那,首先来了解下原理吧。
Snipaste_2019-03-11_11-38-28.png

emmmmm,官网的好简单,意思就是和SS是同一类型的软件,也就是代理。
算了,重新找个能说清楚的吧
theory.jpg

这个就好多了,可以看到和SS还是差不多的,有客户端和服务端,客户端和浏览器用的依然是socks协议,客户端和服务器用的是VMESS协议,服务器和外网依然是直连。改变的重点就是VMESS。
其他的介绍什么的就不说了,这里介绍下环境场景和本文采用的方式。
由于手里有这个破站,暂时还不想扔掉。同时还想兼顾自由的需求,所以结合v2的文档,最终确定为WebSocket+TLS+Web
阅读本文之前应该先看完教程,本文只是提供了一个已经确定可以使用的demo而已。
开始!
再次注意,需求比较多,萌新劝退:
环境及需求:

  • CentOS 7
  • Nginx
  • 域名
  • SSL证书

首先VMESS依赖于系统时间,请确保使用V2Ray的系统UTC时间误差在90秒之内,时区无关。在Linux系统中可以安装ntp服务来自动同步系统时间。
可以参考:https://www.racecoder.com/index.php/archives/533/ 安装ntp服务。

然后是Nginx,可以参考:https://www.racecoder.com/index.php/archives/538/ 安装Nginx服务器
Nginx安装SSL证书,参考:https://help.aliyun.com/knowledge_detail/95491.html?spm=5176.2020520154.cas.31.f79a56a7D0boyo
证书放置目录如下:

[root@centos-s-1vcpu-1gb-01 ~]# cd /etc/nginx/
[root@centos-s-1vcpu-1gb-01 nginx]# ll
total 68
drwxr-xr-x 2 root root   72 Mar  7 19:58 cert
drwxr-xr-x 2 root root    6 Mar  6  2018 conf.d
drwxr-xr-x 2 root root    6 Mar  6  2018 default.d
-rw-r--r-- 1 root root 1077 Mar  6  2018 fastcgi.conf
-rw-r--r-- 1 root root 1077 Mar  6  2018 fastcgi.conf.default
-rw-r--r-- 1 root root 1007 Mar  6  2018 fastcgi_params
-rw-r--r-- 1 root root 1007 Mar  6  2018 fastcgi_params.default
-rw-r--r-- 1 root root 2837 Mar  6  2018 koi-utf
-rw-r--r-- 1 root root 2223 Mar  6  2018 koi-win
-rw-r--r-- 1 root root 3957 Mar  6  2018 mime.types
-rw-r--r-- 1 root root 3957 Mar  6  2018 mime.types.default
-rw-r--r-- 1 root root 4201 Mar  8 16:02 nginx.conf
-rw-r--r-- 1 root root 3441 Mar  8 10:39 nginx.conf.bak
-rw-r--r-- 1 root root 2656 Mar  6  2018 nginx.conf.default
-rw-r--r-- 1 root root  636 Mar  6  2018 scgi_params
-rw-r--r-- 1 root root  636 Mar  6  2018 scgi_params.default
-rw-r--r-- 1 root root  664 Mar  6  2018 uwsgi_params
-rw-r--r-- 1 root root  664 Mar  6  2018 uwsgi_params.default
-rw-r--r-- 1 root root 3610 Mar  6  2018 win-utf
[root@centos-s-1vcpu-1gb-01 nginx]# cd cert/
[root@centos-s-1vcpu-1gb-01 cert]# ll
total 8
-rw-r--r-- 1 root root 1675 Mar  7 19:58 1247353_racecoder.com.key
-rw-r--r-- 1 root root 3675 Mar  7 19:58 1247353_racecoder.com.pem
[root@centos-s-1vcpu-1gb-sfo2-01 cert]#

配置文件参考阿里云的配置就可以了。

v2安装使用官方提供的脚本,如果系统不支持yum,请自行安装unzip和daemon。执行后出现如下提示。

[root@vultr ~]# bash <(curl -L -s https://install.direct/go.sh)
Installing V2Ray v4.18.0 on x86_64
Downloading V2Ray: https://github.com/v2ray/v2ray-core/releases/download/v4.18.0/v2ray-linux-64.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   608    0   608    0     0    907      0 --:--:-- --:--:-- --:--:--   907
100 10.5M  100 10.5M    0     0  2965k      0  0:00:03  0:00:03 --:--:-- 4804k
Extracting V2Ray package to /tmp/v2ray.
Archive:  /tmp/v2ray/v2ray.zip
  inflating: /tmp/v2ray/config.json  
   creating: /tmp/v2ray/doc/
  inflating: /tmp/v2ray/doc/readme.md  
  inflating: /tmp/v2ray/geoip.dat    
  inflating: /tmp/v2ray/geosite.dat  
   creating: /tmp/v2ray/systemd/
  inflating: /tmp/v2ray/systemd/v2ray.service  
   creating: /tmp/v2ray/systemv/
  inflating: /tmp/v2ray/systemv/v2ray  
  inflating: /tmp/v2ray/v2ctl        
 extracting: /tmp/v2ray/v2ctl.sig    
  inflating: /tmp/v2ray/v2ray        
 extracting: /tmp/v2ray/v2ray.sig    
  inflating: /tmp/v2ray/vpoint_socks_vmess.json  
  inflating: /tmp/v2ray/vpoint_vmess_freedom.json  
PORT:15227
UUID:c7f934fc-dfba-4eed-b4b2-13a9a9b0d80a
Created symlink from /etc/systemd/system/multi-user.target.wants/v2ray.service to /etc/systemd/system/v2ray.service.
V2Ray v4.18.0 is installed.

这样服务端就已经安装好了,而且可以使用Systemd进行控制,配置什么的先放放,等会说。由于v2官方只提供命令行,所以需要找第三方客户端,这样可以稍微舒服点用着,这里选择是据说好点的v2rayN,由于没有ss那种成熟的客户端,用起来只能说是凑合。以win10系统64为例:
下载地址:https://github.com/2dust/v2rayN/releases
可以看到有两个文件,我只下了v2rayN.zip,另一个我猜是v2的内核文件,和官网同步的应该是,但是保险起见,我们直接用官网下的内核,所以这里我们只下那个界面的壳子。
Snipaste_2019-03-11_14-19-59.png

Core用官网的:
Snipaste_2019-03-11_14-19-38.png

然后把官网的内核直接丢到v2rayN文件夹下:
Snipaste_2019-03-11_14-27-18.png

再次说明,内核是可以直接运行的,但是只有命令行窗口和无窗口直接运行模式,所以如果你不想这么硬核还是用客户端比较舒服,毕竟可以配置PAC。

下面就是配置文件了,这里给出我的配置并解释下配置的含义就结束吧。
首先是v2的配置

[root@centos-s-1vcpu-1gb-01 nginx]# cat /etc/v2ray/config.json 
{
  "log": {
    "loglevel": "warning",
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log"
  },
  "inbounds": [{
    "port": 10086,
    "listen": "127.0.0.1",
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "level": 1,
          "alterId": 64
        }
      ]
    },
    "streamSettings": {
      "network": "ws",
      "wsSettings": {
        "path": "/v2"
      }
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }]
}

开始部分是日志,然后inbounds表示入站流量配置,outbounds表示出站流量配置,可以看到出站流量就是直连,没什么好说的。入站的配置和SS很相似,port表示监听的端口,这个端口可以不开放给外网,因为反正要通过Nginx转发流量。clients的id就是生成的唯一id,类似于密码吧。然后就是网络,设置为websocket,path设置为"/v2"。这里需要注意,路径是随便设的,但是要和nginx的转发对应上,等会看nginx的配置就知道了。

下面看nginx的配置:

[root@centos-s-1vcpu-1gb-01 nginx]# cat nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  racecoder.com;
        return       301 https://www.racecoder.com$request_uri;
    }

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  www.racecoder.com;
        #server_name_in_redirect off;
        return       301 https://www.racecoder.com$request_uri;
    }

    server {
        listen       443;
        server_name  racecoder.com;
        return       301 https://www.racecoder.com$request_uri;
    }

    # Settings for a TLS enabled server.
    server {
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
        server_name  www.racecoder.com;
        ssl          on;
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/nginx/cert/2666469_racecoder.com.pem";
        ssl_certificate_key "/etc/nginx/cert/2666469_racecoder.com.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
        add_header X-Frame-Options "DENY";

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        access_log logs/racecoder.log combined;

        # redirect to v2ray
        location = /v2 { # 与 V2Ray 配置中的 path 保持一致
            proxy_redirect off;
            proxy_pass http://127.0.0.1:10086;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $http_host;
        
            # Show realip in v2ray access.log
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # disable v2ray log
            access_log off;
        }

        location / {
            index index.php index.html index.htm;
            try_files $uri $uri/ /index.php index.php;


            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php$1 last;
            }
        }

        location ~ .*\.php(\/.*)*$ {
            include fastcgi.conf;
            fastcgi_pass  127.0.0.1:9000;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

主要就是SSL的那部分server配置,上面的三个server都是301重定向,就是访问"racecoder.com","www.racecoder.com","https://racecoder.com"都会直接转到"https://www.racecoder.com",保证了域名的唯一可控,且强制https,即HSTS。最后一个server是主要的配置,里面既有博客的配置,也有SSL的配置,还有v2的配置。一点点看,首先是端口域名这些,pass。然后是SSL证书配置,pass。然后是location为"/v2"的配置,这里就表示访问"https://www.racecoder.com/v2"这个路径的流量会被转发到v2服务上,配置的端口需要改成你自己配置的,因此客户端也会需要配置这个路径,这个等会说。当然,直接访问这个路径是不可以的,它会返回一个400 Bad Request的错误。后面的location都是这个博客的配置,看看就好,如果有人用typecho也可以参考下啊,哈哈。到这服务端的配置就算完了。

下面是客户端的配置:

{
  "inbounds": [{
    // Port to listen on. You may need root access if the value is less than 1024.
    "port": 1080,

    // IP address to listen on. Change to "0.0.0.0" to listen on all network interfaces.
    "listen": "127.0.0.1",

    // Tag of the inbound proxy. May be used for routing.
    "tag": "socks-inbound",

    // Protocol name of inbound proxy.
    "protocol": "socks",

    // Settings of the protocol. Varies based on protocol.
    "settings": {
      "auth": "noauth",
      "udp": false,
      "ip": "127.0.0.1"
    },

    // Enable sniffing on TCP connection.
    "sniffing": {
      "enabled": true,
      // Target domain will be overriden to the one carried by the connection, if the connection is HTTP or HTTPS.
      "destOverride": ["http", "tls"]
    }
  }],
  // List of outbound proxy configurations.
  "outbounds": [{
    // Protocol name of the outbound proxy.
    "protocol": "vmess",

    // Settings of the protocol. Varies based on protocol.
    "settings": {
        "vnext": [
        {
            "address": "www.racecoder.com",
            "port": 443,
            "users": [
            {
                "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "alterId": 64
            }
            ]
        }
        ]
    },
    "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
            "path": "/v2"
        }
    },
    // Tag of the outbound. May be used for routing.
    "tag": "vmess"
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],

  // Transport is for global transport settings. If you have multiple transports with same settings
  // (say mKCP), you may put it here, instead of in each individual inbound/outbounds.
  //"transport": {},

  // Routing controls how traffic from inbounds are sent to outbounds.
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules":[
      {
        // Blocks access to private IPs. Remove this if you want to access your router.
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      },
      {
        // Blocks major ads.
        "type": "field",
        "domain": ["geosite:category-ads"],
        "outboundTag": "blocked"
      }
    ]
  },

  // Dns settings for domain resolution.


  // Policy controls some internal behavior of how V2Ray handles connections.
  // It may be on connection level by user levels in 'levels', or global settings in 'system.'
  "policy": {
    // Connection policys by user levels
    "levels": {
      "0": {
        "uplinkOnly": 0,
        "downlinkOnly": 0
      }
    },
    "system": {
      "statsInboundUplink": false,
      "statsInboundDownlink": false
    }
  },

  "other": {}
}

为了简短我已经删除了一些注释,但依然很多,其实客户端只是修改了inbounds和outbounds即入站和出站设置而已。客户端的inbounds和outbounds区别于服务端的inbounds和outbounds。对于客户端来说,浏览器的流量是inbounds,发送给v2服务器的流量是outbounds。但是对于服务器来说,客户端的流量是inbounds,访问真正的外网流量才是outbounds。主体不同。
inbounds设置和ss差不多,依然是socks协议,端口随便写,开启tls,即走https。
outbounds就是设置服务器的信息了,协议用vmess,地址填域名,端口443,也就是https的端口,id就是服务器生成的那个相当于密码的唯一id,websocket设置路径为"/v2",要和之前服务端配置的一致。其他都是一些默认的就可以,有需要可以自行研究下。
然后用v2的客户端导入这个配置就行了,比如v2rayN就是"添加自定义配置服务器"。然后就可以启用http代理,开启PAC模式,愉快的学习了。
贴一下手绘原理图,更易理解,灵魂画手,见谅。
theroy.png

所以在墙的眼里我们只是访问了这个域名而已。有些能折腾的人还用上了cdn,这样即使一个CDN的IP被ban了,换个IP就行,我觉得暂时还没必要搞那么复杂,墙应该还没那么厉害,当然你愿意搞就去搞吧。

\>\>\>\>update 20190917
手机上也是有相应的客户端的,由于我这个穷逼只有安卓手机,就使用过的两款支持vmess协议的来说,v2rayNGBifrostV更省电。当然,一切都可能是暂时的,还得看作者们更新的情况。
<<<<

\>\>\>\>update 20200408
由于v2rayNG不支持GFWlist,只支持分应用代理,而且根据作者目前的观点似乎是不打算加这个功能:https://github.com/2dust/v2rayNG/issues/38#issue-471522042。但是对于我这种使用Google账号的就不太友好了,chrome上有很多东西需要同步的,双浏览器不现实,开代理只能针对应用设置,chrome全部走代理就不太方便了,国内网站非常慢,所以还是换回了BifrostV。
<<<<

最后:
Snipaste_2019-03-05_17-26-14.png

学习强国啊,骚年。不学习,你连这篇文章都看不懂,是不是~~!

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……