frp (Fast Reverse Proxy) を使いこなす:NATやファイアウォールを突破して外部からサーバーにアクセスする方法

Network tutorial - IT technology blog
Network tutorial - IT technology blog

頭の痛い問題:高性能なサーバーがあるのに自宅でしか使えない

インフラエンジニアやDevOpsの皆さんなら、こんな状況に心当たりがあるはずです。自宅にHome Assistantやデータベース、メディアサーバーなどを詰め込んだ超高性能なサーバーを構築したとします。LAN内では快適に動作しますが、一歩外に出てカフェからログを確認したりリモートデスクトップを使おうとしたりすると、途端に「お手上げ」状態になります。

最大の障壁は、NATファイアウォールです。現在、ほとんどの家庭用インターネットプランは、プロバイダーのCGNATの配下に置かれています。実用的なパブリックIPがないため、ルーターでいくら「ポート開放」をいじっても意味がありません。また、オフィスのファイアウォールは通常、外部からの接続(インバウンド)を完全に遮断し、外部への通信(アウトバウンド)のみを許可しています。

以前は、VPNを使ったり固定IPを購入してポートを開放したりしていましたが、50人規模のオフィスのネットワークを管理する際、この方法はかなり煩雑だと感じました。特に、クライアントにWebアプリのデモを急ぎで見せたり、開発チームがターミナルにリモート接続したりする必要がある場合、彼らにいちいちVPNクライアントをインストールさせるのは現実的ではありません。

代表的な「ネットワーク制限回避」ソリューションの比較

この問題を解決するために、通常は以下の3つの方向性を検討します:

1. 従来のポートフォワーディング

  • メリット: 直接接続のため、最高速度(低遅延)。
  • デメリット: パブリックIPが必要。ポートが露出するため攻撃を受けやすく、ルーター設定が複雑。

2. VPN (WireGuard, Tailscale)

  • メリット: 極めてセキュアで、オフィス内にいるのと変わらない感覚で使用できる。
  • デメリット: 全てのデバイスにアプリのインストールが必要。クライアントにWebリンクを送る際に「Tailscaleを入れてください」と言うのは…現実的ではありません。

3. トンネリングサービス (frp, Ngrok, Cloudflare Tunnel)

  • メリット: パブリックIP不要。あらゆるNATを突破でき、非常に柔軟。
  • デメリット: 中継地点となるサーバー(VPS)が必要。

なぜNgrokやCloudflare Tunnelではなく、frpを選んだのか?

Ngrokの無料版は、再起動のたびにURLが変わってしまうのが非常にストレスです。Cloudflare TunnelはWeb用としては非常に優れていますが、SSH、RDP、ゲームサーバーなどのプロトコルに関しては、初心者には設定が少し難しい場合があります。

frp (Fast Reverse Proxy) は、非常に強力なオープンソースプロジェクトです。月額5ドル程度の安価なVPSがあれば、データフローを完全に制御できます。サードパーティのサーバーを経由せず、TCP、UDPからHTTP/HTTPSまで、あらゆるものを公開できます。

frpの仕組みは主に2つのパーツに分かれています:

  • frps (frp Server): パブリックIPを持つマシン(VPS)で実行します。
  • frpc (frp Client): ローカルマシン(自宅やオフィスのサーバー)で実行します。

frp 導入ステップ・バイ・ステップ

ステップ 1:インフラの準備

パブリックIPを持つLinux VPS(Ubuntuが一般的でおすすめです)が必要です。ローカル側は、Windows、Linux、あるいは小さなRaspberry Piでも構いません。

ステップ 2:VPS側で frps (Server) を設定する

まず、fatedier/frpのGitHubから最新リリースをダウンロードします。VPSのアーキテクチャに合わせてamd64版を選択してください。

# v0.54.0版をダウンロード
wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz
tar -zxvf frp_0.54.0_linux_amd64.tar.gz
cd frp_0.54.0_linux_amd64

frps.tomlファイルを開き、以下のように設定します(バージョン0.52.0以降、frpはTOML形式を採用しています):

# frps.toml
bindPort = 7000

# 第三者の不正利用を防ぐためのセキュリティトークン
auth.token = "あなたの超強力なパスワード"

# 接続管理用のWebインターフェース(オプション)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "管理者パスワード"

コマンドを実行します:./frps -c frps.toml。「frps started successfully」という行が表示されれば、半分成功です。

ステップ 3:ローカルマシン側で frpc (Client) を設定する

同様に、ローカルマシンにfrpをダウンロードします。frpc.tomlを開き、外部に「公開」したいサービスを設定します。

例えば、SSH(ポート22)とローカルのWebサーバー(ポート80)をVPSのIP経由でインターネットに公開したい場合:

# frpc.toml
serverAddr = "123.45.67.89" # VPSのパブリックIPに置き換えてください
serverPort = 7000

auth.token = "あなたの超強力なパスワード"

[[proxies]]
name = "ssh-remote"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000 # リモートからSSH接続する際に使用するポート

[[proxies]]
name = "web-local"
type = "http"
localIP = "127.0.0.1"
localPort = 80
customDomains = ["your-domain.com"]

クライアントを起動します:./frpc -c frpc.toml。これで、世界中のどこからでも ssh -p 6000 [email protected] というコマンドで自宅サーバーにSSH接続できるようになります。

最適化とセキュリティの「鉄則」アドバイス

長年実プロジェクトで運用してきた経験から、システムが途中で「落ちない」ための3つの重要な注意点を挙げます:

1. 手動でコマンドを実行せず、Systemd を使う

ターミナルウィンドウを閉じると、トンネルもすぐに切れてしまいます。Systemdを設定して、frpがPC起動時に自動開始され、ネットワークが切断された場合も自動再接続するようにしましょう。

2. VPSのファイアウォールのポート開放忘れ

これはよくあるミスです。frpの設定は完璧なのに、VPSプロバイダー(DigitalOcean、AWSなど)のUFWやセキュリティグループでポート7000や6000を開放し忘れているケースです。開放されていないと、データはVPSの入り口で遮断されます。

3. 常に TLS の使用を強制する

デフォルトのトラフィックは盗聴される可能性があります。サーバーとクライアントの両方に transport.tls.force = true を追加してください。これにより、トンネルを通過するすべてのデータが暗号化され、機密性の高いサービスにリモート接続する際も安心です。

結論

frpは、技術者にとってまさに「万能ナイフ」のようなツールです。プロバイダーにNAT開放を依頼したり、高い固定IP代を払ったりする代わりに、安価なVPSが一台あれば、自分のシステムを完全に掌握できます。

私はかつて、お客様の自宅に設置された20台のバックアップサーバーを管理するためにfrpを使用しましたが、ルーターの設定には一秒も触れる必要がありませんでした。もしHTTPSの設定やDockerでの実行で困ったことがあれば、コメント欄で教えてください。すぐにお答えします!

Share: