[Github]Webhookを内部サーバへ通す

TIPS

GitHubのWebhookサーバーはインターネット上の「パブリック」な空間にありますが、Tailscaleのネットワーク(Tailnet)は「プライベート」な仮想ネットワークであるため、GitHub側から非公開の内部サーバーの名前を解決したり、直接アクセスしたりすることができないです。

ただし、Tailscaleの特定の機能や代替案を使うことで、これを実現可能にする「プロの解決策」が3つあります。

1. Tailscale Funnel を使う(最も直接的な解決策)

「Tailscale Funnel」は、プライベートなTailscaleネットワーク内のサーバーを、一時的にインターネットへ公開する機能です。

  • 仕組み: Tailscaleが提供するパブリックなDNS名(node-name.tail-net.ts.net など)を介して、GitHubからのWebhookを受け取れるようになります。
  • メリット: サーバー名(MagicDNS名)に近いURLをそのままWebhookの送り先に指定できます。
  • 設定イメージ:
    # 8080番ポートで動くWebhookレシーバーを公開する場合
    tailscale serve https:443 / http://localhost:8080
    tailscale funnel 443 on

2. GitHub Actions + Tailscale を使う(名前解決が可能)

Webhookではなく、GitHub Actionsをトリガーにする方法です。以前の回答でも触れましたが、GitHub Actions内でTailscaleを起動させると、アクション自体があなたのネットワークに参加します。

  • 仕組み: GitHub ActionsがあなたのTailnetの一員になるため、スクリプト内で server-name (MagicDNS名)を指定して通信が可能になります。
  • メリット: インターネットにポートを公開(Funnel)する必要がないため、よりセキュアです。
  • 設定例:
    YAML
    - name:
    Connect to Tailscale
    uses: tailscale/github-action@v2
    with:
    authkey: ${{ secrets.TS_AUTHKEY }}
    - name: Trigger script on server
    run: curl http://ubuntu-server:8080/deploy # サーバー名でアクセス可能!

3. Webhook Relay(プロキシ)を介する

GitHubからの入力をパブリックな場所で一度受け取り、それをTailscale経由で中継する手法です。

  • 仕組み: 公開サーバー(VPSなど)でWebhookを受け、そのマシンもTailscaleに入れておくことで、内部ネットワークのサーバー名へリレー(転送)します。
  • メリット: 常にFunnelを開放しておく必要がなく、特定のトラフィックだけを制御できます。

まとめ:どちらを選ぶべきか?

手法名前で通信可能か安全性おすすめのケース
Tailscale FunnelYes (パブリックURL)中 (公開される)外部サービスからの入力を直接受け取りたい場合
GitHub ActionsYes (MagicDNS名)デプロイや自動化処理をトリガーにしたい場合

コメント

タイトルとURLをコピーしました