v2ray 更安全的代理服务

2个月前 0 0 447

代理

由于最近使用 vps 连续被封禁,不知是否是因为切换到 SSR 的缘故?我从网络上看到很多关于 SSR 被封禁的情况,好像是由于墙不需要去特意破解什么加密,而是根据 SSR 某些特征可以大概率查封。对于我而言,我还是信服这种说法,因为在我切换到 SSR 之后不到三天我的两台服务器连续被封禁了,这让我不知所措。因为在这之前没去好好了解实际情况,我面对这种情况真的显得很无奈,好好地两台 VPS 居然都被封了,只好忍痛又买了一台。

发现 V2ray

在论坛上看到很多人也遇到过这种情况,很多都推荐使用 V2ray,新的协议,伪装程度高,各种优点。而且现在 SS 和 SSR 停止更新了,从 V2ray github 上来看,更新很频繁,而且功能也在不停地增加。
对于这个时候的我,其实已经不在乎速度了,更加在乎的是安全和长久,因为我只是用来查查资料,基本很少看视频,对于速度要求不高。当然现在已经搭建的这台代理速度还是可以的,油管的 1080 很流畅。而且好几个人在用。

方案

本身 v2ray 服务支持很多种方案,具体有多少我都忘了。有兴趣的可以去查查博客。这里我只介绍我正在使用方案,也是大家普遍认可而且安全比较高的方案 。

v2ray + nginx + websocket + tls

当前你首先必须拥有一台 VPS,推荐肯定就是搬瓦工的 KVM 架构的了。安装请选择带有 BBR 的系统。BBR 是由 GOOGLE 提出的一个开源 TCP 拥塞控制的算法。这里有一篇文章作了详细的介绍,有兴趣的可以看看。还是你必须拥有一个域名,这是必须的。如果没有,那你可以先关闭该页面,申请完再来看了,或者找一下其他的 v2ray 的解决方案了。
这套方案的思路就是利用 nginx 作为中转来做伪装。相比于 SSR 的直连,在 v2ray 客户端发出 ws 的请求到 nginx,然后利用 nginx 的代理直接转发到 v2ray 的服务上面。这样就可以将请求伪装成正常 ws 的请求 。

安装 (Centos7 系统)

安装 v2ray

我还是推荐一键脚本,这也是由官方维护的,所以我认为你没必要再去自己搞什么编译啥的,也没多大意义。目前还是能成功安全起来为主。以后有兴趣了再去搞搞也还行。执行下面的命令就可以了

bash <(curl -L -s https://install.direct/go.sh)

使用以下命令来控制 v2ray 服务

systemctl start|restart|stop|status v2ray

其配置文件放在 /etc/v2ray/config.json,是一个 Json 文件,在你安装完之后会有一个初始化的 Json 文件,文件会提供三个必要的信息 IP、端口(Port)、id(UUID), 尤其是这个 UUID,很重要。客户端会使用到,必须保持和服务端一致。当然你可以自己生成所需要的 UUID,到这个网站 Online UUID Generator 生成就可以了。

执行 systemctl start v2ray 然后执行 systemctl status v2ray 之后,如果看到绿色的 active(running) 就说明启动成功了,这里就先将所有服务先安装好,配置在最后一块配置就行了。

安装 nginx
yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel
  1. wget http://nginx.org/download/nginx-1.14.1.tar.gz
    1. tar zxvf nginx-1.14.1.tar.gz
    2. cd nginx-1.14.1
    3. ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio
    4. make && make install

五部 Nginx 就安装好了。最后加一下软连接

ln -s /usr/local/nginx/sbin/nginx /usr/bin/

安装证书

这里假设你已经拥有了域名,并且增加了 A 解析到该台 VPS。下面我们申请证书,证书过程也很简单。安装两个脚本便可以了。这里利用 Certbot 来申请。执行下面的命令

yum install epel-release
yum install -y certbot
curl  https://get.acme.sh | sh

安裝成功后执行 source ~/.bashrc 以确保脚本所设置的命令別名生效。
如果安装报错,那么可能是因为系统缺少 acme.sh 所需要的依赖项, acme.sh 的依赖项主要是 netcat(nc), 我们通过以下命令来安装这些依赖,然后重新安装一遍

yum -y install netcat

生成证书之前,请确保宿主机上的 80 端口没有被占用,否则会安装失败

~/.acme.sh/acme.sh --issue -d mydomain.me --standalone -k ec-256

-k 表示秘钥长度,后面的值可以是 ec-256ec-384、2048、3072、4096、8192,带有 ec 表示生成的是 ECC 证书,沒有则是 RSA 证书。在安全性上 256 位的 ECC 证书等同于 3072 位的 RSA 证书。

Let’s Encrypt 的证书有效期只有 3 個月,因此需要 90 天至少要更新一次证书,acme.sh脚本会每 60 天自动更新证书,。也可以手动更新。

手动更新 ECC 证书,执行:

sudo ~/.acme.sh/acme.sh --renew -d mydomain.com --force --ecc

如果是 RSA 证书则执行:

sudo ~/.acme.sh/acme.sh --renew -d mydomain.com --force

配置

v2ray 服务端配置

{
  "log": {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "debug"
  },
  "inbound": {
    "listen": "127.0.0.1",
    "port": ***, // 你的实际端口号
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": ### uuid,
          "alterId": 64,
          "level": 1
        }
      ]
    },
    "streamSettings": {
      "network": "ws",
      "security": "auto",
      "wsSettings": {
        "path": "path", // 自定义
        "headers": {
          "Host": "yourDomain" // 你的域名地址
        }
      }
    }
  },
  "outbound": {
    "protocol": "freedom",
    "settings": { }
  },
  "outboundDetour": [
    {
      "protocol": "blackhole",
      "settings": { },
      "tag": "blocked"
    }
  ],
  "routing": {
    "strategy": "rules",
    "settings": {
      "rules": [
        {
          "type": "field",
          "ip": [
            "0.0.0.0/8",
            "10.0.0.0/8",
            "100.64.0.0/10",
            "127.0.0.0/8",
            "169.254.0.0/16",
            "172.16.0.0/12",
            "192.0.0.0/24",
                        "192.0.2.0/24",
            "192.168.0.0/16",
            "198.18.0.0/15",
            "198.51.100.0/24",
            "203.0.113.0/24",
            "::1/128",
            "fc00::/7",
            "fe80::/10"
          ],
          "outboundTag": "blocked"
        }
      ]
    }
  }
}

