frp は、公網からアクセスできるサーバーを1台用意し、内網のサービスを外へ転送する仕組みだ。frps は公網サーバー側で、frpc は内網マシン側で動かす。両端の設定を逆に書かないよう注意してほしい。
ここでは公式が現在サポートしている TOML 形式の設定を使い、インストールは公式リリースから行う。サードパーティの一発スクリプトや古い Docker イメージとは混ぜない。

説明図:frp:内網から公網へ能動的に接続し、外部は指定した業務ポートにアクセスする
ダウンロードとディレクトリ
frp 公式 Releases から、OS と CPU アーキテクチャに合ったパッケージを選ぶ。両端はできるだけバージョンを揃えよう。解凍したら必要なバイナリと設定ファイルだけ残せばよく、すぐ古くなるダウンロードのバージョン番号をチュートリアル内で固定する必要はない。
まずはフォアグラウンドで動かし、ポートと認証が正常に機能することを確認してから、公式ガイドまたは現在の OS のサービス管理方法に従って自動起動を設定する。サービスのディレクトリ、実行ユーザー、設定ファイルのパーミッションも合わせて設計し、設定内の token をすべてのローカルユーザーが読める状態にしてはいけない。
サーバー側 frps.toml
以下では 7000 を制御接続用ポートとして開放し、プロキシにはリモート 8443 のみ使用を許可する。token とパネルのパスワードは、いずれも必ず置き換えるプレースホルダーだ。
bindPort = 7000
allowPorts = [{ single = 8443 }]
[auth]
method = "token"
token = "REPLACE_WITH_THE_SAME_LONG_RANDOM_TOKEN"
[transport.tls]
force = true
[webServer]
addr = "127.0.0.1"
port = 7500
user = "frp-admin"
password = "REPLACE_WITH_ANOTHER_LONG_RANDOM_PASSWORD"
allowPorts を書くときは、配列の括弧がきちんと閉じているか確認しよう。制御ポート、業務ポート、管理パネルはそれぞれ役割が1つずつ。ポート範囲を丸ごと開放したりはしない。

説明図:3つのポート、3つの用途
クライアント側 frpc.toml
内網の 192.168.100.20:443 にある HTTPS サービスを、サーバーの 8443 に公開する必要が本当にあるとしよう。
serverAddr = "YOUR_PUBLIC_SERVER_IP"
serverPort = 7000
[auth]
method = "token"
token = "REPLACE_WITH_THE_SAME_LONG_RANDOM_TOKEN"
[transport.tls]
enable = true
[[proxies]]
name = "home-https"
type = "tcp"
localIP = "192.168.100.20"
localPort = 443
remotePort = 8443
サーバーアドレス、内網 IP、token を実際の値に置き換え、frpc が動いているマシンからその内網サービスへ直接アクセスできることを確認する。対象サービス自体に適切な HTTPS 証明書と認証があるべきで、ルーターや NAS の保護されていない管理画面をそのまま公網に開放してはいけない。
frp のトランスポート層 TLS が暗号化するのは、両端間の接続だ。対象サービスの HTTP を自動で HTTPS に変えるものではないし、業務のアカウント認証の代わりにもならない。HTTPS のドメインと証明書は、実際の使い方に合わせる必要がある。
起動と確認
サーバー側は該当ディレクトリから起動する。
./frps -c ./frps.toml
クライアント側はまず設定を確認してから起動する。
./frpc verify -c ./frpc.toml
./frpc -c ./frpc.toml
サーバー側のセキュリティグループとファイアウォールで、必要な TCP 7000 と 8443 を開放する。制御接続の接続元を制限しておくとより良い。7500 のパネルはループバックアドレスだけをリッスンするので、確認したいときは SSH 転送を使う。便利だからといって、そのまま全網リッスンに変えたりしない。
ssh -L 7500:127.0.0.1:7500 your-user@your-server
トラブル時はまず層ごとに切り分ける
frpc がつながらないなら、まずサーバーアドレス、7000、ファイアウォール、token を確認する。ログインは成功したのにプロキシ登録が失敗するなら、リモートポートの競合と allowPorts を確認する。プロキシは正常なのにページが開かないなら、内網サービス自体、8443、HTTPS のドメイン/証明書を確認する。どの層でも、対応するログを見ること。すべてのパラメータを同時にやたらと変更しないように。
設定は TOML の構文チェックまで済ませてあるが、あなたの2台のマシン上でトンネルを確立したわけではない。参考:公式プロジェクト、サーバー設定、サンプルと説明。