背景
Nuro光10Gにアップグレードしたら自宅サーバーできなくなったけどなんとかなった話。
元々近いうちに10Gにしたいとは考えていてて、先日Nuroから10Gプランにアップグレードしませんかと電話営業が来て(中略)ホイホイ承諾しちゃって工事日を迎えたわけですが、、、
と、浮かれていたのもつかの間、いざ「さぁてサーバー用にポート開放するかぁ」とONUの設定を開いてみると、ポート転送の設定画面の項目がグレーアウトして設定できない!
調べていくと、タイプが MAP-E 方式になっていると、そもそもポートは開けないらしい。
”IPv4枯渇のため”とのことなので、「なるほど、これからはIPv6をちゃんと扱っていかないのか」と最初は思って試行錯誤していたのですが、NuroのMAP-Eの仕組み上IPv6でも(任意の)ポートは開けれないらしい。
流石にNuroBizなどの逸般の誤家庭回線なら問題なくポート開放なりできるとは思いますが、コスト的に無理。。。
ポートはIPv4枯渇と関係無いはずなので開放させてくれと思う所ですが、もう一般回線でサーバー立てる時代じゃなくなってきたのかもしれません。知らんけど
とは言え、今更他に乗り換えるとか、もう1回線開くとかは難しいので、今の環境でなんとかする方法を考えます。
サーバー構成などの前情報はこちらを参照してください
①Cloudflareトンネル
せっかくCloudFlareを利用しているので、不随サービス的なCloudFlareトンネルが候補にあがりましたが、全通信がCloudflareを経由するようになるので、Minecraftサーバーを要件にしている私としてはレスポンス等のパフォーマンス面で心配なのと、基本的にWebサービスで使う事を考慮しているみたいなので、今回はパス。(UDPいけるかどうかも分からないし)
②VPS+VPN
内からはどう足掻いても公開できないなら、外部に代理してもらうしかない。
ということで低コストのVPSを借りてVPNトンネルを張る方法。
が、VPNはトンネル間通信を暗号化するので、処理負荷や遅延、レスポンス低下などの懸念があります。しかも、公開サーバなのでその通信路暗号化する意味は無い…
③VPS+FRP
VPSを借りるのは同じで、VPNの代わりにFRPというものがあるらしいです。(繊維強化プラスチック Fiber Reinforced Plastics ではありません)
frpは、NATまたはファイアウォールの背後にあるローカルサーバーをインターネットに公開できる高速リバースプロキシです。
だそうです。
VPNのように暗号化しないので高速に中継することができるという点がポイントかと思います。
ということで FRP を使います。
おかげで(?)、自宅サーバーにアクセスするのに一旦外部のVPS経由しないといけないのはもどかしいが、外部環境の確認にもなるのでこれはこれで良いかもしれない?
LANアクセスできるものは直接アクセスすれば良いし
構築手順
VPSの契約や立ち上げは省きますが、中継だけなので、最低プランで十分。
強いて言うならば帯域が多少不満(100Mbps)な所はありますが、
なおOSについては RockyLinux を選択しています。
ホスト(VPS)側
インストール
sudo dnf install -y tar
mkdir /etc/frp
cd /etc/frp
curl -OL https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
tar xvf frp_0.65.0_linux_amd64.tar.gz
cp frp_0.65.0_linux_amd64/frps ./
vim frps.toml で設定を構成します。
bindPortはVPS側のfrp待ち受けポートで解放しておく必要があります。大体何でも良いですがここでは 30080 としています。
tokenはクライアント側と合わせていれば何でもよいですが、セキュリティ的にはなるべく長い方が良さそう。
bindAddr = "0.0.0.0"
bindPort = 30080
auth.method = "token"
auth.token = "toriaezutotemototemonagaiservertoclientdeonazitokenwokokonisetteisuru"
ポート開放。
VPS側のパケットフィールターの任せても良いかもしれないけど一応。
bintPortと必要なサービスの分解放します。
sudo firewall-cmd --add-port=30080/tcp --zone=public --permanent
sudo firewall-cmd --add-service=http --zone=public --permanent
sudo firewall-cmd --add-service=https --zone=public --permanent
sudo firewall-cmd --reload
サーバー側側のデーモン作成
sudo vim /etc/systemd/system/frpc.service
[Unit]
Description=frps service
After=network.target
[Service]
ExecStart=/etc/frp/frps -c /etc/frp/frps.toml
Restart=always
[Install]
WantedBy=multi-user.target
デーモン再読み込みと有効化
sudo systemctl daemon-reload
sudo systemctl enable --now frps
クライアント(自宅サーバー)側
クライアントは仮想マシンでも良いですが、クライアント側が何故か SELinux に引っかかる模様?
(直接実行すると起動するが、デーモンにして起動しようとすると起動できない)
なのでLXCコンテナでやります。
インストール
[root@frp frp]# dnf install -y tar
[root@frp frp]# mkdir /etc/frp
[root@frp frp]# cd /etc/frp
[root@frp frp]# curl -OL https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
[root@frp frp]# tar xvf frp_0.65.0_linux_amd64.tar.gz
[root@frp frp]# cp frp_0.65.0_linux_amd64/frpc ./
vim frpc.toml で設定を構成します。
serverAddr にはVPSのIPアドレスを設定します。
192.168.1.4 は私のTraefikを立てているコンテナのアドレスです。各自の宛先に書き換えてください。
serverAddr = "xxx.xxx.xxx.xxx"
serverPort = 30080
auth.method = "token"
auth.token = "toriaezutotemototemonagaiservertoclientdeonazitokenwokokonisetteisuru"
[[proxies]]
name = "web"
type = "tcp"
localIP = "192.168.1.4"
localPort = 80
remotePort = 80
[[proxies]]
name = "websequre"
type = "tcp"
localIP = "192.168.1.4"
localPort = 443
remotePort = 443
とりあえずHTTPとHTTPSだけ例にしていますが、転送したいポートをここに書き連ねます
クライアント側のデーモン作成
vim /etc/systemd/system/frpc.service
[Unit]
Description=frpc service
After=network.target
[Service]
ExecStart=/etc/frp/frpc -c /etc/frp/frpc.toml
Restart=always
[Install]
WantedBy=multi-user.target
デーモン再読み込みと有効化
[root@frp frp]# systemctl daemon-reload
[root@frp frp]# systemctl enable --now frpc
動作テスト
/etc/frp/frpc -c /etc/frp/frpc.toml
エラーっぽいの出てなかったら大丈夫かと。
大丈夫そうなら、デーモンから起動
[root@frp frp]# systemctl start frpc
CloudFlare側の設定
AレコードをVPSのアドレスに設定すればOK
参考文献
参考サイト
https://zenn.dev/book000/articles/conohavps-frp
他の手段でやってる方々
https://note.com/osmaniax/n/n8dd43879b927
https://tatuiyo.xyz/?p=1027#Web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC


