完全反向代理pixiv

August 30, 2021 · 技术 · 95次阅读

前言

本文所述的所有内容仅供交流学习,请勿实际做出任何违反国家法律的行为!

请不要在互联网上公开自己搭建的反代站,P 站可能会发邮件到您的主机商投诉。如果您因为此种原因导致 VPS 服务等被终止,本人不负任何责任。

准备工作

  • 一台没被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

不要使用 Tengine 等 Nginx 分支版本,在某些模块上可能会有一些奇怪的差异与问题

基础配置

这里仅列出关键配置,通常配置例如listen、expires、cache以及 SSL 之类的不会写出,自行添加。

   # *.example.com
     server
     {
     server_name ~^([^.]+)\.example\.com$;
     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 *;
    }
 }


#    *.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

其他的例如小说、直播等等我个人使用频率很低所以我就不考虑了,当然如果你有需求就自己找域名吧(

局限性/缺点

不能使用绑定的社交账号的登录方式.

帐号可能会出现需要 reCAPTCHA 验证导致无法登录,无解,可能存在尚未发现的问题,只能自己将原站已登录的 cookie 导出,替换域名,然后导入反代站来进行登录.
例如:
用 Cookie-Editor 之类的扩展,在原站登录后将 cookie 导出,然后用文本编辑器批量替换下域名,再到你的反代站导入.

不想导入导出 cookie 的,可以手机浏览,可以不用登录......

比较费主机(vps)流量,是在用金钱浏览pixiv.

千万不能对外发布自己的站点,有几率被举报,很严重.

声明:

本文内容参考了
神代綺凜 原创的 [Pixiv] Nginx 真·反代P站 https://moe.best/technology/pixiv-proxy.html
在原文章基础上做了改编补充,遵守知识共享署名-非商业性使用 4.0 国际许可协议

喝杯水 ENJOY 0

原创转载

最后编辑于2个月前

添加新评论

avatar

柳铃

18

文章数

247

评论数

5

分类

新鲜出炉の评论

网站的修理
tht
tht2021-08-17

https://nicemoe.cc/

网站的修理
ha
ha2021-08-17

https://app.mediatrack.cn/