<
  • 主题:
  • + -
  • 清除背景
  • 禁用背景

代理服务器搭建

字数:2068 写于:2022-03-10
最新更新:2022-03-10 阅读本文预计花费您6分钟
本文采用 WTFPL 许可证书,转载请不要标注任何本站信息

Pre

VLESS协议

VLESS 是一种无状态的轻量级数据传输协议,使用 UUID 进行身份验,其协议不再依赖系统时间,配置灵活。但其本身协议不带加密,因此需要配合 TLS 等加密手段。

VPS

国内需要使用香港、台湾地区的服务器,如GCP在台湾的节点、softshellweb,国外的推荐vultr、搬瓦工等主流厂商,支持支付宝付款。服务器部署后,可以通过以下方法检查主机IP是否能用来搭建代理:

  • ping命令
  • nmap端口扫描:如:nmap IP地址 -Pn --reason -p 22,80,443
  • 通过平台检测,国内:站长Ping工具,国外:yougetsignal。如果国内能ping通,说明该服务器可用,可以开始搭建了。如果国外能ping通,国内无法ping通,则说明被拦截了,需要换一台服务器。如果国内国外都无法ping通,则说明服务器还未部署好,需等待几分钟后再重试。

域名

域名推荐去 NameSilo、Godaddy 购买,顶级域名.com一般第一年只需要59元左右,域名.cn域名一般35元,最便宜的如.live第一年不到14元。

拿到的域名通过NS记录/修改NameServer托管到cloudflare进行解析(直接在cloudflare买域名更贵),方便使用cloudflare的边缘CDN服务,通常需要添加的DNS记录主要是以下两条:

Type Name Content TTL A @ IP地址 Auto CNAME www 域名 Auto

SSL/TLS证书

SSL/TLS证书可以从以下平台免费获取,证书有效期一般为90天,90天后需要更换,也可以使用一些脚本自动更新

以Nginx为例,基于Certbot从Let's Encrypt TLS获取TLS证书 1.安装Certbot以及专门用于Nginx的插件 + Ubuntu / Debian: apt update apt install certbot python3-certbot-nginx + CentOS / Rocky Linux: dnf install epel-release dnf install certbot python3-certbot-nginx 2. 运行Certbot填入域名以获取并配置证书,--nginx选项会自动配置Nginx配置文件 certbot --nginx -d 域名.com -d www.域名.com 3.检测自动续期的流程是否能够正常执行 certbot renew --dry-run

BBR与FQ支持

TCP BBR(Bottleneck Bandwidth and Round-trip propagation time)是由Google于2016年发布的一种拥塞控制算法,可以显著地提高Linux服务器吞吐量并减少TCP连接的延迟。

+ 查看内核是否已经加载bbr lsmod | grep bbr + 查看当前系统使用的TCP拥塞控制算法 sysctl net.ipv4.tcp_congestion_control + 设置拥塞控制算法为 bbr sysctl -w net.ipv4.tcp_congestion_control=bbr

FQ(Fair Queueing,公平队列)是一种为每个数据流独立排队并轮转服务的调度算法,它通过计算数据包的虚拟完成时间来决定发送顺序,旨在让所有流量公平共享带宽,防止单一连接占据全部资源。

+ 查看内核当前的队列管理(qdisc)算法 sysctl net.core.default_qdisc + 启用FQ队列管理算法 sysctl -w net.core.default_qdisc=fq

客户端下载地址

客户端需要使用4.23.2以上内核

v2fly

v2fly是源于v2ray的开源网络代理项目,用于打造专属基础通信网络,Github开源项目地址:https://github.com/v2fly/v2ray-core

安装v2fly

安装/更新 v2fly命令:

bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)

该安装脚本的开源项目地址:https://github.com/v2fly/fhs-install-v2ray

v2ray常用命令

  • v2ray uuid 生成一个uuid
  • v2ray test -c 配置文件检测配置文件是否正确
  • v2ray version查看当前版本

VLESS+TLS+WS

服务端配置

使用vim/nano在/usr/local/etc/v2ray/config.json配置文件中添加配置设置,并移除注释。

