博客
电影
宝箱
友链
关于
<
读《欧也妮·葛朗台》,欲望对抗虚无
冰山之下的疯狂,读《克苏鲁神话合集》
>
v2ray+ws+tls+cloudflare+nginx实现一台服务器两用
作者:
Cifer
类别: 技术·运维
时间:2020-11-11 06:25:57
字数:10777
版权所有,未经允许,请勿转载,谢谢合作~
## 前言 本文讲述的是,如果让你的服务器,既能作为你网站的服务器(网站机),又能成为你代理上网的服务器(代理机),目前我在网上没有看到过类似的文章,因此决定自己写一个。 需求如下:(域名与IP仅作例子) 网站机:对外公开域名: public.com 以及对外公开真实IP: 1.2.3.4 代理机:私人域名 private.com 隐藏你的真实IP 预期效果:没有人知道 public.com与private.com来自同一个人以及同一个服务器,两者互不干扰。 有人一看这需求,马上就会想,使用cloudflare不就行了吗,说对了,也说错了。说对了是因为代理机有使用cloudflare来隐藏IP,说错了是因为网站机不想使用cloudflare拖慢访问速度。 既然一机两用,主要是为了省钱,所以除了两个域名public.com与private.com及一个服务器1.2.3.4,其他的全部用免费的产品,比如cloudflare与Let's Encrypt。 ## 网站机 简要说下流程。 第一步,开发一个网站,localhost跑起来。 第二步,购买一个域名public.com与一台服务器1.2.3.4,当然要买国外的。预计,域名大约100左右,服务器大约400左右,一共¥500每年,再便宜的话,可能配置过低或不稳定。 第三步,把网站上传至服务器的/var/www/public目录,配置好Nginx,mysql等,外网访问IP 1.2.3.4,成功打开网站。 第四步,在域名商那里进行DNS配置,比如A记录、CNAME记录与NS记录,其中NS记录使用你域名商默认的即可,成功打开http的public.com。 第五步,使用Let's Encrypt注册https,成功打开https的public.com。 网站机的nginx配置单独举个例子,方便与后面的代理机对比。 ``` server { server_name www.public.com; listen 443 ssl http2; ssl on; ssl_certificate /etc/letsencrypt/live/www.public.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.public.com/privkey.pem; location / { root /var/www/public; index index.html; } } server { server_name public.com www.public.com; listen 80; location / { root /var/www/public; index index.html; } return 301 https://www.public.com$request_uri; } ``` 因为是demo,上述配置只保留了最简单的部分,其中有几个细节要注意一下。 其一,监听443端口时,server_name没有写public.com,因为为了省事只注册了www.public.com 的https签名,造成的结果是https://public.com 404或301,这是正常的,保证网站口径一致带www即可。 其二,监听80端口处,进行了301重定向,保证http://public.com 与 http://www.public.com 都会跳到 https://www.public.com 。 其三,假设这个文件配置名字是 abc.conf,这里先放着,后面再说为什么配置名很重要。 ##### 使用 Let's Encrypt注册https 这里推荐certbot, 先选好某个目录,然后下载: ``` git clone https://github.com/certbot/certbot cd certbot ``` 再注册: ``` certbot certonly --webroot -w /var/www/public -d www.public.com -m a@gmail.com --agree-tos ``` 以上/var/www/public是网站根目录,a@gmail.com是你的邮箱。 这里有一个我不确定的地方,首次注册之时,好像需要在DNS配置处,写入一条TXT记录: ``` 名称是:_acme-challenge 内容是:第一次注册失败时,会显示出来的的key ``` 这条我不确定要不要,或者只要IP对了就可以?又或者我同一台服务上有多少域名的原因? 反正我有遇到这个问题: ``` Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: http-01 challenge for www.public.com Using the webroot path /var/www/public for all unmatched domains. Waiting for verification... Cleaning up challenges Failed authorization procedure. www.public.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from https://www.public.com/.well-known/acme-challenge/J3F22K--L58xYwizGM6CztGDY1xp4h4EUNLLoL-e6v5 [1.2.3.4]: "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-w" IMPORTANT NOTES: - The following errors were reported by the server: Domain: www.public.com Type: unauthorized Detail: Invalid response from https://www.public.com/.well-known/acme-challenge/J3F22K--L58xYwizGM6CztGDY1xp4h4EUNLLoL-e6v5 [1.2.3.4]: "<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-w" To fix these errors, please make sure that your domain name was entered correctly and the DNS A/AAAA record(s) for that domain contain(s) the right IP address. ``` 最后修改DNS配置解决了。 注意,如果失败了,不要一直尝试注册https,要省略机会(10次以下最好),否则会被限制的,比如: ``` An unexpected error occurred: There were too many requests of a given type :: Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/ Please see the logfiles in /var/log/letsencrypt for more details. ``` 成功的结果如下: ``` Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: http-01 challenge for www.public.com Using the webroot path /var/www/public for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/www.public.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/www.public.com/privkey.pem Your cert will expire on 2090-12-17. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le ``` 总的来说,网站机的部署,是个老调重弹的东西。 ## 代理机 为了保护你自己,你可以换一个邮箱及账号(非必须),接着,注册第二个域名 private.com ,值得一说的是,第二域名只是消耗品,不要买两年,买一年即可,买最便宜的那种,几块或小几十块。 在cloudflare官网,用第二个域名注册代理,其中A记录与CNAME记录,与之前一样的,只不过需要回到域名代理商的网站,设置NS: ``` fish.ns.cloudflare.com pete.ns.cloudflare.com ``` ##### 使用v2ray 下载客户端: 比如在windows环境,从https://github.com/2dust/v2rayN/releases 下载 v2rayN-Core.zip 解压后直接打开 v2rayN.exe 即可。 服务器 -> 添加[VMess]服务器 -> 生成 id,后面的步骤会用到。 服务器中安装v2ray: ``` bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-dat-release.sh) ``` 安装成功后显示: ``` installed: /usr/local/bin/v2ray installed: /usr/local/bin/v2ctl installed: /usr/local/share/v2ray/geoip.dat installed: /usr/local/share/v2ray/geosite.dat installed: /usr/local/etc/v2ray/config.json installed: /var/log/v2ray/ installed: /var/log/v2ray/access.log installed: /var/log/v2ray/error.log installed: /etc/systemd/system/v2ray.service installed: /etc/systemd/system/v2ray@.service removed: /tmp/tmp.Z8q0zMDyOu info: V2Ray v4.41.1 is installed. You may need to execute a command to remove dependent software: yum remove curl unzip Please execute the command: systemctl enable v2ray; systemctl start v2ray ``` 编辑v2ray的配置: ``` vi /usr/local/etc/v2ray/config.json ``` 内容如下: ```json { "log": { "access": "/var/log/v2ray/access.log", "error": "/var/log/v2ray/error.log", "loglevel": "warning" }, "inbounds": [ { "port": 33689, "listen": "127.0.0.1", "protocol": "vmess", "settings": { "clients": [ { "id": "1c76ca79-74ad-50c4-699e-2cf2921c3664", "level": 1, "alterId": 64 } ] }, "streamSettings": { "network": "ws", "wsSettings": { "path": "/main" } } } ], "outbounds": [ { "protocol": "freedom", "settings": {} }, ] } ``` 上述配置,其中path可以随便填个路径,id就是从上面的客户端生成的,port可以随便写但注意不要与现有进程冲突。 然后启动与查看v2ray ``` systemctl start v2ray systemctl status v2ray ``` ##### 配置private.com的Nginx: ``` server { server_name www.private.com; listen 443 ssl http2; ssl on; ssl_certificate /etc/letsencrypt/live/www.private.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/www.private.com/privkey.pem; root /var/www/private; index index.html; location /main { proxy_redirect off; proxy_pass http://127.0.0.1:33689; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; } } server { server_name www.private.com; listen 80; location / { root /var/www/private; index index.html; } } ``` 这里可以发现代理机与网站机的Nginx不同之处,/main使用了反向代理,到了v2ray 注意端口33689与/usr/local/etc/v2ray/config.json的的port值要保持一致,/main与/usr/local/etc/v2ray/config.json的/main也要保持一致。 至于private.com的https注册,与public.com同理,不再复述,需注意/var/www/private与/var/www/public不一样,邮箱如果不同也要注意。 重点的重点:该nginx的配置文件名是 a.conf ,它比网站机的b.conf 优先级更高!但访问针对于private不存在的网页时,不会301跳到public默认页,从而暴露自己! 重新加载nginx配置: ``` systemctl reload nginx ``` 如果打开https://www.private.com 可以看到/var/www/private/index.html的内容,表示成功了。 ##### 接着回到v2ray的客户端,填写各个数据: ``` address : www.private.com port: 443 id: 1c76ca79-74ad-50c4-699e-2cf2921c3664 与上述id保持一致,记得最开始要生成出来,不要自己编。 alterId: 64 security: aes-128-gcm network: ws remarks: 随便填 type: none path: /main 保持上述一致 底层安全: tls allowInsecure: true ``` 如果这个时候,你可以打开google,youtube之类的网站,表示你的代理机配置成功了,如果失败,往下看。 注意,v2rayN的v2.X与v4.x有个很不一样的地方。 在v2.x你,你需要: Enable Http proxy. Http proxy mode -> Open PAC and automatically configure PAC (PAC mode). (效果是外网走代理,内网直连) 在v4.x,你需要: Settings -> routingSetting -> Enable advanced routing function -> 绕过大陆(Whitelist). Http proxy -> Do not change system proxy.(如果还是不能上网,记得先切到其他模式,再变回来,相当于PAC) 使用了v2rayN后,记得在关闭电脑的代理,否则可能出现浏览器请求异常。 接着你要查看你的域名IP: ``` ping www.public.com 值为 1.2.3.4 这个真实IP ping www.private.com 值为cloudflare提供给你的IP ``` 整个过程就基本成功了。 如果这个过程失败了,说明cloudflare没有设置好。 其一,DNS处的Proxy status要设置为Proxied。 其二,SSL/TSL -> Overview -> Your SSL/TLS encryption mode is Full (strict) 其三,SSL/TSL -> Edge Certificates -> Always Use HTTPS is ture. 以上三个步骤缺一无可,否则要么你在裸奔,要么你的代理失败,报以下错误(这时,你的v2ray不开cloudflare代理可行,打开cloudflare就会失败): ``` failed to handler mux client connection > v2ray.com/core/proxy/vmess/outbound: failed to find an available destination > v2ray.com/core/common/retry: [v2ray.com/core/transport/internet/websocket: failed to dial WebSocket > v2ray.com/core/transport/internet/websocket: failed to dial to (wss://www.private.com/admins): 404 Not Found > websocket: bad handshake] > v2ray.com/core/common/retry: all retry attempts failed ``` 以上过程成功之后,你分别打开这八个地址,查看有没有什么异常: ``` http://public.com 结果:因为nginx 301设置,跳到https://www.public.com https://public.com 结果:证书不对,跳到第一个80端口的页面,即 /var/www/private/index.html http://www.public.com 结果:因为nginx 301设置,跳到https://www.public.com https://www.public.com 结果:正常打开 http://private.com 结果:因为cloudflare强制跳到https,所以会跳到https://private.com https://private.com 结果:证书不对,打开cloudflare的 Error 526 Invalid SSL certificate http://www.private.com 结果:因为cloudflare强制跳到https,所以会跳到https://www.private.com https://www.private.com 结果:打开/var/www/private/index.html ``` 如果上述8个结果如上述所示,表示完全成功了。(以上使用firefox尝试最好,使用chrome尝试的话,会发生坑爹的事) 额外一提,为什么 https://public.com 为什么不重定向到 /var/www/public/index.html呢?明明在nginx设置了: ``` return 301 https://www.public.com$request_uri; ``` 这是因为证书不对时,多个nginx conf存在时,在没有指定default_server的情况下,nginx会把第一个80端口的server_name当成default_server,第一个就是按conf名字排序来算的。我public conf名字为b.conf ,private 为a.conf,所以这样。 如果不想理会nginx conf的名字问题,也可以这么修改: ``` server { server_name www.private.com; listen 80 default_server: location / { root /var/www/private; index index.html; } } ``` ## 简单回顾 ##### 网站机过程: -> 浏览器访问https://www.public.com -> 域名商找到真实IP 1.2.3.4 -> 请求该服务器/var/www/public内容。 这个过程是裸奔的,你所有的请求信息,虽然说有https加密,但几乎全公开。 ##### 代理机过程: -> 开启v2rayN后 -> 浏览器访问google.com -> 假装在访问 https://www.private.com/main -> 域名商找到cloudflare -> 请求cloudflare某个代理服务器IP 比如5.6.7.8 -> 5.6.7.8 会指向到真实IP 1.2.3.4 -> 在真实IP的服务器上,把请求分发给 http://127.0.0.1:33689 即用v2ray打开google.com的内容,相当于你的请求,经过了两台代理机。(可以用抓包工具试试,比如fiddler,判断自己请求网站时,是否隐藏了真实请求。) 这种方式,优点是只会暴露出private.com与5.6.7.8,隐藏了你的public.com与1.2.3.4,安全性较高。缺点是经过了cloudflare之后网速奇慢无比,所以你可以写两条VMess记录,一条经过cloudflare,另一条不经过。
如果觉得有帮忙,您可以在本页底部留言。
相关推荐:
升级到php7.3与laravel5.8的问题记录
2核1G内存的服务器能承载多少人访问
Navicat远程连接Linux上MySql
Centos7+Nginx+PHP+MySQL搭建网站
Linux之新手村攻略
……
更多
<
读《欧也妮·葛朗台》,欲望对抗虚无
冰山之下的疯狂,读《克苏鲁神话合集》
>
全部留言
我要留言
内容:
网名:
邮箱:
个人网站:
发表
全部留言