Skip to content

Instantly share code, notes, and snippets.

@zyzsdy
Created July 10, 2022 08:19
Show Gist options
  • Save zyzsdy/5d17cca4dfe470351776bd50fccb7b78 to your computer and use it in GitHub Desktop.
Save zyzsdy/5d17cca4dfe470351776bd50fccb7b78 to your computer and use it in GitHub Desktop.
本地部署一个nginx反代用来解除B站区域限制的教程

本地部署一个nginx反代用来解除B站区域限制的教程

相信很多人都在用“解除B站区域限制”这个脚本来看番。但是它只是提供了一个脚本,真正解除区域限制是通过海外服务器请求B站API实现的。 也就是我们还需要一个海外服务器。

尽管很多人提供了公共的海外服务器,但是毕竟这些服务器经常都会不稳定。 有些群友就想了,我自己的梯子可以直接看港澳台,那么能不能用我自己的梯子来直接给这个插件做代理呢?

答案肯定是能的。

不过在这之前,先让我们说说为什么要本地梯子去代理B站API。

为什么梯子能直接看,还要用本地的反代?

有些人可能要问了:既然我的梯子可以直接看港澳台番剧,那我直接看就行了呗,为啥还要多此一举装个脚本再用代理呢?

答案就是通过“解除B站区域限制”脚本,我们可以只对API进行代理,而占据绝大多数的流量的视频本身仍然是直连。 B站是国内的视频网站,所以视频直连是很快的,甚至比走代理还快。

(当然如果你的梯子特别好,也没有流量困扰,当然可以挂代理直接看,这是最稳定也是风险最低的方式)

准备脚本

(这段略过,大家都会)

建议使用Chrome扩展“暴力猴”来运行脚本。

准备HTTPS证书

1. 下载OpenSSL

反代服务器必须有一张合法的证书才能让浏览器认可。如果你有一个域名,那么你可以去Let's Encrypt之类的地方去申请一个免费证书。然后你就可以跳到下一步了。

我们这里来讲如何生成一个本地的自签名证书并让系统认可它。

首先你需要openssl。我推荐去这个地址下载OpenSSL的Windows版。 注意不要下带有“light”的版本,我们要的是完整版。

这里比较难挑版本,所以你可以通过这个链接直接下载Win64 OpenSSL v3.0.5的安装包。 双击安装即可。(注意在安装的最后一步会请求你捐赠,取消所有的勾再点完成即可)

然后打开一个终端(Win+R cmd),在里面输入openssl version,如果成功显示出OpenSSL 3.0.5 5 Jul 2022 xxxxxxx的内容就是安装成功了。(如下图)

image

2. 制作CA证书

我们首先找一个空目录用来存放之后产生的各种文件。我这里用了G:\EnvTools\certs-biliapi这个目录。 记得在决定目录后要在CMD里用cd /d G:\EnvTools\certs-biliapi让当前目录指向这个目录。

在这个目录里创建一个文本文件(推荐用VSCode之类的编辑器,实在没有,用记事本也行),命名为ca.cnf

内容参考如下:

[ req ]
distinguished_name  = req_distinguished_name
x509_extensions     = root_ca

[ req_distinguished_name ]
countryName             = CN
countryName_min         = 2
countryName_max         = 2
stateOrProvinceName     = Shanghai
localityName            = Shanghai
0.organizationName      = MeowSound Idols
organizationalUnitName  = iKP
commonName              = iKP Local Test ROOT CA
commonName_max          = 64
emailAddress            = info@meamea.moe
emailAddress_max        = 64

[ root_ca ]
basicConstraints            = critical, CA:true

其中countryName是两位国家代码,必须填一个实际存在的两位国家代码。剩下的数字不建议修改,文本的什么stateOrProvinceName啊commonName啊可以随便改。 多说一句,commonName是这个证书的识别名,建议填一个好记的。

然后我们回到cmd里面,执行

openssl req -x509 -newkey rsa:2048 -out ca.crt -outform PEM -keyout ca.key -days 10000 -verbose -config ca.cnf -nodes -sha256 -subj "/CN=iKP Local Test ROOT CA"

其中最后的/CN=xxx等号后面的部分是前面填的证书识别名,建议填成一样的(虽然也可以不一样,但是那样会比较迷惑)

回车以后你会发现在刚才那个文件夹中生成了ca.crtca.key两个文件。ca.crt就是根证书,ca.key就是根证书的私钥。

3. 安装根证书

我们接下来必须要让系统承认我们自签名的这张证书是有效的。

2018年以前在PC版12306官网上买过火车票的应该都会。

双击ca.crt,你会看到“此 CA 根目录证书不受信任...”之类的字样。单击下方的“安装证书”,打开证书导入向导。我们选择存储位置为“本地计算机”。 然后选择“将所有的证书放入下列存储”,单击下面的“浏览”,然后选择“受信任的根证书颁发机构”并点击确定。 之后一路点击下一步直到弹出“导入成功”的提示。

关闭所有对话框后重新双击ca.crt打开,发现没有任何警告了,就是已经安装好根证书了。

4. 为我们的子域名签发一张HTTPS证书

我们打算为biliapi.test.local这个域名签发一张本地HTTPS证书。这个域名你可以随便选择(我们会在最后一步将它解析到本地)。 但是建议你选择以.local作为后缀的名字,因为这是为你的本地局域网保留的特殊后缀,使用这个后缀可以避免不小心覆盖互联网的某些真实域名而导致你的网络出错。

我们这里选择biliapi.test.local这个域名,记好这个域名,后面要多次使用。

首先我们在CMD里执行