{
    "log": {
    "loglevel": "warning",
    "access": "/var/log/v2ray/access.log",   
    "error": "/var/log/v2ray/error.log"  //日志输出路径
    },
    "inbounds": [{
    "port": 8180 ,  //监听端口
    "protocol": "vless",//主传入协议
    "settings": {
    "decryption": "none",
    "clients": [
    {
    "id": "41803377-xxxx-xxxx-xxxx-ddaad659554c",//UUID
    "level": 0
        }
      ]
    },
    "streamSettings": {
    "network":"ws",  //传输协议
    "security": "tls", //传输层安全
    "wsSettings":{
    "path":"/",     //路径
    "headers":{}
    },
    "tlsSettings": {
    "serverName": "xxxx.xyz", //域名
    "certificates": [{
    "certificateFile": "/etc/ssl/certificate.crt",//SSL证书路径
    "keyFile": "/etc/ssl/private.key" //密钥路径
            }]
         }
      }
    }],
    "outbounds": [{
    "protocol": "freedom",//主传出协议
    "settings": {}
    },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
    }],
    "routing": {
    "rules": [
    {
    "type": "field",
    "ip": ["geoip:private"],
    "outboundTag": "blocked"
        }
      ]
   }
 }

检测配置文件是否正确命令:

/usr/local/bin/v2ray test -c  /usr/local/etc/v2ray/config.json

文件正确会返回值:

V2Ray 4.44.0 (V2Fly, a community-driven edition of V2Ray.) Custom (go1.17.3 linux/amd64) A unified platform for anti-censorship. 2021/02/03 21:46:12 [Info] main/jsonem: Reading config: /usr/local/etc/v2ray/config.json Configuration OK.

客户端配置

配置项
别名 任意
地址 VPS的IP地址
端口 配置文件中的端口号
用户ID UUID,需要和配置文件一致
传输协议 ws
伪装域名 解析的域名
路径 配置文件中的路径
传输层安全 tls

VLESS+TLS+WS+伪装

服务器的入站流量由Nginx接收,配置一个特殊的路径/somepath,将访问该路径的流量通过Nginx反向代理给v2ray,其余流量正常由Nginx处理

Nginx配置

向Nginx配置文件/etc/nginx/nginx.conf的http块内添加以下配置,并通过nginx -s reload命令重新载入配置

#对于80端口,通过IP和域名的访问都重定向到https
server {
    listen 80;
    server_name _;
    return 301 https://$host$request_uri;
}

#处理https
server {
    listen 443 ssl;#对443端口启用ssl监听
    server_name xxx.com www.xxx.com 22.33.44.55;#接受的域名和IP

    ssl_certificate     /etc/nginx/ssl/fullchain.pem;#TLS证书
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    root /var/www/xxx.com; #放置网站路径
    index index.html;

    # 主页
    location = / {
        try_files /index.html =404;
    }

    #转发到V2Ray
    location ^~ /somepath {
        # 如果请求不是ws,返回404
        if ($http_upgrade != "websocket") {
        return 404;
        }

        proxy_pass http://127.0.0.1:8080;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        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_read_timeout 86400;
    }

    # 其他路径全部404
    location / {
        return 404;
    }
}

v2ray配置

使用vim/nano在/usr/local/etc/v2ray/config.json配置文件中添加配置设置,并移除注释。

{
  "log": {
    "loglevel": "error",
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log"
   },
  "inbounds": [{
    "listen": "127.0.0.1", #建议只监听本地
    "port": 8080, #监听端口
    "protocol": "vless",
    "settings": {
      "decryption": "none",
      "clients": [
        {
      "id": "0c03a292-xxxx-xxxx-xxxx-xxxxxxxxx" #UUID
        }
      ]
    },
    "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/somepath" #需要与nginx配置的路径一致
        }
      }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}

客户端配置

  • 别名(remarks):任意
  • 服务器地址:IP地址
  • 服务端口:Nginx监听的端口
  • 用户ID:UUID
  • 流控:空
  • 加密方式(decryption): none(需要显式指定为none)
  • 传输协议:ws
  • ws host:域名
  • ws path:配置的路径/somepath
  • 传输层安全:tls

Xray

介绍

