
frp v0.71.0
NATやファイアウォールの背後にあるローカルサーバーをインターネットに公開するための高速リバースプロキシ。
frp
赞助商
frp 是一个开源项目,其持续开发完全由我们出色的赞助商的支持所推动。如果您想加入他们,请考虑赞助 frp 的开发。
金牌赞助商
让您掌控一切的自主云
一个开源、自托管的公有云替代方案,专为数据所有权和隐私而构建
Recall.ai - 会议录制 API
如果您正在寻找会议录制 API,请考虑查看 Recall.ai,
这是一个可录制 Zoom、Google Meet、Microsoft Teams、线下会议等的 API。
frp 是什么?
frp 是一个快速反向代理,允许您将位于 NAT 或防火墙后面的本地服务器暴露到互联网。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,使请求能够通过域名转发到内部服务。
frp 还提供 P2P 连接模式。
目录
- 开发状态
- 架构
- 使用示例
- 功能
- 功能开关
- 相关项目
- 贡献
- 捐赠
开发状态
frp 目前正在开发中。您可以在 master 分支中尝试最新的发布版本,或使用 dev 分支访问当前正在开发的版本。
我们目前正在开发版本 2,并尝试进行一些代码重构和改进。但请注意,它将与版本 1 不兼容。
我们将在适当的时候从版本 0 过渡到版本 1,并且只会接受错误修复和改进,而不是大型功能请求。
关于 V2
v2 版本的复杂性和难度远超预期。我只能利用零散的时间进行开发,而不断的干扰严重影响了工作效率。鉴于这种情况,我们将继续对当前版本进行优化和迭代,直到我们有更多空闲时间来进行大版本重构。
v2 的概念基于我在云原生领域(尤其是 K8s 和 ServiceMesh)多年的经验和思考。其核心是一个现代化的四层和七层代理,类似于 envoy。这个代理本身具有高度可扩展性,不仅能够实现内网穿透的功能,还可以应用于其他各种领域。在这个高度可扩展的核心之上,我们旨在实现 frp v1 的所有功能,同时解决以前无法实现或难以优雅实现的功能。此外,我们将保持高效的开发和迭代能力。
此外,我设想 frp 本身成为一个高度可扩展的系统和平台,类似于我们可以基于 K8s 提供一系列扩展能力。在 K8s 中,我们可以根据企业需求进行定制开发,利用 CRD、控制器模式、webhook、CSI 和 CNI 等功能。在 frp v1 中,我们引入了服务器插件的概念,实现了一些基本的可扩展性。然而,它依赖于简单的 HTTP 协议,并且需要用户自行启动独立进程并自行管理。这种方法远不够灵活和方便,而现实世界的需求差异很大。期望一个由少数人维护的非营利开源项目能满足所有人的需求是不现实的。
最后,我们承认配置管理、权限验证、证书管理和 API 管理等模块的当前设计不够现代化。虽然我们可能会在 v1 版本中进行一些优化,但确保兼容性仍然是一个具有挑战性的问题,需要投入大量精力来解决。
我们衷心感谢您对 frp 的支持。
架构
使用示例
首先,从 Release 页面下载适用于您操作系统和架构的最新程序。
接下来,将 frps 二进制文件和服务器配置文件放在具有公网 IP 的服务器 A 上。
最后,将 frpc 二进制文件和客户端配置文件放在位于无法从公网直接访问的局域网中的服务器 B 上。
某些杀毒软件会错误地将 frpc 标记为恶意软件并将其删除。这是因为 frp 是一种能够创建反向代理的网络工具。杀毒软件有时会标记反向代理,因为它们能够绕过防火墙的端口限制。如果您使用杀毒软件,则可能需要在杀毒软件设置中将 frpc 加入白名单/排除项,以避免被误隔离/删除。有关更多详细信息,请参阅 issue 3637。
通过 SSH 访问局域网中的计算机
- 在服务器 A 上修改
frps.toml,设置 frp 客户端连接的bindPort: ```toml
frps.toml
bindPort = 7000
2. サーバーAで`frps`を起動します:
`./frps -c ./frps.toml`
3. サーバーBの`frpc.toml`を変更し、`serverAddr`フィールドをfrpsサーバーのパブリックIPアドレスに設定します: ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
localPort(客户端监听的端口)和 remotePort(服务器上暴露的端口)用于 frp 系统内外的流量,而 serverPort 用于 frps 与 frpc 之间的通信。
- 在服务器 B 上启动
frpc:
./frpc -c ./frpc.toml
- 要从另一台机器通过服务器 A 使用 SSH 访问服务器 B(假设用户名为
test),请使用以下命令:
ssh -oPort=6000 [email protected]
多个 SSH 服务共享同一端口
此示例通过类型为 tcpmux 的代理,在同一个端口上暴露多个 SSH 服务。同样,只要客户端支持 HTTP Connect 代理连接方式,就可以通过这种方式实现端口复用。
- 在具有公网 IP 的机器上部署 frps,并修改 frps.toml 文件。以下是一个简化的配置: ```toml bindPort = 7000 tcpmuxHTTPConnectPort = 5002
2. 内部マシンAに以下の設定でfrpcをデプロイします: ```toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "ssh1"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["machine-a.example.com"]
localIP = "127.0.0.1"
localPort = 22
- 内部マシンBに以下の設定で別のfrpcをデプロイします: ```toml serverAddr = "x.x.x.x" serverPort = 7000
[[proxies]] name = "ssh2" type = "tcpmux" multiplexer = "httpconnect" customDomains = ["machine-b.example.com"] localIP = "127.0.0.1" localPort = 22
4. SSH ProxyCommandを使用して内部マシンAにアクセスする場合、ユーザー名が「test」であると仮定します:
`ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' [email protected]`
5. 内部マシンBにアクセスする場合、違いはドメイン名のみで、ユーザー名が「test」であると仮定します:
`ssh -o 'proxycommand socat - PROXY:x.x.x.x:%h:%p,proxyport=5002' [email protected]`
### LAN内のカスタムドメインを使用した内部Webサービスへのアクセス
NATネットワークの背後にあるローカルWebサービスを、独自のドメイン名を使用してテスト目的で他の人に公開する必要がある場合があります。
残念ながら、ドメイン名をローカルIPに解決することはできません。ただし、frpを使用してHTTP(S)サービスを公開することができます。
1. `frps.toml`を変更し、vhostのHTTPポートを8080に設定します: ```toml
# frps.toml
bindPort = 7000
vhostHTTPPort = 8080
vhostHTTPSPortを設定する必要があります。
frpsを起動します:
./frps -c ./frps.toml
frpc.tomlを変更し、serverAddrをリモートのfrpsサーバーのIPアドレスに設定します。WebサービスのlocalPortを指定します: ```toml
frpc.toml
serverAddr = "x.x.x.x" serverPort = 7000
[[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["www.example.com"]
4. `frpc` を起動します:
`./frpc -c ./frpc.toml`
5. `www.example.com` の A レコードを、リモートの frps サーバーのパブリック IP または元のドメインを指す CNAME レコードにマッピングします。
6. URL `http://www.example.com:8080` を使用してローカルの Web サービスにアクセスします。
### DNS クエリリクエストの転送
1. `frps.toml` を変更します: ```toml
# frps.toml
bindPort = 7000
frpsを起動します:
./frps -c ./frps.toml
frpc.tomlを変更し、serverAddrをリモートの frps サーバーの IP アドレスに設定します。DNS クエリリクエストを Google Public DNS サーバー8.8.8.8:53に転送します: ```toml
frpc.toml
serverAddr = "x.x.x.x" serverPort = 7000
[[proxies]] name = "dns" type = "udp" localIP = "8.8.8.8" localPort = 53 remotePort = 6000
4. frpc を起動します:
`./frpc -c ./frpc.toml`
5. `dig` コマンドを使用して DNS 解決をテストします:
`dig @x.x.x.x -p 6000 www.google.com`
### Unix ドメインソケットの転送
Unix ドメインソケット(例: Docker デーモンソケット)を TCP として公開します。
上記のように `frps` を設定します。
1. 以下の設定で `frpc` を起動します: ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "unix_domain_socket"
type = "tcp"
remotePort = 6000
[proxies.plugin]
type = "unix_domain_socket"
unixPath = "/var/run/docker.sock"
curlを使用してDockerのバージョンを取得し、設定をテストします:
curl http://x.x.x.x:6000/version
シンプルなHTTPファイルサーバーを公開する
LANに保存されているファイルにパブリックインターネットからアクセスできるように、シンプルなHTTPファイルサーバーを公開します。
上記のとおりfrpsを設定し、次に:
- 以下の設定で
frpcを起動します: ```toml
frpc.toml
serverAddr = "x.x.x.x" serverPort = 7000
[[proxies]] name = "test_static_file" type = "tcp" remotePort = 6000 [proxies.plugin] type = "static_file" localPath = "/tmp/files" stripPrefix = "static" httpUser = "abc" httpPassword = "abc"
2. ブラウザから `http://x.x.x.x:6000/static/` にアクセスし、正しいユーザー名とパスワードを指定して、`frpc` マシン上の `/tmp/files` 内のファイルを表示します。
### ローカルの HTTP(S) サービスに対して HTTPS を有効にする
プラグインを `https2https` に置き換え、`localAddr` を HTTPS エンドポイントに指定しても構いません。
1. 以下の設定で `frpc` を起動します。 ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "test_https2http"
type = "https"
customDomains = ["test.example.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"
https://test.example.comにアクセスします。
サービスを非公開で公開する
特定のサービスをパブリックネットワークに直接公開することに伴うリスクを軽減するため、STCP(シークレットTCP)モードでは、他のクライアントからサービスにアクセスする際に事前共有キーの使用が必須となります。
frps は上記と同様に設定します。
- マシンBで以下の設定を使用して
frpcを起動します。この例ではSSHサービス(ポート22)を公開するもので、事前共有キー用のsecretKeyフィールドに注目し、ここではremotePortフィールドが削除されている点に注意してください: ```toml
frpc.toml
serverAddr = "x.x.x.x" serverPort = 7000
[[proxies]] name = "secret_ssh" type = "stcp" secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22
2. 別のマシン(通常はマシンC)で、以下の設定を持つ別の`frpc`を起動し、セキュリティキー(`secretKey`フィールド)を使用してSSHサービスにアクセスします。 ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
serverName = "secret_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
- マシンCで、以下のコマンドを使用してマシンBのSSHに接続します:
ssh -oPort=6000 127.0.0.1
P2Pモード
xtcp は、クライアント間で大量のデータを直接転送するように設計されています。ここでのP2Pは実際のデータ転送のみを指すため、frpsサーバーは依然として必要です。
すべての種類のNATデバイスで動作するとは限らないことに注意してください。xtcpが機能しない場合は、stcpにフォールバックすることをお勧めします。
- マシンBで
frpcを起動し、SSHポートを公開します。remotePortフィールドが削除されていることに注意してください: ```toml
frpc.toml
serverAddr = "x.x.x.x" serverPort = 7000
set up a new stun server if the default one is not available.
natHoleStunServer = "xxx"
[[proxies]] name = "p2p_ssh" type = "xtcp" secretKey = "abcdefg" localIP = "127.0.0.1" localPort = 22
2. 別のマシン(通常はマシンC)で、P2Pモードを使用してSSHに接続する設定で別の`frpc`を起動します: ```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
# set up a new stun server if the default one is not available.
# natHoleStunServer = "xxx"
[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
serverName = "p2p_ssh"
secretKey = "abcdefg"
bindAddr = "127.0.0.1"
bindPort = 6000
# when automatic tunnel persistence is required, set it to true
keepTunnelOpen = false
- マシンCで、以下のコマンドを使用してマシンBのSSHに接続します:
ssh -oPort=6000 127.0.0.1
機能
設定ファイル
v0.52.0以降、設定にTOML、YAML、JSONをサポートしています。INIは非推奨となり、将来のリリースで削除される予定ですのでご注意ください。新機能はTOML、YAML、JSONでのみ利用可能になります。これらの新機能を利用したいユーザーは、それに応じて設定形式を切り替えてください。
ここで説明されていないさらに多くの機能については、完全な設定ファイルの例をお読みください。
例ではTOML形式を使用していますが、YAMLまたはJSONも引き続き使用できます。
これらの設定ファイルは参考用です。様々な問題が発生する可能性があるため、この設定をそのままプログラムの実行に使用しないでください。
環境変数の使用
環境変数は、Goの標準形式を使用して設定ファイル内で参照できます:```toml
frpc.toml
serverAddr = "{{ .Envs.FRP_SERVER_ADDR }}" serverPort = 7000
[[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = {{ .Envs.FRP_SSH_REMOTE_PORT }}
上記の設定により、変数を次のように`frpc`プログラムに渡すことができます:```
export FRP_SERVER_ADDR=x.x.x.x
export FRP_SSH_REMOTE_PORT=6000
./frpc -c ./frpc.toml
frpc は、OS の環境変数を使用して設定ファイルのテンプレートをレンダリングします。参照には必ず .Envs をプレフィックスとして付けてください。
設定を複数のファイルに分割する
複数のプロキシ設定を異なるファイルに分割し、メインファイルにそれらを含めることができます。```toml
frpc.toml
serverAddr = "x.x.x.x" serverPort = 7000 includes = ["./confd/*.toml"]
The `-p` option allows you to specify a custom port for the reverse shell. The `-h` option displays the help menu.```toml
# ./confd/test.toml
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
サーバーダッシュボード
ダッシュボードを使用して、frpのステータスとプロキシの統計情報を確認します。
この機能を有効にするには、ダッシュボード用のポートを設定します:```toml
The default value is 127.0.0.1. Change it to 0.0.0.0 when you want to access it from a public network.
webServer.addr = "0.0.0.0" webServer.port = 7500
dashboard's username and password are both optional
webServer.user = "admin" webServer.password = "admin"
次に、`http://[serverAddr]:7500` にアクセスするとダッシュボードが表示されます。ユーザー名とパスワードはどちらも `admin` です。
さらに、ドメインのワイルドカードまたは通常のSSL証明書を使用して、HTTPSポートを利用することもできます。```toml
webServer.port = 7500
# dashboard's username and password are both optional
webServer.user = "admin"
webServer.password = "admin"
webServer.tls.certFile = "server.crt"
webServer.tls.keyFile = "server.key"
次に、https://[serverAddr]:7500 にアクセスすると、HTTPSのセキュアな接続でダッシュボードを確認できます。ユーザー名とパスワードはどちらも admin です。

クライアント管理UI
クライアント管理UIを使用すると、frpcの設定とプロキシを確認および管理できます。
この機能を有効にするには、管理UIのアドレスを設定します。```toml webServer.addr = "127.0.0.1" webServer.port = 7400 webServer.user = "admin" webServer.password = "admin"
次に `http://127.0.0.1:7400` にアクセスすると管理UIが表示され、ユーザー名とパスワードはどちらも `admin` です。
#### 動的プロキシ管理(ストア)
Web UIまたはAPIを通じて、frpcを再起動することなく、実行時にプロキシとビジターを動的に作成、更新、削除できます。
この機能を有効にするには、設定を永続化するためのファイルを指定する `store.path` を設定します。```toml
[store]
path = "./db.json"
Storeを通じて管理されるプロキシとビジターはディスクに保存され、frpcの再起動時に自動的に復元されます。これらは設定ファイルで定義されたプロキシと並行して動作し、名前が競合する場合はStoreのエントリが優先されます。
Monitor
Webサーバーが有効な場合、frpsはモニターデータをキャッシュに7日間保存します。プロセスの再起動後にはクリアされます。
Prometheusもサポートされています。
Prometheus
まずダッシュボードを有効にし、frps.tomlでenablePrometheus = trueを設定します。
http://{dashboard_addr}/metricsでPrometheusのモニターデータを取得できます。
クライアントの認証
frpcをfrpsで認証する方法は2つあります。
frpc.tomlとfrps.tomlでauth.methodを設定することでどちらを使用するかを決定できます。デフォルトはtokenです。
auth.additionalScopes = ["HeartBeats"]を設定すると、frpcとfrps間のすべてのハートビートで設定された認証方法を使用して認証の追加と検証が行われます。
auth.additionalScopes = ["NewWorkConns"]を設定すると、frpcとfrps間のすべての新しいワークコネクションでも同様の処理が行われます。
Token認証
frpc.tomlとfrps.tomlでauth.method = "token"を指定すると、トークンベースの認証が使用されます。
frpcがfrpsの検証を通過するには、frps.tomlとfrpc.tomlで同じauth.tokenを指定してください。
Tokenソース
frpはtokenSource設定を使用して外部ソースから認証トークンを読み取ることをサポートしています。現在、ファイルベースのトークンソースがサポートされています。
ファイルベースのトークンソース:```toml
frpc.toml
auth.method = "token" auth.tokenSource.type = "file" auth.tokenSource.file.path = "/path/to/token/file"
トークンは起動時に指定されたファイルから読み込まれます。これは、トークンが外部システムによって管理されている場合や、セキュリティ上の理由から設定ファイルとは別に保持する必要がある場合に便利です。
#### OIDC認証
`frpc.toml` と `frps.toml` で `auth.method = "oidc"` を指定すると、OIDCベースの認証が使用されます。
OIDCはOpenID Connectの略で、使用されるフローは[クライアント資格情報グラント](https://tools.ietf.org/html/rfc6749#section-4.4)と呼ばれます。
この認証タイプを使用するには、`frpc.toml` と `frps.toml` を次のように設定します。```toml
# frps.toml
auth.method = "oidc"
auth.oidc.issuer = "https://example-oidc-issuer.com/"
auth.oidc.audience = "https://oidc-audience.com/.default"
The -p option allows you to specify a custom port for the reverse shell. The -h option displays the help menu.```toml
frpc.toml
auth.method = "oidc" auth.oidc.clientID = "98692467-37de-409a-9fac-bb2585826f18" # Replace with OIDC client ID auth.oidc.clientSecret = "oidc_secret" auth.oidc.audience = "https://oidc-audience.com/.default" auth.oidc.tokenEndpointURL = "https://example-oidc-endpoint.com/oauth2/v2.0/token"
### 暗号化と圧縮
これらの機能はデフォルトではオフになっています。暗号化や圧縮を有効にすることができます:```toml
# frpc.toml
[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22
remotePort = 6000
transport.useEncryption = true
transport.useCompression = true
TLS
v0.50.0以降、transport.tls.enable と transport.tls.disableCustomTLSFirstByte のデフォルト値が true に変更され、TLS がデフォルトで有効になりました。
ポート多重化のため、frp は TLS 接続を確立する際に最初のバイト 0x17 を送信します。これは transport.tls.disableCustomTLSFirstByte を false に設定した場合にのみ有効です。
frps が TLS 接続のみを受け付けるように強制するには、frps.toml で transport.tls.force = true を設定します。これは任意です。
frpc の TLS 設定:```toml
transport.tls.enable = true
transport.tls.certFile = "certificate.crt"
transport.tls.keyFile = "certificate.key"
transport.tls.trustedCaFile = "ca.crt"
**`frps` TLS設定:**```toml
transport.tls.force = true
transport.tls.certFile = "certificate.crt"
transport.tls.keyFile = "certificate.key"
transport.tls.trustedCaFile = "ca.crt"
ルートCA証明書と少なくとも1つのSSL/TLS証明書が必要です。自己署名でも通常のもの(Let's Encryptや他のSSL/TLS証明書プロバイダーなど)でも構いません。
frpをホスト名ではなくIPアドレスで使用する場合は、SSL/TLS証明書を生成する際にSubject Alternative Name(SAN)領域に適切なIPアドレスを設定してください。
例を示します:
- openssl設定ファイルを準備します。Linuxシステムでは
/etc/pki/tls/openssl.cnf、MacOSでは/System/Library/OpenSSL/openssl.cnfに存在し、cp /etc/pki/tls/openssl.cnf ./my-openssl.cnfのように現在のパスにコピーできます。存在しない場合は、以下のように自分で作成することもできます:``` cat > my-openssl.cnf << EOF [ ca ] default_ca = CA_default [ CA_default ] x509_extensions = usr_cert [ req ] default_bits = 2048 default_md = sha256 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca string_mask = utf8only [ req_distinguished_name ] [ req_attributes ] [ usr_cert ] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = CA:true EOF
* CA証明書をビルドする:```
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=example.ca.com" -days 5000 -out ca.crt
- frps 証明書をビルドする:``` openssl genrsa -out server.key 2048
openssl req -new -sha256 -key server.key
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com"
-reqexts SAN
-config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com"))
-out server.csr
openssl x509 -req -days 365 -sha256
-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial
-extfile <(printf "subjectAltName=DNS:localhost,IP:127.0.0.1,DNS:example.server.com")
-out server.crt
* frpc 証明書をビルドする:```
openssl genrsa -out client.key 2048
openssl req -new -sha256 -key client.key \
-subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
-reqexts SAN \
-config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:client.com,DNS:example.client.com")) \
-out client.csr
openssl x509 -req -days 365 -sha256 \
-in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile <(printf "subjectAltName=DNS:client.com,DNS:example.client.com") \
-out client.crt
frpc 設定のホットリロード
HTTP API を有効にするには、webServer フィールドが必要です。```toml
frpc.toml
webServer.addr = "127.0.0.1" webServer.port = 7400
次に、コマンド `frpc reload -c ./frpc.toml` を実行し、`frpc` がプロキシを作成・更新・削除するまで約10秒待ちます。
**グローバルなクライアントパラメータは 'start' を除いて変更されないことに注意してください。**
`start` は、すべてのソース(設定ファイル/include/store)がマージされた後に評価されるグローバルな許可リストです。
`start` が空でない場合、そこにリストされていないプロキシやビジターは起動されません。Store API 経由で作成されたエントリも含まれます。
`start` は主に互換性のために維持されており、新しい設定では一般的に推奨されません。
プロキシ/ビジターごとの `enabled` を優先し、このグローバルな許可リストの動作を明示的に必要としない限り、`start` は空のままにしてください。
リロードする前に、コマンド `frpc verify -c ./frpc.toml` を実行して、設定エラーがないか確認できます。
### クライアントからプロキシの状態を取得する
`frpc status -c ./frpc.toml` を使用して、すべてのプロキシの状態を取得します。HTTP API を有効にするには `webServer` フィールドが必要です。
### サーバーで特定のポートのみを許可する
`frps.toml` の `allowPorts` は、ポートの悪用を防ぐために使用されます:```toml
# frps.toml
allowPorts = [
{ start = 2000, end = 3000 },
{ single = 3001 },
{ single = 3003 },
{ start = 4000, end = 50000 }
]
ポート再利用
frpsのvhostHTTPPortとvhostHTTPSPortは、bindPortと同じポートを使用できます。frpsは接続のプロトコルを検出し、それに応じて処理します。
注意すべき点は、vhostHTTPSPortとbindPortを同じポートに設定したい場合は、まずtransport.tls.disableCustomTLSFirstByteをfalseに設定する必要があることです。
将来的には、異なるプロトコルで複数のプロキシが同じリモートポートにバインドできるようにしたいと考えています。
帯域幅制限
各プロキシごと```toml
frpc.toml
[[proxies]] name = "ssh" type = "tcp" localPort = 22 remotePort = 6000 transport.bandwidthLimit = "1MB"
各プロキシのconfigureで`transport.bandwidthLimit`を設定すると、この機能を有効にできます。対応する単位は`MB`と`KB`です。
`transport.bandwidthLimitMode`を`client`または`server`に設定すると、クライアント側またはサーバー側の帯域幅を制限できます。デフォルトは`client`です。
### TCPストリーム多重化
frpはv0.10.0以降、HTTP2多重化と同様のTCPストリーム多重化をサポートしています。この場合、同じfrpcへのすべての論理接続は、同じTCP接続に多重化されます。
`frps.toml`と`frpc.toml`を変更することで、この機能を無効にできます。```toml
# frps.toml and frpc.toml, must be same
transport.tcpMux = false
KCP プロトコルのサポート
KCP は高速で信頼性の高いプロトコルであり、TCP と比較して帯域幅を 10% から 20% 多く消費する代わりに、平均レイテンシを 30% から 40% 削減し、最大遅延を 3 分の 1 に削減する伝送効果を実現できます。
KCP モードは基盤となるトランスポートとして UDP を使用します。frp で KCP を使用する方法:
- frps で KCP を有効にする: ```toml
frps.toml
bindPort = 7000
Specify a UDP port for KCP.
kcpBindPort = 7000
`kcpBindPort` の番号は、`bindPort` フィールドが TCP ポートを指定するため、`bindPort` と同じ番号にすることができます。
2. `frpc.toml` を設定して、KCP を使用して frps に接続します: ```toml
# frpc.toml
serverAddr = "x.x.x.x"
# Same as the 'kcpBindPort' in frps.toml
serverPort = 7000
transport.protocol = "kcp"
QUICプロトコルのサポート
QUICは、UDP上に構築された新しい多重化トランスポートです。
frpでQUICを使用する方法:
- frpsでQUICを有効にする: ```toml
frps.toml
bindPort = 7000
Specify a UDP port for QUIC.
quicBindPort = 7000
The `quicBindPort` 番号は `bindPort` と同じ番号にできます。`bindPort` フィールドは TCP ポートを指定するためです。
2. `frpc.toml` を設定して、QUIC を使用して frps に接続します: ```toml
# frpc.toml
serverAddr = "x.x.x.x"
# Same as the 'quicBindPort' in frps.toml
serverPort = 7000
transport.protocol = "quic"
接続プーリング
デフォルトでは、frpsはユーザーリクエストを受けるとバックエンドサービスへのfrpc接続を新規に作成します。接続プーリングを使用すると、frpsは事前に確立された一定数の接続を保持し、接続の確立に必要な時間を短縮します。
この機能は、大量の短い接続に適しています。
frps.tomlで各プロキシが使用できるプール数の上限を設定します: ```toml
frps.toml
transport.maxPoolCount = 5
2. 接続プールを有効にして、その数を指定します: ```toml
# frpc.toml
transport.poolCount = 1
負荷分散
負荷分散は group によってサポートされています。
この機能は現在、tcp、http、tcpmux タイプでのみ利用可能です。```toml
frpc.toml
[[proxies]] name = "test1" type = "tcp" localPort = 8080 remotePort = 80 loadBalancer.group = "web" loadBalancer.groupKey = "123"
[[proxies]] name = "test2" type = "tcp" localPort = 8081 remotePort = 80 loadBalancer.group = "web" loadBalancer.groupKey = "123"
`loadBalancer.groupKey` は認証に使用されます。
ポート 80 への接続は、同じグループ内のプロキシにランダムに振り分けられます。
タイプ `tcp` の場合、同じグループ内の `remotePort` は同じである必要があります。
タイプ `http` の場合、`customDomains`、`subdomain`、`locations` は同じである必要があります。
### サービスヘルスチェック
ヘルスチェック機能は、ロードバランシングによる高可用性の実現に役立ちます。
`healthCheck.type = "tcp"` または `healthCheck.type = "http"` を追加して、ヘルスチェックを有効にします。
ヘルスチェックタイプ **tcp** の場合、サービスポートが ping されます (TCPing):```toml
# frpc.toml
[[proxies]]
name = "test1"
type = "tcp"
localPort = 22
remotePort = 6000
# Enable TCP health check
healthCheck.type = "tcp"
# TCPing timeout seconds
healthCheck.timeoutSeconds = 3
# If health check failed 3 times in a row, the proxy will be removed from frps
healthCheck.maxFailed = 3
# A health check every 10 seconds
healthCheck.intervalSeconds = 10
ヘルスチェックタイプが http の場合、サービスにHTTPリクエストが送信され、HTTP 2xx OKレスポンスが期待されます:```toml
frpc.toml
[[proxies]] name = "web" type = "http" localIP = "127.0.0.1" localPort = 80 customDomains = ["test.example.com"]
Enable HTTP health check
healthCheck.type = "http"
frpc will send a GET request to '/status'
and expect an HTTP 2xx OK response
healthCheck.path = "/status" healthCheck.timeoutSeconds = 3 healthCheck.maxFailed = 3 healthCheck.intervalSeconds = 10
### HTTP Host ヘッダーの書き換え
デフォルトでは、frp はトンネルされた HTTP リクエストを一切変更しません。これはバイト単位のコピーだからです。
ただし、Web サーバーと HTTP リクエストに関して言えば、Web サーバーがアクセス先の Web サイトを判別するために `Host` HTTP ヘッダーに依存している場合があります。frp は、HTTP リクエストを転送する際に `hostHeaderRewrite` フィールドを使用して `Host` ヘッダーを書き換えることができます。```toml
# frpc.toml
[[proxies]]
name = "web"
type = "http"
localPort = 80
customDomains = ["test.example.com"]
hostHeaderRewrite = "dev.example.com"
The HTTPリクエストは、ブラウザからのリクエストがおそらくHost: test.example.comを持っているにもかかわらず、実際のWebサーバーに到達するときにHostヘッダーがHost: dev.example.comに書き換えられます。
他のHTTPヘッダーの設定
Hostと同様に、プロキシタイプhttpを使用して他のHTTPリクエストおよびレスポンスヘッダーを上書きできます。```toml
frpc.toml
[[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["test.example.com"] hostHeaderRewrite = "dev.example.com" requestHeaders.set.x-from-where = "frp" responseHeaders.set.foo = "bar"
この例では、HTTPリクエストにヘッダー `x-from-where: frp` を設定し、HTTPレスポンスに `foo: bar` を設定します。
### 実際のIPを取得する
#### HTTP X-Forwarded-For
この機能は、`http` プロキシ、または `https2http` および `https2https` プラグインが有効なプロキシ向けです。
HTTPリクエストヘッダー `X-Forwarded-For` からユーザーの実際のIPを取得できます。
#### Proxy Protocol
frpは、ユーザーの実際のIPをローカルサービスに送信するためのProxy Protocolをサポートしています。
以下は、httpsサービスの例です。```toml
# frpc.toml
[[proxies]]
name = "web"
type = "https"
localPort = 443
customDomains = ["test.example.com"]
# now v1 and v2 are supported
transport.proxyProtocolVersion = "v2"
nginxでProxy Protocolサポートを有効にすると、ユーザーの実際のIPをHTTPヘッダーX-Real-IPで公開でき、Webサービス側でX-Real-IPヘッダーを読み取って実際のIPを取得できます。
WebサービスにHTTP Basic Auth(パスワード)を要求する
トンネルURLを推測できた人は誰でも、パスワードで保護していない限り、ローカルWebサーバーにアクセスできます。
これにより、frpcの設定ファイルで指定されたユーザー名とパスワードを使用して、すべてのリクエストにHTTP Basic Authが強制されます。
これは、プロキシタイプがhttpの場合にのみ有効にできます。```toml
frpc.toml
[[proxies]] name = "web" type = "http" localPort = 80 customDomains = ["test.example.com"] httpUser = "abc" httpPassword = "abc"
ブラウザで `http://test.example.com` にアクセスすると、ユーザー名とパスワードの入力を求められます。
### カスタムサブドメイン名
多くの人が1つのfrpsサーバーを共有する場合、httpおよびhttpsタイプには `subdomain` 設定を使用すると便利です。```toml
# frps.toml
subDomainHost = "frps.com"
*.frps.com を frps サーバーの IP に解決します。これは通常、ワイルドカード DNS レコードと呼ばれます。```toml
frpc.toml
[[proxies]] name = "web" type = "http" localPort = 80 subdomain = "test"
これで、`test.frps.com` でWebサービスにアクセスできるようになります。
`subdomainHost` が空でない場合、`customDomains` は `subdomainHost` のサブドメインであってはならないことに注意してください。
### URLルーティング
frpは、URLルーティングによってHTTPリクエストを異なるバックエンドのWebサービスに転送することをサポートしています。
`locations` は、ルーティングに使用されるURLのプレフィックスを指定します。frpsはまず、リストの順序に関係なく、リテラル文字列によって指定された最も具体的なプレフィックスの場所を検索します。```toml
# frpc.toml
[[proxies]]
name = "web01"
type = "http"
localPort = 80
customDomains = ["web.example.com"]
locations = ["/"]
[[proxies]]
name = "web02"
type = "http"
localPort = 81
customDomains = ["web.example.com"]
locations = ["/news", "/about"]
HTTPリクエストでURLプレフィックスが /news または /about の場合、web02 に転送され、その他のリクエストは web01 に転送されます。
TCPポート多重化
frpは、vhostHTTPPort や vhostHTTPSPort と同様に、frps上の単一ポートで異なるプロキシ宛てのTCPソケットを受信することをサポートしています。
現在利用可能な唯一のTCPポート多重化方式は httpconnect(HTTP CONNECTトンネル)です。
frpsで tcpmuxHTTPConnectPort を0以外に設定すると、frpsはこのポートでHTTP CONNECTリクエストを待ち受けます。
HTTP CONNECTリクエストのホストは、frps内のプロキシを照合するために使用されます。プロキシホストは、multiplexer = "httpconnect" の場合、frpcで tcpmux プロキシの下に customDomains や subdomain を設定することで構成できます。
例:```toml
frps.toml
bindPort = 7000 tcpmuxHTTPConnectPort = 1337
I need the input content to translate. Please provide the chunk of Markdown content you'd like me to translate from English to Japanese.```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
[[proxies]]
name = "proxy1"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["test1"]
localPort = 80
[[proxies]]
name = "proxy2"
type = "tcpmux"
multiplexer = "httpconnect"
customDomains = ["test2"]
localPort = 8080
上記の設定では、frps は以下のような HTTP CONNECT ヘッダーを使用してポート 1337 で接続できます。``` CONNECT test1 HTTP/1.1\r\n\r\n
and the connection will be routed to `proxy1`.
### PROXY 経由での frps への接続
OS の環境変数 `HTTP_PROXY` を設定するか、frpc.toml ファイルで `transport.proxyURL` を設定すると、frpc はプロキシ経由で frps に接続できます。
これはプロトコルが tcp の場合にのみ機能します。```toml
# frpc.toml
serverAddr = "x.x.x.x"
serverPort = 7000
transport.proxyURL = "http://user:[email protected]:8080"
ポート範囲マッピング
v0.56.0 で追加
Goテンプレートの範囲構文と、組み込みの parseNumberRangePair 関数を組み合わせることで、ポート範囲のマッピングを実現できます。
次の例を実行すると、test-6000, test-6001 ... test-6007 という名前の8つのプロキシが作成され、それぞれがリモートポートをローカルポートにマッピングします。```
{{- range $_, $v := parseNumberRangePair "6000-6006,6007" "6000-6006,6007" }}
[[proxies]]
name = "tcp-{{ $v.First }}"
type = "tcp"
localPort = {{ $v.First }}
remotePort = {{ $v.Second }}
{{- end }}
### クライアントプラグイン
frpcはデフォルトではローカルのTCPまたはUDPポートにのみリクエストを転送します。
プラグインは豊富な機能を提供するために使用されます。`unix_domain_socket`、`http_proxy`、`socks5`、`static_file`、`http2https`、`https2http`、`https2https` などの組み込みプラグインがあり、[使用例](#example-usage)を参照できます。
プラグイン **http_proxy** の使用:```toml
# frpc.toml
[[proxies]]
name = "http_proxy"
type = "tcp"
remotePort = 6000
[proxies.plugin]
type = "http_proxy"
httpUser = "abc"
httpPassword = "abc"
httpUser と httpPassword は、http_proxy プラグインで使用される設定パラメータです。
サーバー管理プラグイン
ドキュメント をお読みください。
その他のプラグインは gofrp/plugin にあります。
SSH トンネルゲートウェイ
v0.53.0 で追加
frp は frps 側で SSH ポートのリッスンをサポートし、frpc に依存せずに SSH -R プロトコルを通じて TCP プロトコルのプロキシを実現します。```toml
frps.toml
sshTunnelGateway.bindPort = 2200
`./frps -c frps.toml` を実行すると、現在の作業ディレクトリに `.autogen_ssh_key` という名前の秘密鍵ファイルが自動的に作成されます。この生成された秘密鍵ファイルは、frps 内の SSH サーバーによって使用されます。
コマンドを実行すると```bash
ssh -R :80:127.0.0.1:8080 v0@{frp address} -p 2200 tcp --proxy_name "test-tcp" --remote_port 9090
frps上にプロキシを設定し、ローカルの8080サービスをポート9090に転送します。```bash frp (via SSH) (Ctrl+C to quit)
User: ProxyName: test-tcp Type: tcp RemoteAddress: :9090
これは以下と同等です:```bash
frpc tcp --proxy_name "test-tcp" --local_ip 127.0.0.1 --local_port 8080 --remote_port 9090
詳細については、このドキュメントを参照してください。
仮想ネットワーク(VirtualNet)
v0.62.0で追加されたアルファ機能
VirtualNet機能により、frpはTUNインターフェースを介してクライアントとビジター間の仮想ネットワーク接続を作成・管理できます。これにより、マシン間のIPレベルのルーティングが可能になり、frpを単純なポート転送を超えて完全なネットワーク接続をサポートするように拡張できます。
設定と使用方法の詳細については、VirtualNetドキュメントを参照してください。
フィーチャーゲート
frpは実験的な機能を有効または無効にするためのフィーチャーゲートをサポートしています。これにより、ユーザーは機能が安定版と見なされる前に新機能を試すことができます。
利用可能なフィーチャーゲート
| 名前 | ステージ | デフォルト | 説明 |
|---|---|---|---|
| VirtualNet | ALPHA | false | frpの仮想ネットワーク機能 |
フィーチャーゲートの有効化
実験的な機能を有効にするには、設定にフィーチャーゲートを追加します:```toml featureGates = { VirtualNet = true }
### 機能ライフサイクル
機能は通常、次の3つの段階を経ます:
1. **ALPHA**:デフォルトで無効、不安定な場合があります
2. **BETA**:デフォルトで有効な場合があり、より安定していますが、まだ進化中です
3. **GA(一般提供)**:デフォルトで有効、本番環境での使用に適しています
## 関連プロジェクト
* [gofrp/plugin](https://github.com/gofrp/plugin) - frpプラグインのリポジトリで、frp拡張メカニズムに基づいて実装されたさまざまなプラグインが含まれており、さまざまなシナリオのカスタマイズニーズを満たします。
* [gofrp/tiny-frpc](https://github.com/gofrp/tiny-frpc) - sshプロトコルを使用して実装された軽量版のfrpクライアント(最小で約3.5MB)で、最も一般的に使用される機能の一部をサポートし、リソースが限られたデバイスに適しています。
## 貢献
参加に興味がありますか? 私たちはあなたを支援したいと思います!
* 私たちの[issuesリスト](https://github.com/fatedier/frp/issues)を確認し、**devブランチ**にプルリクエストを送信することを検討してください。
* 新しい機能を追加したい場合は、まずissueを作成して、新しい機能と実装アプローチを説明してください。提案が承認されたら、新しい機能の実装を作成し、プルリクエストとして提出してください。
* 私の英語が下手で申し訳ありません。このドキュメントの改善(タイプミスの修正も含む)を歓迎します。
* 素晴らしいアイデアがあれば、[email protected]にメールを送ってください。
**注:私たちは[issues](https://github.com/fatedier/frp/issues)にあなたのアドバイスを提供することを好みます。そうすれば、同じ質問を持つ他の人がすぐに検索でき、繰り返し回答する必要がなくなります。**
## 寄付
frpがあなたに大いに役立つなら、次の方法で私たちを支援できます:
### GitHubスポンサー
[Github Sponsors](https://github.com/sponsors/fatedier)を通じて私たちを支援してください。
このプロジェクトのREADMEファイルにあなたの会社のロゴを掲載できます。
### PayPal
[PayPal](https://www.paypal.me/fatedier)から私のアカウント**[email protected]**に寄付してください。