,文章

小内存也可以,Nginx反代+TLS+WebSocket+web,隐藏/伪装v2ray

  编辑于:2018-12-03
文章目录

前言

之前介绍过v2ray利用CDN(cloudflare)的方法,本次介绍的方法和上次有不少的相似之处,本次介绍一下将V2RAY隐藏到正常的网站背后,这样访问域名的时候看到的时候正常的网页,但是使用v2ray链接的话则可以实现梯子的功能。当然如果要实现访问域名出现一个正常网站的功能,你需要一个网站,然而自己建立一个网站也太麻烦了,我们可以反代一下别人的网站,这样访问你域名的时候则可以显示别人网站的页面,并且可以在微型小鸡上实现这样的功能。

准备

本次以debian/ubuntu系统为例,当然centos系统的配置差不了太多。
一个域名:可以申请免费域名,freenom.com,将域名A记录指向服务器。
一台服务器:64M内存就可以用了。服务器购买:Vultr,最低2.5刀一月,注册送10刀,支持支付宝。
一个欲反代的网站:选择一个简单点的网站,因为很多大网站会有安全措施,反代起来有点麻烦。

配置nginx

卸载apache。部分服务商提供的系统模版里面自带了apche,但是我们不需要它,并且它会影响到NGINX的使用,所以这里卸载它。

service apache2 stop
apt-get remove apche* -y

安装nginx
debian/ubuntu

apt-get install nginx -y

创建dhparam.pem文件

mkdir -p/etc/nginx/ssl
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

设置nginx配置文件,vi /etc/nginx/sites-enabled/你的域名.conf

server
    {
        listen 80;
        #listen [::]:80;
        server_name 你的域名 ;
        #将http重定向到https
        return 301 https://你的域名$request_uri;
	}
server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name 你的域名 ;
        ssl on;
        ssl_certificate /etc/nginx/ssl/你的域名/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/你的域名/privkey.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
        ssl_dhparam /etc/nginx/ssl/dhparam.pem;
	access_log off;
	location / {
        #向后端传递访客IP
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #设定需要反代的域名,可以加端口号
	proxy_pass http://148.251.3.246:22900/;
        #替换网站内容
        sub_filter '你反代的对象' '你的域名';
        # websocket设定,V2ray使用,这里的设置要和v2ray的设置一致。
	location /phpmyadmin/ {
          proxy_redirect off;
          #proxy_pass http://127.0.0.1:10000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_set_header Host $http_host;
          proxy_intercept_errors on;
          if ($http_upgrade = "websocket" ){
             proxy_pass http://127.0.0.1:10000;
          }
        }
        }
    }

上面设定中的proxy_pass http://148.251.3.246:22900/;就是设定想要反代的域名的地方,148.251.3.246:22900是我挂的一个探针页面,以作测试用,当然你也可以改成其他的网站,比如https://github.com/,如果你反代的https://github.com那么sub_filter '你反代的对象' '你的域名';就是sub_filter 'github.com' 'yourdomain.com';

申请证书

安装acme.sh,一个自动化的Let's Encrypt证书申请程序。

apt-get install socat -y
curl  https://get.acme.sh | sh

以下命令都要在.acme.sh的目录内执行,root用户的在/root/.acme.sh

之前我介绍过用API申请LET'S证书的方法,但是相对来说比较复杂,这里用一种简单的方法,使用nginx方法来申请证书,使用nginx方法申请证书的话,需要先保证有关于这个域名的nginx配置在本例当中,就是上面那个配置文件。
申请证书

acme.sh --issue --nginx -d 你的域名 -d 你的域名

acme.sh脚本可以一次申请多个域名证书,只需要多家-d参数。
创建目录存放证书。

mkdir -p /etc/nginx/ssl/你的域名

将证书安装到nginx。不建议直接在nginx中使用~/.acme.sh/你的域名里面的证书,这个目录仅供内部使用,将来可能会改变结构。

acme.sh --install-cert -d 你的域名 \
--key-file       /etc/nginx/ssl/你的域名/privkey.key  \
--fullchain-file /etc/nginx/ssl/你的域名/fullchain.cer \
--reloadcmd     "service nginx force-reload"

这个时候访问你的域名,你应该就能看到被你反代的网站了。

配置v2ray

安装v2ray
使用官方的安装脚本

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

如果提示:-bash: curl: command not found那么安装curl

apt-get install curl -y

清空/etc/v2ray/config.json的内容,然后粘贴以下内容进去,vi /etc/v2ray/config.json

{
    "log": {
		"access": "/var/log/v2ray/access.log",
		"error": "/var/log/v2ray/error.log",
        "loglevel": "info"
    },
    "inbound": {
        "port": 10000,
        "listen": "127.0.0.1",
        "protocol": "vmess",
        "allocate": {
            "strategy": "always"
        },
        "settings": {
            "clients": [{
                "id": "6d8a82b9-94d6-442e-a340-2b9cd5752c77",
                "level": 1,
                "alterId": 64,
                "security": "chacha20-poly1305"
            }]
        },
        "streamSettings": {
            "network": "ws",
            "wsSettings": {
                "connectionReuse": false,
                "path": "/phpmyadmin/"
            }
        }
    },
    "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"
            }]
        }
    }
}

上面"id": "6d8a82b9-94d6-442e-a340-2b9cd5752c77",里面的ID可以通过https://www.uuidgenerator.net/这里自助生成,强烈建议修改该值。

客户端的使用