Xray-core是在V2Ray基础上发展而来的项目,兼容v2fly-core的配置格式,并额外支持XTLS等新特性。
早期 V2Fly社区认为XTLS的实现方式在协议与代码结构上不符合项目所遵循的MIT License规范,因此将XTLS从v2fly-core中移除。随后rprx(VLESS协议和XTLS的设计者)Fork了v2fly-core并重新整合与完善了XTLS等功能,由此形成了新的项目Xray,Xray的Github开源地址:https://github.com/XTLS/Xray-core

  • XTLS:Xray项目提出的一种优化TLS代理的数据传输机制,通过内核splice以及减少不必要的加密和数据拷贝,来大幅降低CPU使用率并提高吞吐量

安装Xray

安装/更新 Xray命令:

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

该安装脚本的开源项目地址:https://github.com/XTLS/Xray-install

Xray常用命令

  • xray uuid生成一个uuid
  • xray run -test -c 配置文件检测配置文件是否正确
  • xray version查看当前版本
  • xray x25519生成密钥对,用于REALITY加密

VLESS+TCP+XTLS+flow

由Xray接收入站流量,如果是VLESS协议流量,则由Xray处理,非VLESS流量则回落到所指定的端口,交给Nginx处理。此外流控方式XTLS-RPRX-Vision(flow)会使代理流量在外部表现为普通TLS连接,提升传输效率并降低协议特征

服务端配置

使用vim/nano在/usr/local/etc/xray/config.json配置文件中添加配置并移除注释

{
 "log": {
    "loglevel": "error",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "dns": {
    "servers": [
      "https+local://1.1.1.1/dns-query",
      "localhost"
    ]
  },
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "block"
      },
      {
        "ip": ["geoip:cn"],
        "outboundTag": "block"
      },
      {
        "domain": [
          "geosite:category-ads-all"
        ],
        "outboundTag": "block"
      }
    ]
  },
  "inbounds": [
    {
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "0c03a292-xxxx-xxxx-xxxx-375cab768a57", //UUID
            "flow": "xtls-rprx-vision",
            "level": 0
          }
        ],
        "decryption": "none",
        "fallbacks": [
          {
            "dest": 8080  //回落端口
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "alpn": "http/1.1",
          "certificates": [
            {
              "certificateFile": "/etc/letsencrypt/live/xxxx.com/fullchain.pem", //证书
              "keyFile": "/etc/letsencrypt/live/xxxx.com/privkey.pem"  //密钥
            }
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "tag": "direct",
      "protocol": "freedom"
    },
    {
      "tag": "block",
      "protocol": "blackhole"
    }
  ]
}

Nginx接收回落

添加HTML文件

/var/www/域名.com目录下上传html文件,并确保Nginx的默认用户www-data对该目录有访问权限,对html文件有r读取权限

添加Nginx配置

/etc/nginx/nginx.conf,在http块中添加

#重定向80端口的访问,443由Xray监听
server {
    listen 80;
    server_name _;
    return 301 https://$host$request_uri;
}

# Xray回落的流量由Nginx处理
server {
          listen 127.0.0.1:8080;
          server_name xxxx.top www.xxxx.top;
          root /var/www/xxxx.top;
          index index.html;
        }

客户端配置

  • 别名(remarks):任意
  • 服务器地址:IP地址
  • 服务端口:Xray监听的端口
  • 用户ID:UUID
  • 流控(flow):xtls-rprx-vision
  • 加密方式(decryption): none(需要显式指定为none)
  • 传输协议:tcp
  • 伪装类型:none
  • http host:域名
  • 传输层安全:tls
  • SNI:域名

VLESS+TCP+REALITY+flow

REALITY是Xray-core提供的一种传输安全机制,该方案中用来替代TLS,它不需要域名,也不需要部署TLS证书,而是利用X25519等TLS常用的密钥交换算法生成密钥对,在客户端与服务器之间建立加密会话。在连接建立过程中,REALITY会模拟并复用所配置目标网站(target)的TLS握手特征作为伪装,使客户端访问服务器的流量在外部网络看来与访问该目标网站的TLS流量具有相似特征,从而提高流量的隐蔽性

