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 つの欠点があります。これらの問題を克服したい場合は、以下の高度な設定部分を参照してください:
- 同じ 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 はコメントで彼がソースコードを見て/opt/
にあるこれらの 2 つのファイルにアクセスしていると言っていましたので、私はこう書きましたが、まだ実験していません。問題があればコメントで教えてください。
ワンクリックでコピーできるように、[ポートを公開する | カスタム設定を使用しない | コンテナ名を設定した]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 ブログでこの記事を読むことができます。
また、私のさまざまな更新を選択するためにこのページをチェックすることもできます。