https://github.com/v2ray/v2ray-core/releases查看并下载适合于自己系统的程序。
(注:V2RAY客户端和服务端一体,只是配置方式的不同,因此此处服务端和客户端在同一个地方下载,但是服务端和客户端的系统可能不同,因此应下载不同版本的程序。windows系统应下载:v2ray-windows-32.zip或者v2ray-windows-64.zip)
修改 config.json 配置为以下内容,注意 address (第25行)填写网站域名。

{
  "log": {
    "access": "",
    "error": "",
    "loglevel": ""
  },
  "inbound": {
    "port": 1085,
    "listen": "0.0.0.0",
    "protocol": "socks",
    "settings": {
      "auth": "noauth",
      "udp": true,
      "ip": "127.0.0.1",
      "clients": null
    },
    "streamSettings": null
  },
  "outbound": {
    "tag": "agentout",
    "protocol": "vmess",
    "settings": {
      "vnext": [
        {
          "address": "网站域名",
          "port": 443,
          "users": [
            {
              "id": "6d8a82b9-94d6-442e-a340-2b9cd5752c77",
              "alterId": 64,
              "security": "chacha20-poly1305"
            }
          ]
        }
      ]
    },
    "streamSettings": {
      "network": "ws",
      "security": "tls",
      "tcpSettings": null,
      "kcpSettings": null,
      "wsSettings": {
        "connectionReuse": true,
        "path": "/phpmyadmin/",
        "headers": null
      }
    },
    "mux": {
      "enabled": true
    }
  },
  "inboundDetour": null,
  "outboundDetour": [
    {
      "protocol": "freedom",
      "settings": {
        "response": null
      },
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      },
      "tag": "blockout"
    }
  ],
  "dns": {
    "servers": [
      "8.8.8.8",
      "8.8.4.4",
      "localhost"
    ]
  },
  "routing": {
    "strategy": "rules",
    "settings": {
      "domainStrategy": "IPIfNonMatch",
      "rules": [
        {
          "type": "field",
          "port": null,
          "outboundTag": "direct",
          "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"
          ],
          "domain": null
        },
        {
          "type": "field",
          "port": null,
          "outboundTag": "direct",
          "ip": null,
          "domain": [
            "geosite:cn"
          ]
        },
        {
          "type": "field",
          "port": null,
          "outboundTag": "direct",
          "ip": [
            "geoip:cn"
          ],
          "domain": null
        }
      ]
    }
  }
}

此时启用你的客户端,应该就可以实现利用CDN中转了。
客户端运行 v2ray 或 v2ray.exe,直接运行即可

本地 socks 代理为 127.0.0.1:1085

第三方客户端配置 address(网站域名)、port(443)、id(很长那串)、alterId(64)、security(chacha20-poly1305)、network(ws)、path(/v2ray/)、底层传输安全(tls)
参考链接:
https://github.com/iMeiji/shadowsocks_install/wiki/Project-V-%E9%85%8D%E7%BD%AE-WebSocket-TLS-Web-CDN

发表回复

  • 评论13则,共1页,当前第1
    • Neil

      V2RAY及NGINX的配置中WEBSOCKET的路径该去哪儿找?这点不太明白,麻烦说明。谢谢。

    • bibaushi

      證書申請成功後,restart nginx會得到下面錯誤訊息:
      SSL: error:0906D06C:PEM routines:PEM_read_bio:no start line:Expecting: TRUSTED CERTIFICATE
      查看證書開頭為:-----BEGIN CERTIFICATE-----
      請問我要如何修改才能得到開頭為:-----BEGIN TRUSTED CERTIFICATE-----的證書
      或著是怎麼做才能讓錯誤消失?

    • 小Y

      您好,请问在申请证书“acme.sh --issue --nginx -d 你的域名 -d 你的域名”这一步执行的时候,会报异常【nginx:[emerg]BIO_new_file("/etc/nginx/ssl/xxxxxx.com/fullchain.cer")failed(SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/nginx/ssl/xxxxxx.com/fullchain.cer','r')】。我看了一下这条命令是去读nginx配置文件中所配置的“ssl_certificate”和“ssl_certificate_key”去了,但现在申请证书这步执行时,这两个配置项对应路径下的文件明显还没有呢!这个问题该如何解决啊?求教。

    • wintbird

      按lz的方法申请证书没成功,我说一下我用的方法做参考吧。(*╹▽╹*)
      按照“https://certbot.eff.org/lets-encrypt/debianstretch-nginx”的步骤安装cerbot
      sudo apt-get install certbot python-certbot-nginx
      然后确保site-available文件夹里只有nginx默认生成的defalut链接,运行
      sudo certbot --nginx
      会有让输入相关的信息创建证书,完成之后证书位置在
      /etc/letsencrypt/live/<域名>/fullchain.pem
      /etc/letsencrypt/live/<域名>/privkey.pem
      之后再把nginx配置中的
      ssl_certificate /etc/nginx/ssl/你的域名/fullchain.cer;
      ssl_certificate_key /etc/nginx/ssl/你的域名/privkey.key;
      分别修改成请求的证书和私钥的位置就可以了
      配置里这一句
      ssl_dhparam /etc/nginx/ssl/dhparam.pem;
      需要注释掉

      另外配置第三方v2ray客户端的时候,path一项需要填/phpmyadmin/

    • N

      64M的小内存,不会爆掉吗?

    • wwwkkk

      为什么我按楼主的步骤全走完了,打开自己的域名不会到反代的网站,还是自己nginx的默认页,v2ray不能正常工作,我应该重点检查哪里?一点头绪都没有。

    • fanfan

      大佬你好。我想问一下,NGINX里。我已经成功设置TLS能用了。
      但是我打开网址会显示Bad Request,请问现在我的NGINX里需要怎么设置,才能打开网址后会车到ONEDRIVE网站呀?谢谢。