1611753340.jpg
前言
本文所述的所有内容仅供交流学习,请勿实际做出任何违反国家法律的行为!
[warn]请不要在互联网上公开自己搭建的反代站,P 站可能会发邮件到您的主机商投诉。如果您因为此种原因导致 VPS 服务等被终止,本人不负任何责任。[/warn]
准备工作
- 一台没被P站屏蔽的主机(vps)
众所周知 Vultr 大部分IP段都被P站屏蔽
- 一个船新的域名
其实随意啦,用自己域名的二级来弄也可,只是域名会变得比较长,且需要DNS商支持泛解析和三级域名解析
后续均以example.com来指代我们使用的域名,请灵性代换
- 使用“不需要通过验证站点文件来签发/续签”并且最好还支持泛域名的 SSL 证书
这里我们自然首推 Let's Encrypt,这是看起来唯一符合所有需求并且还免费的证书
域名及证书
需要使用哪些域?
在反代时我们需要用到以下几个域
如果你愿意使用一个船新域名专门反代:
example.com
*.example.com
*.pximg.example.com
- example.com
随意,你可以放点自己的东西做一些伪装或者说明,或者直接 301 到www.example.com,最终使用的是www.example.com.
- *.example.com
用于反代对齐*.pixiv.net
- *.pximg.example.com
用于反代对齐*.pximg.net,其实该域名中的pximg也可以替换成其他的字符串,只要不与P站的二级域名服务产生冲突即可.
- 泛解析的话,加上 , 代表任意。
如果你想用一个自己正在使用的域名反代并且不想影响该域名的其他服务:
pixiv.example.com
*.pixiv.example.com
*.pximg.example.com
各自作用同上,在后续配置上灵性修改即可。
获取SSL证书
这里采用Let's Encrypt 泛域名SSL(https://www.sslforfree.com/ )
这里用宝塔面板进行演示:
首先在宝塔面板中添加网站,这里添加两个网站进行反代操作,
*.example.com
为一个,*.pximg.example.com
pximg.example.com
为一个。
选择 Let's Encrypt 证书,并使用 dns 验证方式(dns验证才有泛域名SSL)
1.png
成功后
2.png
另一个同上操作。
也可以使用 acme 的 DNS API 方式进行挑战验证来签发证书,也很方便。
如果你愿意套 CloudFlare,你可以跳过这一节。
Nginx
[notice]不要使用 Tengine 等 Nginx 分支版本,在某些模块上可能会有一些奇怪的差异与问题[/notice]
基础配置
这里仅列出关键配置,通常配置例如listen、expires、cache以及 SSL 之类的不会写出,自行添加。
# *.example.com
server
{
server_name ~^([^.]+)\.example\.com$;
set $domain $1; //这个set 函数是自定义变量的,将 $1 的值传给 $domain 。而 $1 代表匹配式的第一部分,就是^([^.]+)部分。$2同理。
resolver 8.8.8.8;//定义反代理时用的DNS
location ~ .*
{
proxy_set_header Host $domain.pixiv.net;
proxy_set_header Referer "https://www.pixiv.net";
proxy_cookie_domain pixiv.net example.com;
proxy_pass https://$domain.pixiv.net;
proxy_ssl_server_name on;
proxy_set_header Accept-Encoding "";
proxy_redirect https://accounts.pixiv.net/ https://accounts.example.com/;
sub_filter "i-cf.pximg.net" "i.example.com";
sub_filter "pixiv.net" "example.com";
sub_filter "pximg.net" "pximg.example.com";
# 防止错误上报暴露站点
sub_filter "js_error.php" "block_js_error";
# 防止谷歌服务暴露站点,同时也可以加快网站加载
sub_filter "www.google" "block_google";
sub_filter_once off;
sub_filter_types *;
}
}
# *.pximg.example.com
server
{
server_name ~^([^.]+)\.pximg\.example\.com$;
set $domain $1;
resolver 8.8.8.8;
location ~ .*
{
proxy_set_header Host $domain.pximg.net;
proxy_set_header Referer "https://www.pixiv.net";
proxy_pass https://$domain.pximg.net;
proxy_ssl_server_name on;
proxy_set_header Accept-Encoding "";
sub_filter "i-cf.pximg.net" "i.example.com";
sub_filter "pixiv.net" "example.com";
sub_filter "pximg.net" "pximg.example.com";
# 防止错误上报暴露站点
sub_filter "js_error.php" "block_js_error";
# 防止谷歌服务暴露站点,同时也可以加快网站加载
sub_filter "www.google" "block_google";
sub_filter_once off;
sub_filter_types *;
}
}
详解
- server_name 与 set
使用正则表达式匹配以方便直接提取出我们要反代的二级域名
- resolver
必要,指定域名解析所用 DNS,因为在后续proxy_pass中我们要反代的域名是由$domain决定,本身是不定的,Nginx 必须被指定 DNS 才能处理域名解析
- proxy_cookie_domain
改变反代后返回的 header 中 set-cookie 里 cookie 对应的域名,只在*.example.com中需要,是解决登陆问题的关键,如想了解后续文章会解释
- proxy_ssl_server_name
由于 P 站开始上 CF 了,其 TLS 启用了 SNI,因此必须指定此项为on,否则会握手失败
- proxy_set_header Referer
设置 header 中的 Referer,主要目的是解决i.pximg.net的防盗链问题,以及www.pixiv.net的部分 API 的 Referer 验证问题
- proxy_set_header Accept-Encoding
将接受的压缩编码设为空,即不接受压缩,因为sub_filter无法对压缩过的内容起效
- proxy_redirect
将返回原站 302 的请求进行重定向
- sub_filter
将反代后得到的内容进行字符串替换,以保证链接域名等与反代域名一致
- sub_filter_types
必须设置为*,否则默认对于 API 返回的 json 内容等不会进行替换,会导致依靠 ajax 运作的一些功能的异常
什么?不会?
这里以宝塔面板简单演示:
首先配置 *.example.com
打开站点修改,选择配置文件修改,在
server
{
listen 80;
后添加一行server_name ~^([^.]+)\.example\.com$;
再将后面一行
server_name *.你的域名;
删除。
在
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/你的域名;
后添加
set $domain $1;
resolver 8.8.8.8;
location ~ .*
{
proxy_set_header Host $domain.pixiv.net;
proxy_set_header Referer "https://www.pixiv.net";
proxy_cookie_domain pixiv.net example.com;
proxy_pass https://$domain.pixiv.net;
proxy_ssl_server_name on;
proxy_set_header Accept-Encoding "";
proxy_redirect https://accounts.pixiv.net/ https://accounts.example.com/;
sub_filter "i-cf.pximg.net" "i.example.com";
sub_filter "pixiv.net" "example.com";
sub_filter "pximg.net" "pximg.example.com";
# 防止错误上报暴露站点
sub_filter "js_error.php" "block_js_error";
# 防止谷歌服务暴露站点,同时也可以加快网站加载
sub_filter "www.google" "block_google";
sub_filter_once off;
sub_filter_types *;
}
保存。不要忘记修改代码里面的 example.com 为你自己的域名。
*.pximg.example.com 网站操作类似。
打开站点修改,选择配置文件修改,在
......同上
后添加一行
server_name ~^([^.]+)\.pximg\.example\.com$;
在
......同上
后添加
set $domain $1;
resolver 8.8.8.8;
location ~ .*
{
proxy_set_header Host $domain.pximg.net;
proxy_set_header Referer "https://www.pixiv.net";
proxy_pass https://$domain.pximg.net;
proxy_ssl_server_name on;
proxy_set_header Accept-Encoding "";
sub_filter "i-cf.pximg.net" "i.example.com";
sub_filter "pixiv.net" "example.com";
sub_filter "pximg.net" "pximg.example.com";
# 防止错误上报暴露站点
sub_filter "js_error.php" "block_js_error";
# 防止谷歌服务暴露站点,同时也可以加快网站加载
sub_filter "www.google" "block_google";
sub_filter_once off;
sub_filter_types *;
}
保存。不要忘记修改代码里面的 example.com 为你自己的域名。
3.png
增强隐蔽性(建议)
防止被搜索引擎收录
在 Nginx 配置中向每个 server 添加此句
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|^$") {
return 403;
}
请加到set $domain $1;这句之后,因为该配置也使用了正则表达式,会导致$1改变
禁止大陆外IP访问
由于反代P站的受众只可能为大陆内用户,因此我们完全可以禁止大陆外IP访问反代站,同时还能防止P站检测投诉
但请注意,这个方案是对整台 VPS 的80与443端口生效,这意味着你如果同时在 VPS 上布置了其他站点,他们也将无法被大陆外用户访问
如果需要仅对反代站点生效,请自行百度参考“nginx geoip”,或者使用后面所述的套 CloudFlare 的方式
参考步骤:
- 安装 ipset:
#Debian / Ubuntu
apt-get -y install ipset
#CentOS
yum -y install ipset
````
- 创建一个 ipset 并添加大陆IP作为白名单:
ipset -N cnip hash:net for i in $(curl https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt); do ipset -A cnip $i; done
如果你想要添加单个IP x.x.x.x 进此白名单
ipset -A cnip x.x.x.x/32
- 写入防火墙规则(顺序十分重要,请不要改变执行顺序):
iptables -I INPUT -p tcp --dport 443 -j DROP
iptables -I INPUT -p tcp --dport 80 -j DROP
iptables -I INPUT -p tcp -m set --match-set cnip src -j ACCEPT
## 套 CloudFlare
除了上述方案外,我自己是套了层 CloudFlare,并设置了防火墙规则来阻止非国内以及搜索引擎爬虫访问
这样有个优点,一是 SSL 证书都是 Cloudflare 自动签发和续期的,因此使用 Flexible SSL 选项,然后源反代站就不需要操心证书的事了,直接使用 HTTP;二是 Cloudflare 的防火墙可以实现上面提到的屏蔽国内 IP 以及搜索引擎的功能,不需要自己去维护
当然这样是有缺点的,就是设置 DNS 记录
**Cloudflare CDN 是不支持设置泛域名记录的**
因此我们只能一条一条记录加,首次部署简直是要了命,以下列出主站功能相关域名:
www.pixiv.net
accounts.pixiv.net
source.pixiv.net
imp.pixiv.net
i.pximg.net
s.pximg.net
pixiv.pximg.net
其他的例如小说、直播等等我个人使用频率很低所以我就不考虑了,当然如果你有需求就自己找域名吧(
### 替换图片域名为其它域名
站长资金紧张,于是又补充了这一条。
原pixiv图片服务域名是 i.pximg.net ,将它换成别人的公开代理服务可以大大降低服务器流量。
第一步:
*.pximg.example.com
找到这一个域名的配置文件
修改
sub_filter "pximg.net" "pximg.example.com";
这一项中的
pximg.example.com
域名删去,留空。
第二步:
找到
*.example.com
这一个域名的配置文件
新添加一项
就加在有相似的条目的那一堆里。
sub_filter "pximg.net" "example.com";
其中
example.com
为
pixiv图片反代理服务域名
### 发送头部信息实现绕过谷歌验证自动登入
灵感来源于原文的评论区的评论
注意!
此方法会暴露你的pixiv账户,别人可能会由此获得你的账户的全部权限!!!
所以,找个不重要的pixiv账户或者严格保护自己的反代理网站,防止他人访问。
在两个网站的配置文件里添加,添加方法同上。
proxy_set_header Cookie "这里是你pixiv的cookie";
如何获取cookie?
电脑端
参考文献:
https://jingyan.baidu.com/article/d5c4b52b4dd08ada570dc556.html
手机端
下载Alook 浏览器
https://www.coolapk.com/apk/alook.browser
在工具箱的开发者工具里面可以直接复制cookie。
获取cookie前必须登入,登入后待在跳转后的页面就行。
### 其它
还可以再添加一些额外的反代理配置增加访问的流畅度。
例如:
反代理并替换
https://a.pixiv.org/yufulight-cdn/apt.js
这一个网址,
反代理配置就不说了,替换配置:
sub_filter "你的反代地址" "a.pixiv.org";
添加到
*.example.com
域名配置文件就行。
### 局限性/缺点
不能使用绑定的社交账号的登录方式.
账号可能会出现需要 reCAPTCHA 验证导致无法登录,无解,可能存在尚未发现的问题,只能自己将原站已登录的 cookie 导出,替换域名,然后导入反代站来进行登录.
例如:
用 Cookie-Editor 之类的扩展,在原站登录后将 cookie 导出,然后用文本编辑器批量替换下域名,再到你的反代站导入.
不想导入导出 cookie 的,可以手机浏览,可以不用登录......
比较费主机(vps)流量,是在用金钱浏览pixiv.
千万不能对外发布自己的站点,有几率被举报,很严重.
声明:
本文内容参考了
**神代綺凜** 原创的 **[Pixiv] Nginx 真·反代P站** https://moe.best/technology/pixiv-proxy.html
在原文章基础上做了改编补充,遵守**知识共享署名-非商业性使用 4.0 国际许可协议**。
[1]: /usr/uploads/2022/03/1663119255.jpg
[2]: /usr/uploads/2022/03/1121969484.png
[3]: /usr/uploads/2022/03/3428803700.png