跳至内容

使用服务器自建科学上网结点

Karson Zhong · Posted on 2022-12-06 · 291 Views

准备工作

  • 服务器:具有root权限且全球通,没有的看这里
  • 系统:linux(以Debian 11为例)
  • V2ray客户端

建立结点

安装v2ray

更新包信息

apt update

安装curl

apt install curl

安装v2ray

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

安装完毕后,控制台输出中有说明配置文件所在位置:

ExecStart=/usr/local/bin/v2ray run -config /usr/local/etc/v2ray/config.json

配置v2ray

打开配置文件

vi /usr/local/etc/v2ray/config.json

将文件替换为以下配置信息,并(输入命令:wq)保存:

提示:shell中可按ctrl+insert复制,并按shift+insert粘贴

{
    "log": {
        "access": "/var/log/v2ray/access.log",
        "error": "/var/log/v2ray/error.log",
        "loglevel": "warning"
    },
    "inbounds": [{
            "port": 11055,
            "protocol": "vmess",
            "settings": {
                "clients": [{
                        "id": "27848739-7e62-4138-9fd3-098a63964b6b",
                        "level": 1,
                        "alterId": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "ws",
                "wsSettings": {
                    "path": "/tech"
                }
            }
        }
    ],

    "outbounds": [{
            "protocol": "freedom"
        }
    ]
}

其中:
port 为连接的端口,可随意选择未使用的端口
id 将用作连接“密码”,可随机一个新的等长字段代替
path可修改为自己想要的路径

当然,如果觉得麻烦,也可以直接复制不做修改。

启动v2ray

启动并开机自启动:

systemctl start v2ray;systemctl enable v2ray

此时输入以下命令查看服务状态,应显示active(running)

systemctl status v2ray

连接服务器

在本地下载并打开v2ray客户端。新建v2ray结点,其中:
地址(address):服务器的公网IP
端口(port):配置文件中的port
用户ID(id):配置文件中的id
传输协议(network):配置文件中的network,为ws
路径(path):配置文件中的path,如果没改过则是/tech

设置完毕后,打开 www.google.com 应该可以看到回应。

开启BBR加速

BBR是一种新的拥塞控制算法,可以显著提升带宽与降低时延。

编辑系统配置文件

vi /etc/sysctl.conf

在文件最后,加入以下两行代码。

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

刷新系统配置文件

sysctl -p

最后,输入以下指令,验证输出分别为fqbbr即可:

sysctl net.core.default_qdisc
sysctl net.ipv4.tcp_congestion_control

反向代理v2ray

反向代理可以避免服务直接暴露至公网,而经过反向代理服务器控制转发。由于反向代理程序位于服务器本机,因此基本不会产生时延,也不会影响带宽。
建议申请一个域名进行反代(网上有免费域名申请,可以谷歌一下),否则反代的作用将大打折扣。

下载nginx服务器

apt install -y nginx

配置站点文件

可以配置一个静态(甚至动态)的网站,让我们的服务器看起来更Coooool一些!(才不是为了伪装涅)

创建服务器站点文件

在任意文件夹下,新建名为index.html的文件并打开,此处以/var/www/html为例:

vi /var/www/html/index.html

为站点编写主页文件

在打开的index.html中,加入以下代码。
此处可以自由发挥,只要是有效html文档即可:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>KarsonJo妙妙屋</title>
    <style>
        body {
            margin: 0;
        }

        .ctn {
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .link {
            background: #0007;
            padding: 20px;
            border-radius: 8px;
            color: pink;
            font-size: 72px;
        }

        .link:not(:hover) {
            text-decoration: none;
        }

    </style>
</head>

<body>
    <div class="ctn">
        <a class="link" href="https://www.karsonjo.com">
            欢迎访问我的博客!
        </a>
    </div>
</body>

</html>

设置nginx配置文件

先干掉默认的配置文件,我们不需要它,而且不希望它引起冲突!!

rm /etc/nginx/sites-enabled/default

新建nginx站点配置文件,名称随意,此处为v2ray.conf

vi /etc/nginx/conf.d/v2ray.conf

加入以下server

server{
    listen 80;
    server_name your.domain.com;
    index index.html;
    root /var/www/html/;
}

其中:
server_name为你的域名,如果没有域名,可以改为:_
root是站点的根目录,需要与站点文件路径匹配

注意!如果你的站点目录需要权限(比如位于/root文件夹下),需要打开主配置文件/etc/nginx/nginx.conf,并将第一行的user改为有权限的用户(比如root);否则将无法正常读取文件。

完毕后,需要重启nginx以刷新nginx配置文件:

systemctl restart nginx

验证站点访问性

此时,在浏览器中输入你的ip或者域名,应该就可以打开你的网站了!

nginx反代v2ray

在上一步的nginx配置文件的server块内,加入以下内容:

    location /tech {
        if ($http_upgrade != "websocket") {
          return 404;
        }
        proxy_redirect off;
        proxy_pass http://127.0.0.1:11055;
        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;
    }

其中:
location/tech需要与v2ray配置中的path对应(完全对应,不要额外加斜杠)
proxy_pass:后面的11055对应配置中的port(也不要在最后加斜杠)

然后重启nginx

systemctl restart nginx

配置v2ray结点

在v2ray客户端中复制你的结点,并做如下修改:
端口(port):nginx站点的端口,如果你按照教程,则是80

保存,连接,尝试访问谷歌,如无意外你应该能够正常打开。
至此,成功为我们的服务套上了一个正经站点。

但它不受TLS传输层安全保护,还是有一定风险。

配置TLS与CDN

本章节我们将使用TLS传输层安全保护我们的数据,并介绍用CDN对结点进行加速。

简单介绍

不涉及任何操作,不想看的可以放心跳过这部分。

什么是TLS

传输层安全TLS会加密整个HTTP Header + HTTP Body。因此在使用TLS后,外界无法获取包头的信息,使结点更加安全。

什么是CDN

CDN是内容分发网络,一般而言,CDN用于对数据的缓存与交付,以免暴露源站的地址以及节省源站流量。在该案例中,我们不会用到CDN的缓存功能,但其对源站的保护可以使结点更加安全;而且内容在经过CDN中转后,其的连接效果可能比直连效果更佳,从而达到加速效果。

简而言之,CDN也可视为是另一个反代服务器,只不过这个反代服务器位于互联网,而非服务器本机。

单独配置TLS

本文并不采取这种做法,因此该部分只做简要讨论。

你可以购买SSL或者生成自签证书配置TLS。
主要步骤大致如下:
1. 购买或生成你的SSL证书
2. 将证书加入nginx配置中(具体配置可参考下种做法的配置文件)
– 常用端口为443
– 可考虑将之前80端口的站点重定向至https的443站点
3. 复制上一步的v2ray结点,修改:
端口(port):修改为443
传输层安全(tls):开启为tls

使用cloudflare配置TLS与CDN

cloudflare作为赛博界一大慈善家,深得我们这群网络乞丐的痛爱,本步将介绍如何用cloudflare配置TLS与启用CDN加速。你需要先做如下准备:
– 准备一个域名

将域名接入Cloudflare托管

这一步就谷歌吧,一般按指引来就OK……

配置DNS

在左侧的站点菜单中,点击DNS,并做如下配置:

其中:
Type:选择A
Name:填写一个子域,比如:www
Content:填写你服务器的IP地址
Proxy status:记得点开小橙云!

生成SSL服务器证书

服务器证书用于向客户端(此处即cloudflare)证明自身的真实性。cloudflare接受两种证书:
– 受信任证书机构所签发的证书
– cloudflare签发的证书

因为前者比较难搞,因此使用cloudflare签发证书。
在左侧菜单点击SSL/TLS -> Origin Server,并按指引生成证书

注意:一旦刷新网页,私钥便永远无法再查看,妥善保存!!
生成后,将公钥(cert.pem)与私钥(key.pem)复制到服务器上:

vi /etc/ssl/cert.pem
vi /etc/ssl/key.pem

配置SSL客户端证书

客户端证书用于验证客户端(此处即cloudflare)的真实性。以保证站点流量源自cloudflare。

首先打开cloudflare侧的开关:

然后下载cloudflare的客户端证书,放到服务器上。
可执行此命令直接下载至/etc/ssl/coudflare.crt中:

wget -O - https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem > /etc/ssl/cloudflare.crt

启用SSL

在左侧菜单中的SSL/TLS -> Overview 选单中,将加密模式设置为Full(strict)

nginx配置SSL站点

将nginx配置文件替换为如下内容:

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  charset utf-8;
  server_name example.com;

  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  charset utf-8;
  server_name example.com;

  ssl_certificate /etc/ssl/cert.pem;
  ssl_certificate_key /etc/ssl/key.pem;
  ssl_client_certificate /etc/ssl/cloudflare.crt;
  ssl_verify_client on;
  ssl_session_timeout 1d;
  ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
  ssl_session_tickets off;

  # intermediate configuration
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  ssl_prefer_server_ciphers off;

  # HSTS (ngx_http_headers_module is required) (63072000 seconds)
  add_header Strict-Transport-Security "max-age=63072000" always;

  root /var/www/html/;
  index index.html index.htm;

  location / {
    index index.html index.htm;
  }

  location /tech {
    if ($http_upgrade != "websocket") {
      return 404;
    }
    proxy_redirect off;
    proxy_pass http://127.0.0.1:11055;
    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;
  }
}
  • 80端口(http端口)重定向至443(https)
  • server_name是你自己的域名。
  • ssl_certificatessl_certificate_keyssl_client_certificate分别是公钥、私钥、cloudflare客户端证书的位置。
  • v2ray反代中的/tech11055需要对应v2ray配置文件。

重启nginx

systemctl restart nginx

此时使用https://访问你之前的站点,应该可以正常打开。

配置v2ray结点

  • 地址(address):你在cloudflare DNS中设置的域名子域。比如域名为example.com子域为www,则是www.example.com
  • 端口(port)443(https端口)
  • 用户ID(id):配置文件中的id
  • 传输协议(network):配置文件中的network,为ws
  • 路径(path):配置文件中的path,如果没改过则是/tech
  • 传输层安全(tls):打开tls

保存,并尝试访问谷歌,应可以正常打开。

Cloudflare加速

按上一步的配置,服务器流量已经通过cloudflare中转,但对某些连接cloudflare非常困难的地区而言,这不单止没有加速效果,反而更加慢了。
Cloudflare连接国外服务器的速度事实上是非常迅速的。缓慢的原因是因为天朝某些地区连接cloudflare的速度慢,如果我们能够找到连接cloudflare的最快途径,则可以提升整体速度。

Cloudflare优选IP

Cloudflare内部是一个庞大的网络,如果我们有办法以最快的速度接入cloudflare,然后再通过某种形式,使真正对源服务器的寻址发生在cloudflare内网中,则可以提升整个连接的速度:
本机--(慢)-->Cloudflare服务器--(快)-->解析至源服务器--(快)-->与源服务器交换报文

worker

利用worker我们就可以实现“接入cloudflare后‘解析’至源服务器”。

创建worker

在cloudflare账号菜单(非站点菜单)中选择worker,并新建一个worker

配置worker

将worker的代码替换成如下,这段代码将使接入cloudflare的请求路由至你的服务器中:

addEventListener(
    "fetch",event => {
        let url=new URL(event.request.url);
        url.hostname="www.example.com";
        let request=new Request(url,event.request);
        event.respondWith(
            fetch(request)
        )
    }
)
  • url.hostname="...";填写你上一步使用的域名子域

点击 send 发送测试请求
响应应该为200 OK,而且文档内容是你的index.html的内容

为worker设置别名

由于worker已被ban,因此需要使用域名子域作为别名访问worker。

在DNS中新增一个A类型规则,新建一个子域,目标IP任意填写,比如1.2.3.4(不影响,我们只是为了接入cloudflare),记得打开小橙云。

在站点菜单中选择Workers Routes。添加一个指向你worker的路由。

其中:
– 路由按照新建DNS规则填写,比如子域为w3,填写w3.example.com/*
– worker选择刚刚新建的那个

配置v2ray

复制上一步的结点,做如下更改
地址(address):更改为worker别名,比如w3.example.com
伪装域名(host):同上

尝试打开谷歌,应该可以正常访问。
但此时我们还没做到“加速接入cloudflare”

优选IP

使用better-cloudflare-ip可以筛选出最快接入至cloudflare的IP。以websocket形式接入后,凭借所谓“伪装域名”(其实就是websocket host)可以路由至你的worker中,进而路由至你的源服务器。

你所做的只需:
– 下载better-cloudflare-ip
– 按指示优选一个IP
– 将上一步v2ray配置中的地址(address)改为优选IP

好耶!

大功告成!现在就可以无障碍网上冲浪咯!妈妈再也不用担心我查不到谷歌的资料涅。

程序员,热衷于游戏开发和软件制作。但也是一个杂食动物,喜欢探索各种赛博相关的奇技淫巧。

5 1 投票
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论

Nova - rebirth of a wonderful theme.

Theme Nova by KarsonJo

  • Serif
  • Sans Serif
切换主题 | SCHEME TOOL
Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
0
希望看到您的想法,请您发表评论x
0
希望看到您的想法,请您发表评论x