2023年1月9日

cloudflaredでMisskeyサーバーを立ち上げるメモ

cloudflared (Cloudflare Zero Trust, Cloudflare Tunnels)でMisskeyサーバーを立ち上げます。Misskeyのインストールはbash-installで行います。

作業中にメモするのではなく作業後に記事を書いたため、抜けや間違いがある気がします。

  • ポート解放しなくて良い
    自宅サーバーではルーターの設定を変更しなくて済むし、クラウドサービスはエグレス以外弄らなくて良い
  • IPアドレスが変わっても平気
  • 手順数は減らない、むしろ特殊な作業なので面倒なまである
  • Cloudflareにドメインを登録する必要がある、つまり結局ドメインを買う必要はある

Cloudflareにサインアップしていない場合はまずサインアップする。
そして、ドメインをClouflareに登録しよう。

Cloudflare Zero Trustのダッシュボード https://one.dash.cloudflare.com/ にアクセスする。

Access > Access Groupsでアクセスグループを作成する。

名前は適当で良い。

Group configurationのIncludeで、Selector = Emails / Value = 自分が受信可能なメールアドレス を設定する。

Settings > Authentication > Login methodsでAdd newを選択したのち、One-time PINを選択。
選択するだけでログインメソッドにOne-time PINが追加される。

Cloudflare Tunnelsをセットアップする。

最新の情報を以下のURLで確認すること。
https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/remote/

ネットワーク接続のバッファサイズを拡張するため、サーバーで次のコマンドを実行する。

sudo sysctl -w net.core.rmem_max=2500000

もしこれを忘れるか後回しにした場合は、cloudflaredのデーモンを再起動する。
(順番通りに読んでいる場合は実行しなくて良い)

sudo systemctl restart cloudflared

Zero TrustダッシュボードでAccess > Tunnelsを開き、Create a tunnelを選択。名前は適当で良い。

Choose your environmentでOSとアーキテクチャを選択する。Ubuntuの場合はDebianを選択する。If you don’t have cloudflared installed on your machine:の内容をコピーし実行する。
これを、サーバー上および手元のパソコンのターミナル上の両方で行う。
(手元のパソコン上でターミナルが動かなければ、サーバーのみで問題ない)

下部のConnectorsでサーバーとパソコンからの接続が確認できたら、Nextを選択。

Edit public hostname forでホスト名を編集する。

  • Subdomain(ルートドメインで公開する場合は未設定)とDomainをMisskeyを公開したいホスト名に設定する。
  • ServiceはHTTP://localhost:80に設定する。

DNS Recordがなんとかかんとかと警告表示があるが、自動で設定されるので無視して良い。

Save tunnelを選択。

SSH接続の設定も行なう。

トンネルリストに戻るので、作成したトンネルのConfigureを選択し、Public Hostnameタブを表示。Add a public hostnameを選択。

  • Subdomain(例: ssh)とDomain (例: example.com)を設定する。
  • ServiceはSSH://localhost:22に設定する。

Save hostnameを選択。

Access > Applicationsを開き、Add an applicationを選択、Self-hostedをSelect。

  • Application name: 適当に
  • Session Duration: No duration
  • SubdomainとDomainは先ほど設定したもの

中段は飛ばして、

  • Accept all available identity providersをオフ
  • Instant Authをオン

上に戻ってNext

  • Policy name: 適当に
  • Action: Allow
  • Session duration: Same as application...

Next

  • Enable automatic cloudflared authenticationをオン
  • Browser renderingはとりあえずSSHに

Add Application

クライアントマシン(手元のパソコン)で操作する。

~/.ssh/configを編集し、次のように追記する。
ProxyCommandの/path/to/cloudflaredは、Windowsならwhere.exe cloudflared、それ以外ならwhich cloudflaredの結果に置き換えること。

Host ssh.example.com
  HostName ssh.example.com
  ProxyCommand /path/to/cloudflared access ssh --hostname %h

ssh接続してみよう。userは適宜適切なユーザー名に置き換えてほしい。
(もしsshがインストールサーバーにインストールされていない場合はsshdをセットアップしよう。)

ssh user@ssh.example.com

ブラウザが開いて認証を行う必要があるが、認証が終われば通常のログインができる。

sshへのログインが公開鍵認証ではなくパスワード認証の場合は、公開鍵認証を設定しよう。
(ただし、この方法で設定するとなぜかブラウザレンダリングでSSHにログインできなくなってしまう)

ssh-keygen -t rsa -f ~/.ssh/my_ssh_key -C user # my_ssh_keyは好きな鍵名に、userは適切なユーザー名にする
# パスワードは設定しなくても良い
ssh-copy-id -i ~/.ssh/my_ssh_key user@ssh.example.com

リモートにssh接続する。

ssh user@ssh.example.com

/etc/ssh/sshd_configを次のように編集する。

  • PubkeyAuthentication yes
  • PasswordAuthentication no

sshdを再起動し、サーバーから切断する。

sudo systemctl restart sshd
exit

IdentityFileでssh秘密鍵を設定しよう。

Host ssh.example.com
  HostName ssh.example.com
  ProxyCommand /path/to/cloudflared access ssh --hostname %h
  IdentityFile /Users/your_local_user/.ssh/my_ssh_key

パスワードなしでログインするかどうか確かめてみる。

ssh user@ssh.example.com
exit

Misskey install shell script (bash-install) v2を使用して、Misskeyを適当にインストールしていく。

cloudflaredを使うにあたり、bash-installの設定は次のように行う。
そのほかの設定はお任せする(というかEnterだけ押していればなんとかなる)。

  • nginxは使用する(y)
  • setup ufw or iptablesはn(ファイヤウォールのセットアップなし)
  • certbotは使用しない(n)
  • Cloudflareは使用しない(n)

ssh接続にやたら時間をかけた以外は、そこそこ簡単にサーバーを公開できましたね。
(実はsshはCloudflare Tunnelsだけあればパスワードすらいらないかもしれませんが、とりあえず厳重にロックするようにしてみました。)

自宅サーバーであればsudo ufw enableだけして全てのポートを閉じてしまって問題ないかと思います。