tailscaleを使ってスクレイピングをするための基盤を作る

スクレイピングするツールをいくつか動かしているんだけど、AWS からアクセスするとサイトによってはブロックしてくることがあった。これを解決するためのソリューションを見つけたので書く。 自宅からアクセスする分には許可されているので、自宅のネットワークを経由すればよさそう。

tailscale を使うと自宅ネットワークを経由してアクセスでき、これを使うとアクセス元を隠蔽できる。こいつを使っていく。 ちなみに apple tv を exit node にするのがおすすめ。android 端末にも設定できるらしいけど、パフォーマンスが出にくいらしい。apple tv だと有線 LAN を繋げれるので安定するでしょうし、セットアップも簡単で画面をぽちぽちしていくだけ。

Github Actions のセットアップ

ツールによっては GA からもスクレイピングしたい。 https://zenn.dev/mimi_chan/articles/599841c45b4d49 あたりをそのままやったらできた。今回は exit node を指定する必要があるので tailscale setコマンドを追加で呼び出す必要がある。これだけで GA 上でツールが動いた。感動した。

- name: Connect to Tailscale
  uses: tailscale/github-action@v2
  with:
    oauth-client-id: ${{ secrets.TAILSCALE_OAUTH_CLIENT_ID }}
    oauth-secret: ${{ secrets.TAILSCALE_OAUTH_CLIENT_SECRET }}
    tags: tag:ci
- name: Use named exit node in tailscale
  run: |
    timeout 5m sudo -E tailscale set --exit-node="apple-tv"

Lightsail のセットアップ

サーバの運用をしたくなかったので、AppRunner か Lambda 上で動かしたかったのだけど、ヘルスチェックが通らなくて諦めた。ec2 も検討したけどめんどくさくなって結局 Lightsail にした。 TCP, UDP を全許可しつつ、tailscale のインストールと起動を行う。

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --authkey=tskey-auth-XXX --hostname=aws-lightsail-app --exit-nod=apple-tv

問題が発生した。 exit-node に apple-tv を指定して tailscale を起動すると、パブリック IP アドレスが見えなくなることに気がついて適当にググったらドンピシャな issue が出てきた。
https://github.com/tailscale/tailscale/issues/10940

sudo apt-get install nftables
sudo vi /etc/nftables.conf

以下を追記して、 sudo systemctl restart nftables を実行。

table inet allow-incoming-traffic {
        chain allow-incoming {
                type filter hook input priority -100; policy accept;
                tcp dport { 22, 80, 443 } meta mark set 0x00080000
                udp dport { 22, 80, 443 } meta mark set 0x00080000
        }

        chain allow-outgoing {
                type route hook output priority -100; policy accept;
                tcp sport { 22, 80, 443 } meta mark set 0x00080000
                udp sport { 22, 80, 443 } meta mark set 0x00080000
        }
}

$ curl inet-ip.infoを実行すると自宅経由になった。あとはこのサーバに適当なアプリケーションを動かせば OK。


今思えば、nftables 相当のことを AppRunner でもやってあげればヘルスチェックが通る気がする。今後にやってみたい。

以上。