Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Jan 15, 2021 - コメント - 日記

ngrokに飽きたらFRPもね!〜FRP実践編その1 ローカルサーバを晒す

前回の記事 の続きでFRP やっていきます。

ローカルサーバを晒す

このツールで一番よく使われる(と思われる)ユースケース2点、公式サイトのドキュメント和訳して掲載します。

  • LANのコンピュータにSSHでアクセスする
  • カスタムドメインでLAN内のWebサービスをアクセスする

LANのコンピュータにSSHでアクセスする

  1. サーバAでfrps.iniを修正してfrpクライアントから接続したいポートをbind_port に書いてください:
1
2
3
# frps.ini
[common]
bind_port = 7000
  1. frpsをサーバAで起動します

./frps -c ./frps.ini

  1. サーバB上で、frpc.iniを修正してあなたのfrpsサーバのパブリックIPをserver_addrフィールドに書いてください:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

local_port (クライアント側でリッスンされる) と remote_port (サーバ側で公開される) は frp システムに出入りするトラフィックのためのものであり、server_port は frp システム間で使用されることに注意してください。

  1. サーバBで frpc を起動する:

./frpc -c ./frpc.ini

  1. 別のマシンから、このようにしてサーバBにSSHします(ユーザ名を test とします)

ssh -oPort=6000 test@x.x.x.x

カスタムドメインでLAN内のWebサービスをアクセスする

独自ドメイン名でテストするために、NATネットワークの中にあるローカルウェブサービスを他の人に公開したいことがありますが、残念ながらドメイン名をローカルIPに解決することはできません。

frpを使えばHTTP(S)サービスを公開することは可能です。

  1. frps.ini を修正し、vhost の HTTP ポートを 8080 に設定:
1
2
3
4
# frps.ini
[common]
bind_port = 7000
vhost_http_port = 8080
  1. frps を起動

./frps -c ./frps.ini

  1. frpc.ini を変更し、server_addr にリモートの frps サーバの IP アドレスを設定します。local_port はウェブサービスのポート番号です。
1
2
3
4
5
6
7
8
9
# frpc.ini
[common]
server_addr = x.x.x.x
server_port = 7000

[web]
type = http
local_port = 80
custom_domains = www.example.com
  1. frpc を起動する

./frpc -c ./frpc.ini

  1. www.example.comのAレコードをリモートfrpsサーバの公開IPに変更するかまたはCNAMEレコードを指定する

  2. URL http://www.example.com:8080 を使ってローカルのWebサービスにアクセス


以上、公式の抜粋和訳終わり

赤の他人に使わせない

基本公式のドキュメントで動くのですが、このままだと、だれでもあなたのfrpsを使える状態になっちゃいますのでトークンを設定するべきだと思います。

1
2
[common]
token = t0k3n

サーバ・クライアントともに他人が推測不可能な文字を[common]に書いてください。

設定ファイル作るの面倒だ

ngrokと比べて、frpcで接続するのにいちいち設定ファイルを作るのがめんどくさいと言う人にはコマンドラインオプションもあります。公式の例だとこんな感じ:

frpc http -d www.example.com -l 80 -s x.x.x.x:7000

HTTPSを使いたい

type = https をかえます、ただしexample.comのSSL証明書の設定は別に行う必要があります。これについては機会があればtraefik 使った例を紹介したいと思います。