VPSとかクラウドサーバとVPNつないでリバースプロキシして自宅サーバを公開するやつ
Overview
経緯
aries家は色々駄目なアパートなのでインターネット環境がしょぼい。
どうしょぼいかと言うと、
- ルータにグローバルIPが直接もらえない
- つまりはポート開放ができない
- 速度も出ない
- わりと途切れる
ITのオタクとしては自宅サーバ公開とか、外から自宅NWに入るためのVPN環境だとか、そういうのに憧れるけどこういう環境だとストレートなやり方は通じません。
今回はなんとかしてその辺を越えようね、というヤツです。
大体次の2つによる思いつき
- Raspberry Pi4も発売かー。家のPi2なにか有効活用したいね
- mstdnサーバメンテ用の踏み台に使ってるEC2とEIPちょっともったいない
余してるEC2に関してはsoftether VPNを以前から用意しておりたまに使っていたのですが、socksで十分だし443開けてなにか使えないかなー、みたいな。
VPN通してリバースプロキシするっていう手法を教えてくださったmastodonのフォロワー各位ありがとうございました!
接続
だいたいこんな感じ。構成図とかは私がいろいろ考えてた最中の手書きの汚いものしかないので省略。
[自宅RPi] - [自宅ルータ] - [NAT] - [省略] - <インターネッツ> - [AWS-EC2(ElasticIP付き)]
Raspberry PiとEC2の間でVPNを張り、EC2側でリバースプロキシすればRPiで動かす何らかのなにか(未定)を公開もできるしもっと言うとsocks通せば家のNWにも入れてとってもいいね、という。
作業
作業内容はこんな感じ。
- Raspberry Pi2にRaspbianインストール
- MACアドレスを使ったDHCP固定割当(ちゃんと設定するの面倒くさかった)
- まともなサーバとして使えるようにdotfiles入れたりとかapt update, upgradeしたりとか
- EC2とRPiにOpenVPNインストール
- EC2にnginxやらcertbotやらインストール
- OpenVPN設定
上でsoftetherを使っていると書いていたのにOpenVPNをわざわざ新しく使っているのは、単純に私がsoftetherを使ってやりたい事をいい感じに実現できなかったからです……。
OpenVPNの設定は
- EC2側をサーバとして、RPiをクライアントとして稼働(NATあるので)
- TAPではなくTUN
- UDPではなくTCP
今回はL2レベルでやる理由も特になかったのと、また最初はUDPでつないでいたのですがあまりに安定しなかったのでTCP接続としています。
数分置きに切れるのは流石に使い物にならぬ……。
証明書の設定なんかはQiitaなんかに転がってるものとか公式のマニュアルを参考にしてもらうとして、OpenVPN周りで詰まった部分としては以下の1点です。
UDPだと何も考えずQiitaコピペとかで普通につながるし通信もできるしリバースプロキシも動くけど、TCPだとpingすら通らなくなってしまった。
これはOpenVPNの圧縮設定に依るものだったみたいです。
古い設定オプションである「comp-lzo」をやめて、
compress lz4-v2
push "compress lz4-v2"
をサーバ側で設定し直しました。真面目にマニュアル読もうね。
その他注意点としては、VPNに割り当てるIPアドレスのかぶりですかね。
VPC側ともローカル側ともかぶらないようにしましょう。
結果
このVPN接続ができると、EC2側からVPN内のアドレスを使って自宅RPiへのアクセスが可能となります。
つまりは、例えばVPNで割り当ててるアドレスがRPi側は10.100.0.2/24とかだった場合、EC2側のnginxで
location / {
proxy_pass http://10.100.0.2:4000;
}
とか書けばいい訳ですね。
またsshを通しておけば更にローカルポートフォワードを2段通すことで
[手元のPC] - [EC2] - [VPN] - [自宅RPi] - [自宅NW]
ということも可能です。
例えば「RPiからWake on LANパケット流したいけどMACアドレスわかんないなー。家のルータに入れれば分かるのになぁ」などという場合に上の接続ができると、リモートからでも自宅のルータへログイン出来て役立ちますね!(ほんとか?)(ホントです)
ちなみにリバースプロキシの動作確認はRaspberry PiにPleromaをインストールして試しました。
まだ動いていますが
- バックアップの仕組みをちゃんと作れていない
- 回線細いので画像とか貼るのが厳しい
- ストレージが大体2年前に買ったmicroSDでいつ壊れるかわからない
などの理由によりおおっぴらに外部をフォローしたりはしていません。
なのでそう遠くないうちに別用途に転用かなぁ……。
転用案
例えばわたしはよく外から自宅PCを触るのに(このVPN環境を作る前は)Chromeリモートデスクトップを使っていました。
ただ、ずっと電源を入れておく必要がありスリープモードあるいは電源オフだと接続はできません。
ですので「Webからマジックパケットを流す小さなツールを使えばいい感じに電気代を節約しつつも便利に使えるのでは!」とか考えてます。
大した追加投資無く自宅へのリモート環境は作れるのでやってないオタク各位はやろうね。