frpを使って内網透過(ローカルサーバー公開)をしてみる

📢 この記事は gemini-3.5-flash によって翻訳されました

オールDocker構成でfrpを使って内網透過(ローカル公開)を試してみたよ。速度も結構いい感じで、遅延も許容範囲内かな。

DNSの設定

自分用のグローバルIPを持つサーバー(VPSなど)が必要。今回はSSL証明書をCloudflareで設定したから、接続はすべて80番ポートを経由させているよ。

ドメインをいくつか設定する。frp接続用のドメイン(例えば frp.example.com)と、プロキシしたいサービス用のドメイン(例えば server1.example.comserver2.example.com)をサーバーに向ける。ここで注意してほしいのが、frp接続用のドメイン(frp.example.com)はCloudflareのプロキシ(オレンジ色の雲アイコン)を有効にせず、「DNSのみ(DNS only)」モードにすること!

サーバー側(frps)

サーバーにfrpをインストールするのは結構簡単。まずは設定ファイル frps.toml を用意しよう。

1
2
3
4
5
bindPort = 7000
vhostHTTPPort = 8000

auth.method = "token"
auth.token = "set_your_token"

複雑な token を設定したら、次は docker-compose.yml だよ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  frps:
    image: snowdreamtech/frps:latest
    container_name: frps
    restart: unless-stopped
    ports:
      - "7000:7000"
      - "8000:8000"
    volumes:
      - ./frps.toml:/etc/frp/frps.toml

あとはそのまま起動するだけ。

1
docker compose up -d

Nginxの設定

frp接続用のドメイン(frp.example.com)を、bindPort = 7000(つまり 172.17.0.1:7000)にリバースプロキシする。

そして、すべてのサービス用ドメインを vhostHTTPPort = 8000(つまり 172.17.0.1:8000)にリバースプロキシする。

Cloudflareのプロキシを使っている関係上、1つのNginx設定ファイルに複数の server_name をまとめて書いちゃうと、最初のドメインしかうまく動かなくなっちゃう。だから、ドメインごとに個別の設定ファイルを作って、それぞれを 172.17.0.1:8000 にリバースプロキシするようにしてね。

クライアント側(frpc)

クライアント側の設定はちょっと複雑かな。設定ファイル frpc.toml はこんな感じ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
serverAddr = "frp.example.com"
serverPort = 80
transport.protocol = "websocket"

auth.method = "token"
auth.token = "set_your_token"

[[proxies]]
name = "nas-server1"
type = "http"
localIP = "192.168.6.x"
localPort = 8001
customDomains = ["server1.example.com"]

[[proxies]]
name = "nas-server2"
type = "http"
localIP = "192.168.6.x"
localPort = 8002
customDomains = ["server2.example.com"]

次は docker-compose.yml だよ。

1
2
3
4
5
6
7
8
services:
  frpc:
    image: snowdreamtech/frpc:latest
    container_name: frpc
    restart: unless-stopped
    network_mode: "host"
    volumes:
      - "./frpc.toml:/etc/frp/frpc.toml"

あとはそのまま起動するだけ。

1
docker compose up -d
This post is licensed under CC BY-NC-SA 4.0 by the author.

アクセス統計

2025-02-08 からのアクセス統計

Hugo で構築されています。 | テーマ StackJimmy によって設計されています。 | yexca によって改修されています。