Diygod の新しい記事優雅に Cloudflare WARP を使用して RSSHub のクローリング問題に対処する - DIYgodを見て、とても興奮し、自分のインスタンスに WARP を設定し始めましたが、彼とは少し異なる方法を使用し、ホストマシンで socks プロキシを開いて Docker コンテナに供給する方法を採用しました。
この記事は、docker run /docker compose を使用して構築された RSSHub に適しており、docker compose を例にして説明します。
DIYgod から:
なぜ WARP を使用するのか?
RSSHub を開発している数年間で、公共 API を提供するサイトは非常に少なく、多くのサイトはプラットフォームのコンテンツ取得を制限するために厳格なクローリング対策を講じています。同じ IP からの過剰なリクエストをブロックするサイトもあれば、一般的なクラウドサービスプロバイダーの IP アドレスを全面的にブロックするサイトもあります。そのため、最新の数件のコンテンツ更新を取得するだけでも非常に困難になっています。
この状況ではプロキシを使用する必要がありますが、専用のクローリングプロキシは通常高価で、コストパフォーマンスが非常に低いです。Cloudflare WARP の無制限のトラフィックと豊富な IP リソースが RSSHub で利用できれば素晴らしいです。RSSHub は一般的なプロキシプロトコルをサポートしており、WARP を一般的なプロキシとしてラッピングできれば問題ありません。
私自身はプロキシについての理解が浅く、この記事の内容は基本的に試行錯誤の結果です。改善点があれば、コメントで指摘してください。
以前、RSSHub(および Miniflux)のデプロイに関する記事を書きました:自作 RSSHub と Miniflux | Yunfi's Blog
RSS に関する概要の記事も書きました:RSS: とは?なぜ?どう使う? | Yunfi's Blog
Docker を使用してアプリケーションを構築する方法がわからない場合は、これを参照してください。Nginx Proxy Manager を例に、Docker のインストールからリバースプロキシの全過程を示しています:Docker シリーズ前提スキル:Nginx Proxy Manager を使用して Nginx を視覚的に管理する
興味のある方はぜひご覧ください。
2023/08/26 更新:セキュリティ問題の解決
方法の違い#
公式の方法は Docker を使用してデプロイします。
私が使用しているのはfscarmen/warpというプロジェクトのワンクリックスクリプトで、実際にはpufferffish/wireproxyを呼び出して SOCKS プロキシを生成しています。
比較 | Docker 方法 | スクリプト方法 |
---|---|---|
利点 | 簡単で便利、compose ファイルを更新するだけで済む | より柔軟で、WARP + やチーム版をより便利に使用できる;エンドポイントを優先選択可能 |
欠点 | カスタム設定の使用がやや面倒(2 つのファイルを自分で作成する必要がある) | ホストマシン上で直接操作するため、やや面倒 |
全体的に、Docker の方法は便利さにあり、スクリプトの方法は柔軟性にあります。また、スクリプトは他のことにも使用でき、例えば WARP + のトラフィックを増やすことができます。
公式リポジトリからダウンロードした docker-compose.yml をそのまま使用すると、同じ compose 内の他の Docker アプリケーションはそのコンテナが提供する WARP を使用できなくなります。少し修正が必要です。
WARP の無料版と他のバージョンの速度の違いはあまりないため、Docker でデプロイするのがより良い方法かもしれませんが、私はワンクリックスクリプトの方法を使用しています。なぜなら、私は元々これを使っていたからです😂また、ファイアウォールの設定も比較的簡単です。
Docker 版デプロイ#
クイックデプロイ#
DIYgod は WARP を追加した docker-compose.yml を RSSHub のメインリポジトリに置いていますので、直接使用したい場合は、ドキュメントデプロイ | RSSHubの手順に従ってください。
ただし、これには 2 つの欠点があります。これらの 2 つの問題を克服したい場合は、以下の高度な設定部分を参照してください:
- 同じ compose ファイル内のサービスのみがそのプロキシにアクセスできます。
- デフォルトの無料 WARP アカウントのみを使用できます。
注意すべき点は、直接提供されている docker-compose.yml は、よりスペースとメモリを占有する方法を使用しているため、ファイル内のコメントに従って操作することもできますし、以下の yaml を直接コピーすることもできます:
version: "3.9"
services:
rsshub:
image: diygod/rsshub:chromium-bundled
restart: always
ports:
- "1200:1200"
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: "redis://redis:6379/"
PROXY_URI: "socks5h://warp-socks:9091"
# 以下に他の環境変数を追加
depends_on:
- redis
redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
warp-socks:
image: monius/docker-warp-socks:latest
privileged: true
volumes:
- /lib/modules:/lib/modules
cap_add:
- NET_ADMIN
- SYS_ADMIN
sysctls:
net.ipv6.conf.all.disable_ipv6: 0
net.ipv4.conf.all.src_valid_mark: 1
healthcheck:
test: ["CMD", "curl", "-f", "https://www.cloudflare.com/cdn-cgi/trace"]
interval: 30s
timeout: 10s
retries: 5
volumes:
redis-data:
高度な設定#
上記の問題 1 については、ports を追加できますが、~~ セキュリティ上のリスクを伴う可能性があります(詳細は文末を参照)(解決済み)~~ports を 172.17.0.1 と 127.0.0.1 に設定することで、ローカルアプリケーションと他の Docker コンテナがアクセスできるようになりますが、他のソース IP からはアクセスできません;
問題 2 については、自分の conf ファイルをマウントすることができますが、相対的に複雑です。
warp-socks 部分を以下のように変更できます:(インデントに注意)
warp-socks:
image: monius/docker-warp-socks:latest
privileged: true
ports:
- "172.17.0.1:9091:9091"
- "127.0.0.1:9091:9091" # 問題1を解決
volumes:
- /lib/modules:/lib/modules
- ./wireguard:/opt:ro # 問題2を解決
cap_add:
- NET_ADMIN
- SYS_ADMIN
sysctls:
net.ipv6.conf.all.disable_ipv6: 0
net.ipv4.conf.all.src_valid_mark: 1
healthcheck:
test: ["CMD", "curl", "-f", "https://www.cloudflare.com/cdn-cgi/trace"]
interval: 30s
timeout: 10s
retries: 5
compose ファイルと同じディレクトリに新しい wireguard フォルダを作成し、その中にwgcf-profile.conf
とdanted.conf
(オプション)を置く必要があります。
以下はwgcf-profile.conf
ファイルの一例です。自分にこれらの値がある場合(例えば、Surge/Loon などのソフトウェアで WARP をいじったことがある場合)、それを参考にして埋めてください。まだない場合は、ViRb3/wgcfを使用して生成してみてください(WARP + やチーム版がない場合は自動的に無料版が生成されますので、- ./wireguard:/opt:ro # 問題2を解決
この行をコメントアウトしてください)。
[Interface]
PrivateKey = SNbsrC3W7PAcIvcdUUgqdRKBjOuUby1VPtDurefGJns=
DNS = 1.1.1.1
DNS = 1.0.0.1
Address = 172.16.0.2
Address = fd01:5ca1:ab1e:815a:634d:1529:f7a0:8f32
[Peer]
PublicKey = bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=
AllowedIPs = 0.0.0.0/0
AllowedIPs = ::/0
Endpoint = engage.cloudflareclient.com:2408
注意:ドキュメントではこれらの 2 つのファイルを
/opt/wireguard/
にマウントすることになっていますが、実際にはうまくいきませんでした。DIYgod はコメントで彼がソースコードを見て、これらの 2 つのファイルは/opt/
にアクセスすることを確認したと言っていましたので、私はこう書きましたが、まだ実際にテストしていません。問題があればコメントで教えてください。
一括コピーを便利にするために、[ポートを公開する | カスタム設定を使用しない | コンテナ名を設定した] docker-compose.yml
を以下に貼り付けておきます。gist に置いたものを直接 wget でダウンロードすることもできます。
wget https://gist.githubusercontent.com/yy4382/4f78b860fef29a7878e03a8a886a7367/raw/docker-compose.yml
version: "3.9"
# https://gist.githubusercontent.com/yy4382/4f78b860fef29a7878e03a8a886a7367/raw/docker-compose.yml
services:
rsshub:
image: diygod/rsshub:chromium-bundled
restart: always
container_name: rsshub-app
ports:
- "1200:1200"
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: "redis://redis:6379/"
PROXY_URI: "socks5h://warp-socks:9091"
# 以下に他の環境変数を追加
depends_on:
- redis
redis:
image: redis:alpine
container_name: rsshub-redis
restart: always
volumes:
- redis-data:/data
warp-socks:
image: monius/docker-warp-socks:latest
container_name: rsshub-warp
privileged: true
ports:
- "172.17.0.1:9091:9091"
- "127.0.0.1:9091:9091"
volumes:
- /lib/modules:/lib/modules
cap_add:
- NET_ADMIN
- SYS_ADMIN
sysctls:
net.ipv6.conf.all.disable_ipv6: 0
net.ipv4.conf.all.src_valid_mark: 1
healthcheck:
test: ["CMD", "curl", "-f", "https://www.cloudflare.com/cdn-cgi/trace"]
interval: 30s
timeout: 10s
retries: 5
volumes:
redis-data:
ワンクリックスクリプト版デプロイ#
原理は SOCKS プロキシを生成し、RSSHub がこのプロキシを使用することです。
プロジェクトfscarmen/warpを使用し、WARP Linux Client またはサードパーティプロジェクトpufferffish/wireproxyを使用してプロキシを生成できます。
WARP Linux Client | wireproxy | |
---|---|---|
無料版 | サポート✅ | サポート✅ |
WARP+ | サポート✅ | サポート✅ |
WARP Teams | サポートしない❌ | サポート✅ |
0.0.0.0 の SOCKS 生成 | サポートしない❌ | サポート✅、設定ファイルの変更が必要 |
WARP + にはライセンスが必要で、Teams には 4 つの認証スキームがあります。詳細は元のプロジェクトのREADME.mdを参照してください。
プロキシの生成#
現在、wireproxy のみが 0.0.0.0:40000 の socks を生成できるため、この方法を採用します。(Client に関する問題はこちらの issue を参照してください)
WARP Client を使用する場合、RSSHub のネットワークモードを host に変更する必要があり、これが Redis との接続に影響を与えるため、再度設定に手間がかかるため、お勧めしません。
wget -N https://raw.githubusercontent.com/fscarmen/warp/main/menu.sh && bash menu.sh w
手順に従って、設定したポートを記録してください。この記事ではデフォルトポート 40000 を例にしています。
初回実行後、
warp
コマンドとwarp h
を使用すると、2 つの異なるヘルプリストが表示されますので、ぜひ確認してください。
プロキシアクセス権の変更#
生成されたプロキシは localhost からのアクセスのみを許可しており、Docker コンテナからのアクセスはローカルマシンから見ると localhost ではないため、変更が必要です。
/etc/wireguard/proxy.conf
を開き、
[Socks5]
BindAddress = 127.0.0.1:40000
を以下のように変更します:
[Socks5]
BindAddress = 0.0.0.0:40000
RSSHub にプロキシを使用させる#
古い docker-compose.yml を開き、この行を追加します:
PROXY_URI: 'socks://172.17.0.1:40000'
ここでの172.17.0.1
は docker0 の IP で、通常はこれです。心配な場合はip addr show docker0
を実行して、inet 172.17.0.1/16
のようなものがあるか確認してください。
完全なファイルは以下の通りです:
version: "3.9"
services:
rsshub:
image: diygod/rsshub:chromium-bundled
restart: always
ports:
- "1200:1200"
environment:
NODE_ENV: production
CACHE_TYPE: redis
REDIS_URL: "redis://redis:6379/"
PROXY_URI: "socks://172.17.0.1:40000"
# 以下に他の環境変数を追加
depends_on:
- redis
redis:
image: redis:alpine
restart: always
volumes:
- redis-data:/data
volumes:
redis-data:
その後、docker compose up -d
を実行すれば完了です。
セキュリティの改善#
プロキシが0.0.0.0
をリッスンしているため、大きなセキュリティリスクがあります。サーバーの IP を知っている人は誰でもこのプロキシを使用できます。
もしあなたのサービスプロバイダーが追加のファイアウォール層を提供している場合、例えば Tencent Cloud、Alibaba Cloud、AWS、hz など、それが最も良いです。9091/40000 ポートが閉じていることを確認してください。
一方で、小さな VPS プロバイダーの場合、事態はそれほど簡単ではなく、ファイアウォールルールを適切に設定し、Docker が 40000 ポートにアクセスできるようにする必要があります。ufw の例:
sudo ufw allow from 172.17.0.0/16
終わりに#
実際、私の VPS の IP はかなり良好で、どのサイトにもクローリング対策を受けたことはありません。この設定は主に試行錯誤のために行いました。
途中でいくつかの問題に直面し、いくつかの遠回りもしましたが、最終的にはうまくいきました。
これらのプロジェクトの作者と RSSHub の仲間たちの指導に感謝します。
脇道:#
私が最初に WARP に触れたのは年初のことで、Surge に取り込んで ChatGPT をアンロックするためでした。Surge を通じて WARP を使用することや、チーム版 WARP を取得することに興味がある方は、当時見た 2 つのチュートリアルを参照してください:
本文はCC BY-NC-SA 4.0ライセンスの下で提供されています。
私の Hexo ブログでこの記事を読むことができます。
また、私の各方面の更新を選択するためにこのページもご覧ください。