ポート開放できない環境で自宅サーバーする

この記事は約8分で読めます。

背景

Nuro光10Gにアップグレードしたら自宅サーバーできなくなったけどなんとかなった話。

元々近いうちに10Gにしたいとは考えていてて、先日Nuroから10Gプランにアップグレードしませんかと電話営業が来て(中略)ホイホイ承諾しちゃって工事日を迎えたわけですが、、、

と、浮かれていたのもつかの間、いざ「さぁてサーバー用にポート開放するかぁ」とONUの設定を開いてみると、ポート転送の設定画面の項目がグレーアウトして設定できない!

調べていくと、タイプが MAP-E 方式になっていると、そもそもポートは開けないらしい。

【公式】IPv6アドレス対応およびMAP-E方式について | NURO 光 - インターネット・光回線
NURO 光の「IPv6アドレス対応およびMAP-E方式について」ページです。NURO 光では、IPv4アドレスの後継規格であるIPv6アドレスへの対応を行っています。

”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 ではありません)

GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.
A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. - fatedier/frp

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

タイトルとURLをコピーしました