REALITY有以下几个特殊配置:

  • target:服务端配置,旧称dest,这两个字段互为alias。用来指定一个目标网站,REALITY会参考并模拟该网站的TLS握手特征,使Xray客户端在连接服务器时看起来像是在访问该网站。同时,服务器会将非Xray客户端的请求转发到该网站,使得主动嗅探返回结果为与该网站的真实连接。
  • serverNames:服务端配置,一般与target保持一致即可,可以配置多个,客户端配置的SNI是该配置列表中的其中一个即可,值可以参考target目标网站域名所返回证书的SAN
  • shortIds:客户端&服务端配置,服务端可配置多个用于识别不同Xray REALITY客户端,客户端使用其中之一。shortIds的值需要是8个字节(16个字符)的十六进制数(0-f)组成的字符串,长度可以小于16字符,程序会后补0,但长度必须是偶数 (因为一个字节有2位16进制数),如:aa1234会被自动补全为 aa12340000000000, 但是aaa1234则会导致错误。
  • privateKey:服务器私钥,通过执行命令xray x25519生成
  • password:客户端公钥,其实就是publicKey,但在Reality 的设计中需要客户端持有,不能公开,通过命令xray x25519 -i “服务器私钥”生成

REALITY的工作流程

  • 客户端发起TLS握手,在ClientHello中写入shortId、publicKey等信息,并使用客户端配置的SNI填入TLS的SNI字段,使连接在网络层看起来像是访问该域名对应的HTTPS服务。
  • 服务器在接收到连接请求后,会根据shortId、privateKey等信息验证该连接是否来自合法Xray客户端。
    • 如果是Xray合法客户端,则Xray继续完成后续握手,使用服务器配置中的privateKey与客户端配置中的publicKey进行密钥协商,从而建立安全的加密通道使用VLESS协议通信。
    • 如果不是Xray客户端,服务器会将该连接转发到所配置的target网站,让访问者与真实网站建立连接,从而使服务器在主动扫描或探测时通常表现为一个普通的HTTPS服务。

target目标网站的选择

target目标网站需要满足以下规则:

  • 国外网站
  • 支持TLSv1.3与H2
  • 域名作为非跳转使用,如:从xxx.com跳转到www.xxx.com

推荐使用稳定、成熟的大型网站,如:python.org、www.microsoft.com、www.cloudflare.com等,然后通过以下命令查询target网站证书中的SAN列表(以微软官网为例):

openssl s_client -connect www.microsoft.com:443 -servername www.microsoft.com </dev/null 2>/dev/null | openssl x509 -noout -text | grep -A1 "Subject Alternative Name"

返回值示例:

X509v3 Subject Alternative Name: DNS:wwwqa.microsoft.com, DNS:www.microsoft.com, DNS:staticview.microsoft.com, DNS:i.s-microsoft.com, DNS:microsoft.com, DNS:c.s-microsoft.com, DNS:privacy.microsoft.com

服务端的serverNames配置可以挑选该SAN列表中的一个或多个(分配给多个Xray客户端),客户端的SNI值需要是该serverNames中的其中一个。

服务端配置

使用vim/nano在/usr/local/etc/xray/config.json配置文件中添加配置并移除注释

{
 "log": {
   "access": "/var/log/xray/access.log",
   "error": "/var/log/xray/error.log",
   "loglevel": "error"
 },
  "inbounds": [
    {
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "0c-xxxx-xxx-8a57", #UUID
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "show": false,
          "target": "www.microsoft.com:443",#target网站
          "xver": 0,
          "serverNames": [
                "www.microsoft.com" #客户端SNI需要是该列表之一
          ],
          "privateKey": "-MfX-xxx-xxxWo", #私钥
          "shortIds": [
            "0312abcd6201" #shortIds
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom"
    }
  ]
}

客户端配置

  • 用户ID:UUID
  • 流控(flow):xtls-rprx-vision
  • 加密方式:none
  • 传输协议:tcp
  • 伪装类型:none
  • 传输层安全(TLS):reality
  • SNI:服务端serverNames之一,如:www.microsoft.com
  • PublicKey:公钥
  • Shortld:服务端Shortlds之一,如:0312abcd6201

防火墙命令速查

Centos 7/8 firewalld 放行端口
// 放行端口 firewall-cmd --permanent --add-port=8180/tcp //重启使之生效 firewall-cmd --reload
ubuntu系统 ufw放行端口
// 放行端口 sudo ufw allow 8080/tcp //重启 sudo ufw reload
Centos 6/7 iptable放行端口
// 放行端口 iptables -I INPUT -p tcp --dport 8080 -j ACCEPT //保存添加的规则链 service iptables save
上一篇:一位资深数据工程师酒后的肺腑之言(转载)
下一篇:Nginx笔记(上)
z z z z z