令和時代の固定IPがない自宅サーバー公開方法を考える

2 min read読了の目安(約2600字

まぁ内容は sish を自前でホスティングしてみる という内容なんですが...

皆さんは、ローカルの開発環境や自宅サーバーを外部公開したくなった時どうしてますでしょうか?
一昔前は 固定IPが付与されるVPSを借りて VPN を貼ったりしていたと思います。

しかし最近は ngrok などに代表されるそんな事を考えなくとも、ツールを入れるだけで簡単に外部公開できるツールが出てまいりました

しかしながら開発途中ものを第三者に通信を経由するのはちょっとした抵抗があります。
また大容量のものを扱いたい場合は速度制限がかかったりして面倒になることが多いです。

ngrok みたいなを自前で運用できたら...
ツールを入れなくても簡単に公開できるようになれたら...

そんな願いを叶えてくれるのが 今回紹介する sish です

https://github.com/antoniomika/sish

ssh トンネリングを使ったトンネリングツールになります
(思想としては serveo に近いです)

流れとしては
PC → (SSH Tuunel) → VPS(sish) → global
といった感じになります

sish 以外にも最近だと caddy を使う事もできますが、あちらは使うユーザー数によって都度設定を変更しないといけないのと、あと必要もないのに web サーバーを建てる必要があります。

sish の場合は特に気にすることもなく、クライアント側は ssh すればいいだけなので、非常に楽ちんです。

sish は自前で運用することもできますが、してみた記事はなかったので書いてみました。

事前準備: DNSサーバーの選定

sish を使う前に大切なことは DNSサーバーの選定です
sish の証明書作成には 他の人が作った DNS認証ベース の letsencrypt 製の証明書を生成するソフトが使われれています
DNSレコードの書き換えまで自動的にやってDNS認証までオートでやってくれるすごい代物なのですが、レコードの書き換えを自動的にやる以上、APIが提供されているDNSサービスを利用しないといけません。
対応しているDNSサービスは以下になります

https://dnsrobocert.readthedocs.io/en/latest/providers_options.html
主要なクラウドも対応していますが、日本の さくらや ConoHa にも対応しているのが嬉しいですね。
個人用途で使うとなると、無料でAPIが叩けて国内サービスで絞り込むと ConoHa を使うのが一番いいかと思います。
ConoHa の API には tokenベースと id / password ベースの方式がありますが、 token ベースの方は一日しか持たないので、 id / password で運用しないと中長期的に運用するときには困ると思います。

事前準備: sish の設定

まずは リポジトリを clone してきてください
そして設定ファイルを書き換えていきます

DNS 設定

ここは 使うDNSサーバーに合わせて設定してください

deploy/le-config.yml
acme:
  email_account: EMAIL
certificates:
- autorestart:
  - containers:
    - sish
  domains:
  - 'test.example.com'
  - '*.test.example.com'
  name: test.example.com
  profile: conoha
profiles:
- name: conoha
  provider: conoha
  sleep_time: 60
  sleep_time: 120
  delegated_subdomain: 'test.example.com'
  provider_options:
    auth_username: 'CONOHA_API_USER'
    auth_password: 'CONOHA_API_PASS'
    auth_tenant_id: 'CONOHA_API_TENANT_ID'

ユーザー設定

sish を使うユーザーは deploy/pubkeys/ で管理されています
ファイル名がユーザー名になります
荒削りですが GitHub 公開鍵から sish ユーザーを生成する ansible playbook を公開していますので参考にしてみてください

https://github.com/306-san/sish-user-playbook-sample/

証明書設定

sish を独自ドメインで運用するには
証明書の兼ね合いで
sish ディレクトリーでシンボリックリンクを貼る必要があります

ln -s /etc/letsencrypt/live/<your domain>/fullchain.pem deploy/ssl/<your domain>.crt
ln -s /etc/letsencrypt/live/<your domain>/privkey.pem deploy/ssl/<your domain>.key

一瞬何をやっているのか混乱しますが、sish のコンテナ内の path に対してシンボリックリンクを貼っていると考えてもらうといいかと思います

使ってみる

docker-compose -f deploy/docker-compose.yml up

で立ち上げて証明書ができるまで待ちます
証明書が出来上がったら、準備は完了です

次にクライアント側で

ssh -p 2222 -R domain:80:localhost:3000 sish_user@test.example.com

と打てば
domain.test.example.com にアクセスすると localhost:3000 にアクセスが来ます

お疲れさまでした