frp で自宅サーバーを公開する

ngrok は素晴らしいサービスなのだが本番用の固定ドメインを使おうとするとドメイン毎に毎月 $15 かかるので何個も作っているとそれなりの出費になるので代替方法として frp を使ってみることにした。

frp は ngrok みたいなトンネリングを自分でやるためのライブラリだ。

概要

frp

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 を動かすサーバーが必要になるものの、お金をあまりかけずに自宅サーバーを公開するには良い方法だと思う。


掲示板にコメントする
※どの記事のコメントかわかるように本文に記事タイトルなどを入れてください。
一覧に戻る