openssl req -newkey rsa:2048 -keyout server.key -out server.req -subj "/CN=biliapi.test.local" -sha256 -nodes

上面命令的/CN=xxx中,CN=后面的内容是我们选择的域名。

执行完成后你会看到文件夹中多出了server.keyserver.req两个文件。其中server.key是私钥。

然后在文件夹中用VSCode(或者记事本,或者随便什么编辑器)创建一个名为server.ext的文本文件,内容如下

subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = biliapi.test.local

然后再在CMD里执行

openssl x509 -req -CA ca.crt -CAkey ca.key -in server.req -out server.crt -days 3650 -extfile server.ext -sha256 -set_serial 0x0445

其中-set_serial后面的是证书的编号,以0x开头的十六进制数字,可以随便设。

执行后会发现生成了server.crt。双击打开,依旧没有警告,说明成功了。

准备Nginx作为本地代理服务器

1. 下载Nginx

Nginx是著名的HTTP服务器,我们这次用它来进行本地代理。如果你对Nginx的配置非常熟悉,可以参考下面的配置示例自己配置。

首先我们去官网下载一个Nginx。打开Nginx的下载页,找到Mainline version的标有Windows字样的链接下载。 比如现在的最新版就是nginx/Windows-1.23.0,点这个就行。

(什么?你问我Linux的怎么办?apt install nginx去吧,相信你既然用的是Linux了,那这一步也难不倒你)

下载到一个zip以后本地随便找个目录解压。但是这个目录路径里面最好不要有中文。解压完了以后你应该看到这样

image

2. 配置Nginx

然后我们打开conf目录,里面应该有一个nginx.conf文件。把它打开。

里面的内容应该是像是下面这样的:

worker_processes 1;

xxxxx(一堆东西)

http { #<----找到这个!!!!

    xxxxx(又是一堆东西)
    
    server { #<----找到这个!!!!
    
        xxxxx(又是一堆东西,不要管它)
    } #<----重点是这个!!!!
    
    【记住这个位置】
    
} #<----千万记得这里还有一个大括号

我们在http配置块中找到已经存在的一个server块,我们不去管它,在下面再增加一个server块。(上面我标记的【记住这个位置】的位置),填入下面的内容

    server {    
        listen 443 ssl;
        server_name biliapi.test.local;

        ssl_certificate "G:/EnvTools/certs-biliapi/server.crt";
        ssl_certificate_key "G:/EnvTools/certs-biliapi/server.key";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 10m;
        ssl_session_tickets on;

        client_max_body_size 128M;

        location /pgc/player/api/playurl { 
            proxy_pass https://api.bilibili.com;
        }

        location /pgc/player/web/playurl {
            proxy_pass https://api.bilibili.com;
        }
    }

其中,server_name的后面填上我们刚才选择的本地域名biliapi.test.local ssl_certificate的后面填上刚才生成的server.crt的路径。 ssl_certificate_key填上刚才生成的server.key的路径。 注意路径中的目录分隔符用的是斜杠“/”,而不是Windows常用的反斜杠“\”。

3. 测试配置文件并启动

我们返回上层目录(就是有nginx.exe的那一层)。打开一个CMD,将当前目录改成这个目录。然后输入nginx.exe -t

如果显示

nginx: the configuration file xxxxxxxxxxxxxxxxx syntax is ok
nginx: configuration file xxxxxxxxxxxxxxxxx test is successful

说明配置文件写的没有问题。如果写错了请返回修改。

如果没有问题,就双击nginx.exe启动。注意这两步都有可能弹出Windows防火墙的提示,选择允许nginx访问网络即可。

nginx的启动大概是出现一个黑窗口就马上消失了,这是正常情况,nginx会在后台运行。你可以查看任务管理器的“详细信息”,在里面应该能看到两个nginx.exe进程。

我们直接通过浏览器打开 http://localhost/ 也能看到 Welcome to nginx! 的测试页。说明nginx启动成功了。 如果想让nginx自动启动,可以为nginx建立一个桌面快捷方式,然后把快捷方式复制到“启动”文件夹中即可。

4. 让Nginx通过代理

默认情况下,Nginx不会通过代理。(如果开全局那这个贴就没意义了) 我们这里采用Proxifier让Nginx强行通过代理。

Proxifer的配置就不赘述了。

我们建立一个规则,在适用的应用里填写nginx.exe,在目标主机里填写*.bilibili.com,在目标端口里填写443。然后将动作选为通过代理。

这样最大程度的保证我们不会误伤其他的流量通过代理。(如下图)

image

完成插件的配置

1. 解析本地域名

之前我们配置了一个本地域名biliapi.test.local。但是这个域名现在还无法访问。我们要修改hosts文件进行本地解析。

首先我们打开开始菜单,找到“记事本”,右键,选择“用管理员身份打开”。然后在记事本中选择“文件”->“打开”

选择C:\Windows\System32\drivers\etc,在右下角将 “文本文件 (*.txt)” 改成 “所有文件 (*.*)” 可以看到有一个没有后缀名的文件,就叫hosts。 选中这个文件后打开。

在最后一行加入

127.0.0.1 biliapi.test.local

然后保存,并关闭记事本。

你可以打开一个cmd,然后ping biliapi.test.local。如果发现显示了来自 127.0.0.1 的回复就是设置成功了。

2. 配置脚本

我们完成了几乎所有工作,现在biliapi.test.local就是你的本地服务器。

随便找一个港澳台番剧,比如这个吧。你应该能在“追番”按钮的右边看到地球状的配置按钮。 点开它。

然后在“自定义(首选服务器)”里填上https://biliapi.test.local就好了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment