在AWS EC2上搭建V2ray+Nginx代理

Page content

前提条件

本文假设读者已经具备以下条件:

  • 一台境外的vps,购买可参考:一些VPS商家整理
  • 一个域名,无备案要求。先设置DNS将域名解析到vps的ip,例如www.lockshell.com解析到xxx.xxx.xx.xx。
  • 为域名申请一个证书,可以从Let’s Encrypt获取免费证书。
  • 有基本linux技巧,能使用vim/nano等编辑器。

理论上来说,证书不是必须的。 但没有tls加持或不做加密,防火墙直接能看出来流量真实意图从而进行干扰,这也是为什么不建议伪装http流量的原因。 本文给出的方法采用合法机构签发的证书对流量进行加密,不是做特征混淆得到的TLS流量,从而更难被检测和干扰。

关于伪装技术的选择,V2ray web+websocket+tls 和 V2ray web+http2+tls 常用来做对比。 理论上http2省去了upgrade的请求,性能更好。但实际使用中两者没有明显区别,本文使用的是websocket方式。

本文用到系统环境及软件版本如下:

  • 系统: ubuntu 18.04
  • Nginx: nginx/1.14.0 (Ubuntu)
  • V2ray: 4.x

v2ray服务端

安装v2ray

curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh
sudo bash install-release.sh

此脚本会自动安装以下文件:

  • /usr/bin/v2ray/v2ray:V2Ray 程序;
  • /usr/bin/v2ray/v2ctl:V2Ray 工具;
  • /etc/v2ray/config.json:配置文件;
  • /usr/bin/v2ray/geoip.dat:IP 数据文件
  • /usr/bin/v2ray/geosite.dat:域名数据文件 此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

脚本运行完成后,你需要:

  • 编辑 /etc/v2ray/config.json 文件来配置你需要的代理方式;
  • 运行 service v2ray start 来启动 V2Ray 进程;

之后可以使用 service v2ray start|stop|status|reload|restart|force-reload 控制 V2Ray 的运行。

v2ray配置

{
  "log" : {
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log",
    "loglevel": "warning"
  },
  "inbound": {
    "port": 8080, //(此端口与nginx配置相关)
    "listen": "127.0.0.1",
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "zhangsan", //你的UUID, 此ID需与客户端保持一致
          "level": 1,
          "alterId": 64 //此ID也需与客户端保持一致
        }
      ]
    },
   "streamSettings":{
      "network": "ws",
      "wsSettings": {
           "path": "/v2ray" //与nginx配置相关
      }
   }
  },
  "outbound": {
    "protocol": "freedom",
    "settings": {}
  },
  "outboundDetour": [
    {
      "protocol": "blackhole",
      "settings": {},
      "tag": "blocked"
    }
  ]
}

安装配置Nginx

sudo apt-get update
sudo apt-get install nginx

准备SSL证书

关于域名SSL证书,使用certbot自动签一个let’s encrypt证书就行了。 很简单,参考链接: https://certbot.eff.org/

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

sudo apt-get install certbot
sudo apt-get install python3-certbot-nginx

sudo certbot -nginx # 生成证书

成功后, 在crontab 中添加一条任务计划每三个月执行一次,因为let’s encrypt证书三个月过期:

0 0 15 */3 * /root/certbot/certbot-auto renew  # 在3,6,9,12月份的15号零点零分执行更新

配置Nginx

server {
    # SSL configuration
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    ssl_certificate /ssl.pem; # 你的ssl证书, 如果第一次,可能还需要自签一下,
    ssl_certificate_key /ssl.key; # 你的ssl key
 
    root /var/www/html;
 
    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;
 
    server_name test.v2ray.com; # 你的服务器域名
 
    location /ray { #/ray 路径需要和v2ray服务器端,客户端保持一致
        proxy_redirect off;
        proxy_pass http://127.0.0.1:8080; #此IP地址和端口需要和v2ray服务器保持一致,
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }
}

V2Ray客户端

服务端部署完成后,可参照下面的教程安装配置不同平台的V2Ray客户端:

客户端配置示例

{
  "inbounds": [
    {
      "port": 1080, # 监听端口
      "protocol": "socks", # 入口协议为 SOCKS 5
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "settings": {
        "auth": "noauth" #socks的认证设置,noauth 代表不认证,由于 socks 通常在客户端使用,所以这里不认证
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess", # 出口协议
      "settings": {
        "vnext": [
          {
            "address": "yourdomain.com", # 服务器地址,请修改为你自己的服务器域名
            "port": 443, # 服务器端口 443是https使用的端口
            "users": [
              {
                "id": "b831381d-6324-4d53-ad4f-8cda48b30811", # 用户 ID,必须与服务器端配置相同
                "alterId": 64 # 此处的值也应当与服务器相同
              }
            ]
          }
        ],
        "streamSettings": {
          "network": "ws",
          "security": "tls", # 客户端的 security 要设置为 tls
          "wsSettings": {
            "path": "/ray" # 注意:对于 V2Ray,/ray 和 /ray/ 是不一样的
          }
        }
      }
    }
  ]
}
本文由 络壳 原创或整理,转载请注明出处