nginx 配置

server {
        # 禁用不需要的请求方式 以下只允许 get、post
        if ($request_method  !~ ^(POST|GET)$) {
                return  444;
        }

        listen          80;
        server_name     yourDomain;        #注:填写自己的域名
        return          301  yourDomain;
}

upstream v2ray {
        server          127.0.0.1:端口;        #注:v2ray后端监听地址、端口
        keepalive       2176;   # 链接池空闲链接数
}

map $http_upgrade $connection_upgrade {
        default         upgrade;
        ''              close;
}
server {
        #要开启 HTTP/2 注意nginx版本
        #可以使用 nginx -V 检查
        listen  443 ssl http2 backlog=1024 so_keepalive=120s:60s:10 reuseport;  # backlog是nginx 监听队列 默认是511 使用命令 ss -tnl查看(Send-Q);
        #设置编码
        charset         utf-8;

        #证书配置
        ssl_certificate         path;   #注:填写自己证书路径
        ssl_certificate_key    path;   #注:填写密钥路径

        ssl_session_cache       shared:SSL:50m;
        ssl_session_timeout     1d;
        ssl_session_tickets     off;

        # https://nginx.org/en/docs/http/ngx_http_ssl_module.html
        ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;
        #openssl ciphers
        #注:懒人配置   https://mozilla.github.io/server-side-tls/ssl-config-generator/
        ssl_ciphers     HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        #安全设定
        #屏蔽请求类型
        if ($request_method  !~ ^(POST|GET)$) {
                return  444;
        }
        add_header      X-Frame-Options         DENY;
        add_header      X-XSS-Protection        "1; mode=block";
        add_header      X-Content-Type-Options  nosniff;
        add_header      Strict-Transport-Security max-age=15 always;
        root    /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm  index.php ;

        server_name     yourDomain;        #注: 将domain.Name 替换成你的域名


        location /path { #注:修改路径,上述服务端 ws 配置的 path
                proxy_http_version      1.1;
                proxy_set_header        Upgrade $http_upgrade;
                proxy_set_header        Connection "upgrade";   #此处与对应
                                proxy_set_header X-Real-IP $remote_addr;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                sendfile                on;
                tcp_nopush              on;
                tcp_nodelay             on;
                keepalive_requests      25600;
                keepalive_timeout       300 300;
                proxy_buffering         off;
                proxy_buffer_size       8k;

                #后端错误重定向
                proxy_intercept_errors on;
                error_page 400 = "yourDomain";
                if ($http_host = "yourDomain" ) {
                        proxy_pass      http://127.0.0.1:端口; // 设置 v2ray 监听的地址
                }
        }
}

客户端推荐使用 v2rayN, 这是一款 window 界面的产品,配置很简单。

补充

  • v2rayN 这款客户端无法代理 go get,原因不详,wireshark 无法抓到包,本身的 shadowsocks 客户端正常
  • 添加 shadowsocks 服务
    "inboundDetour": [
     {
       "protocol": "shadowsocks",
       "port": 10086, // 自行设置
       "settings": {
        "method": "aes-256-cfb", // 和客户端设置的加密方式一样,自行设置
        "password": "****", // 密码设置
        "udp": false
       }
      }
    ],
    

    最后

    以上便是安装的全部过程,可能过程有疏漏,也可能你在配置的过程中最后访问不了,问题有很多,可能是版本,也可能是环境问题。遇到问题请自行 google。
    还有千万不要 粘贴复制 粘贴复制 粘贴复制

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

评论 (0)

    暂无评论~

njphper@copyright From 2014 to 2019-02-17