はじめに
cloudflared はCloudflareが提供するサービスで無償で登録なしに利用できるトンネリングのサービスです。
そこでPythonに実装する方法を紹介します。
例えば、これを利用すると通常は外部からのアクセスが容認されていないサービスに、外部からのアクセスできるバックドアのようなものも利用できると思います。
これらを実装するためにpycloudflaredのモジュールを利用します。
これはpython cloudflared wrapperです。
実装サンプル
pycloudflaredをインストールします。
pip install pycloudflared
簡単なPythonのシンプルHTTPサーバーをpycloudflaredで公開するサンプルです。
http_server.py に保存しています。
import http.server
import socketserver
from http import HTTPStatus
from pycloudflared import try_cloudflare
class SilentRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
self.send_response(HTTPStatus.OK)
self.send_header("Content-type", "text/html")
self.end_headers()
self.wfile.write(b"Hello World")
def log_message(self, format, *args):
pass
PORT = 8000
Handler = SilentRequestHandler
server = http.server.HTTPServer(("", PORT), Handler)
server.allow_reuse_address = True
print(f"Serving on port {PORT}")
try:
print("Setting up Cloudflare tunnel...")
try_cloudflare(port=PORT)
server.serve_forever()
except KeyboardInterrupt:
print("Shutting down...")
server.shutdown()
これを実行します。
python3 http_server.py
Serving on port 8000 Setting up Cloudflare tunnel... * Running on https://beads-respondent-charleston-reporter.trycloudflare.com * Traffic stats available on http://127.0.0.1:37747/metrics
外部からアクセスして確認します。
curl -Ssi https://great-testimonials-perl-accordingly.trycloudflare.com HTTP/2 200 date: Sun, 19 Mar 2023 02:31:02 GMT content-type: text/html cf-ray: 7aa24c009a111d97-NRT cf-cache-status: DYNAMIC server: cloudflare Hello World
内部からアクセスします。
curl -Ssi localhost:8000 HTTP/1.0 200 OK Server: SimpleHTTP/0.6 Python/3.10.6 Date: Sun, 19 Mar 2023 02:35:45 GMT Content-type: text/html Hello World
以上で確認は完了です。
*サンプルの一部コードはGPT-4により生成しています
まとめ
cloudflaredをpythonで実装する方法を紹介しました。cloudflareがホストしていることや、python に組み込んで簡単に利用したい場合にはよいツールなのではないでしょうか。
このようなツールには悪用されるケースがあるため注意も必要です。


