frp で自宅サーバーを公開する
ngrok は素晴らしいサービスなのだが本番用の固定ドメインを使おうとするとドメイン毎に毎月 $15 かかるので何個も作っているとそれなりの出費になるので代替方法として frp を使ってみることにした。
frp は ngrok みたいなトンネリングを自分でやるためのライブラリだ。
概要
frp にはサーバー用の frps とクライアント用の frpc がある。 frps はグローバルIPから安定してアクセスできる場所に置く必要がある。つまり ngrok の場合はこの部分をサービスとしてやっているということになる。
frps のあるサーバーでは 443 ポートなど使いたいポートについては Firewall を開けておく必要があるが frpc を置く方のサーバー(つまり自宅サーバーなど)では Firewall を設定する必要はなく、 frpc の設定だけやってあれば良い。
今回やりたいことは2つ
- 自宅サーバーにインターネット越しに SSH でログインする
- 自宅サーバーからホームページをインターネットに公開する
frps の設定
以前安かったときに契約した ConoHa のサーバーがあるのでこれを frps 用に使うことにした。 固定IP が使えて frps の実行ファイルが動かせればなんでもいい気がするので、 Cloud Run とか Faas とかでもいけるかもしれない。
frps.toml を次のように設定する。
bindPort = 7000
vhostHTTPSPort = 443
次で起動
./frps -c frps.toml
ポート 7000, 2222, 443 を使うので開けておく。 (Linux の Firewall は最近は ufw を使っている。簡単なので便利。)
frpc の設定: SSH
次に自宅サーバーで次のような設定をしておく。
frpc.toml
serverAddr = "xxx.xxx.xxx.xxx" # ConoHa サーバーのグローバル IP アドレス or 左記を割り当てたドメイン
serverPort = 7000
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222
で、次で起動
./frpc -c frpc.toml
上記の設定の場合、自宅サーバーでポート 22 で SSH 接続できるようにしておいて、 frps 経由では 2222 ポートでアクセスできるように設定してある。
手元のマシンの SSH 設定を次のようにすればインターネットのどこからでも自宅サーバーにアクセスできる。
~/.ssh/config
host my-server
HostName xxx.xxx.xxx.xxx
User alice
Port 2222
ForwardAgent yes
User とか IdentityFile の設定とかは適当にやっておく。
frpc の設定: https サーバー
インターネットにサイトを公開するのであれば HTTPS で公開したい。 frp には https2http というプラグインがあってこれを使うと http で動いているローカルの アプリケーションサーバーに対して https で公開できるようになる。
HTTPS の証明書ファイルの生成
今回は HTTPS 化のために Let's Encrypt を使う。 Let's Encrypt は certbot という Linux コマンドで証明書ファイルを作ることができる。
certbot certonly --manual -d *.kbaba1001.com --preferred-challenges dns --config-dir ./letsencrypt/config --work-dir ./letsencrypt/work --logs-dir ./letsencrypt/logs
こんな感じで設定ファイルを作ることができる。(ディレクトリは予め作っておく)
ドメインでのTXT設定が求められるのでそれは対応すること。
上記の場合は ./letsencrypt/config/live/kbaba1001.com/cert.pem
などのような形で証明書ファイルができる。
frpc の設定
新しい frpc.toml を作って次のように設定する。
serverAddr = "xxx.xxx.xxx.xxx"
serverPort = 7000
vhostHTTPSPort = 443
[[proxies]]
name = "tunnel_https2http"
type = "https"
customDomains = ["tunnel.kbaba1001.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:8000"
crtPath = "./letsencrypt/config/live/kbaba1001.com/cert.pem"
keyPath = "./letsencrypt/config/live/kbaba1001.com/privkey.pem"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
frpc -c frpc.toml
で起動しておいて、ブラウザから
https://tunnel.kbaba1001.com
にアクセスすれば 通信が Proxy
されて自宅サーバーの localhost:8000 にリクエストが飛ぶようになる。
まとめ
frps を動かすサーバーが必要になるものの、お金をあまりかけずに自宅サーバーを公開するには良い方法だと思う。
一覧に戻る