やりたいこと

webアプリケーションを家のサーバで動かすとなるとセキュリティーの観点からして怖いじゃないですか。やっぱり自宅のipさらしたくないじゃないですか。 だからAWSなどのVPSを借りてそのうえでアプリを動かすんだと思います。

ただね、VPSでは二次記憶で使えるデータ量が決まっているんですね。しかもそのデータ量が結構限られています。例えば僕が契約しているサーバは二次記憶の容量が30GBです。つまり、大規模なデータベースを展開するには、大幅な課金が必要になるわけです。しかもさ、データベースを移植するのって結構面倒だからさ、一回構築したやつを長く使いたいんです。だからね、データベースだけは自宅においておき、アプリケーションが自宅のDBにデータをとりにきたり、おきに来たりすればいいのでは?と今思っているわけです。DBクライアントがデータを取ってくる時の通信量も考えるとどっちが安いかはまだわからないんですけどね。

じゃあ、自宅のルータをポート開放して、ポートフォワードすればいいんじゃねーの?って思うよね。でもね、データベース用のポートを開放しておくのもなんか怖いんですよ。ブルートフォースとか受けて、破られることもあるわけじゃないですか。ということで、vpnを介して自宅のネットワークにアクセスできるようにしておけばいいのではないか?というのが僕の考えです。

vpnクライアントのインストール

sudo apt update

sudo apt install openvpn

vpnクライアント、設定ファイルのインポート

config.ovpnをサーバに配置

sudo openvpn --config /path/to/my/ovpn/file

パスワードを入力してトンネル完了

openvpnを介して自宅のmysqlサーバに接続

mysql -u ray -h 192.168.3.10 -p

Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 473
Server version: 8.0.33-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

いけてしまっている…これはマジで感動!!ネットワークはやはり面白い。仕組みとかはもっと勉強しないといけませんが。 いやー--、実際これはすごいです。マジですごいですわ!!感動ですわ。

感想

openvpnすごい。

clientアプリのでーもないずでーもないず

systemdを使えばでーもないずもできます。

もんだい

なんでかわからんけど、openvpnをonにしてると、接続先のip以外からのアクセスは受け付けなくなるんだよね。なんでだ??openvpnを切ると普通にhttpsも受け付けるんだけど。 openvpnを使わないとdbにアクセスできないけど、openvpnを使うと、httpsでユーザに使ってもらえないという。 openvpnの設定でどうにかできるのかな?

解決方法

openvpnもdockerの中から使えばいいんだ。すごい。dockerの中のネットワークだけど、自宅のホストと接続すればうえの問題は解決できるはず。ちょっとやってみます。 それやるときは、ホストのopenvpnの設定ファイルを読み込ンでください。

しかし、 2023-08-15 12:27:05 ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2) が出てしまって、dockerの中からだとどうもうまくいかないんですよね。

で、これを解決する方法があるんですけどね。docker containerに/dev/net/tunをわたし、さらにアクセス権も与える、という感じです。次のようにします。

sudo docker container create --name jc_data -p 8080:8080 -i -v ~/.ovpn:/root/.ovpn/ --device=/dev/net/tun --privileged jc_data_ovpn_image

これで、docker containerの中からtunを使えるようになって、無事に自宅のvpn serverに接続できるようになりますよと。

いろいろまとめ

webアプリケーションを作るとき、apiサーバとフロントエンド用のコードを取得するためのwebサーバの二つを用意すると思います。で、どちらのソースにももnginxをプロキシとして使うことでアクセスできるようになります。 さらに、nginx + lets encryptでwebサーバとapiサーバどちらの通信も暗号化できます。

apiサーバはホストの8080とかで動かしていると思いますが、 表向きはnginxを使って443ポートの/apiとかにアクセスして、これを/localhost:8080/api/にリバースプロキシしてください。微調整はフロントエンドコードから行ってください。 たとえば :443/api/ -> localhost:8080/api/ とかにリバースプロキシしてくれればいいです。そうすれば、ssl関係はnginxが一挙に担ってくれます。

openvpnを使って自宅のホストのデータベースにアクセスしたいときは、ホストの上でopenvpnを使ってはダメです。なぜかわからないけど、普通の443ポートにつながらなくなるからです。chatgpt曰く、すべての通信がvpnでトンネルされるからだとか。 これを防ぐためにdockerコンテナの中だけvpnを有効にします。

nodejsもscreenを使って別ターミナルで実行することをお勧めします!!

sudo docker create --name la_keiba --device=/dev/net/tun --privileged -it -p 8000:8000 la_keiba_backend

こちらになりまーす。

追記

Dockerの中でopenvpnクライアントを起動し、そのコンテナだけをプライベートネットワークに接続することはできた。しかしだ。今はね、いちいちどっかーコンテナの中に入って、つないでってやってるのよね。これ、全部自動でできる方法ないかなって今考えていて。ネックとなるのが、openvpnクライアントの自動起動だよね。