はじめに
平部員のcl0wnと申します。LinuxClubアドベントカレンダー2020 15日目です。よろしくお願いします。
最近OpenVPNサーバーをConoHaのVPS上に立てたので、OpenVPN経由で、自宅サーバーに接続する方法について書こうと思います。
インフラ系あんまり詳しくないので、「もっといい方法あるよ!」等あればウェルカムです。
背景
自宅サーバーを運用したい!
1年程前にそう思い立ち、半年ほどルーターのDMZ設定をがんばっていたのですが、うまくいきませんでした。(上位のルーターが厳しいのかな?)
今はauの回線を契約してるのですが、レンタルルーターしか使えない。乗り換えたいのですが、被扶養の身なので、乗り換えるにも父にプレゼンをしなきゃいけない。
こういった理由から面倒くさくてここ半年ほど放置していたのですが、1週間ほど前にSoftEtherVPN経由で自宅サーバーに接続するといった内容の記事を発見しました。これをきっかけに自宅サーバー運用したい熱が再燃しました。
構成
構成は至極単純で上図の通りです。
この構造を取ったうえでインターネットからConoHaのVPSを経由して自宅サーバーにアクセスする方法は2つ思いつきます。
方法1: OpenVPNクライアントとしてネットワークに入り、10.8.0.2にアクセスする。
方法2: VPSに来たパケットを自宅サーバーに転送する設定をしてあげた上でVPSにアクセスする。
方法1は身内でサーバー内で遊んだりするときに使うのがよさそうです。
方法2は、例えば、「VPSの80番にパケットが来たら10.8.0.2の80番に転送する」みたいな設定をしてあげればVPSを経由して自宅のWebサーバーにアクセスできるようになります。
今回は方法2を想定してセットアップをしました。
サーバー側
基本的にこちらの記事を参考にしました。
この記事を参考にして構築する中で詰まった点をつらつら書こうと思います。
- server_r.confの142行目は自分のLANのアドレスに合わせてください。自分はそもそもコメントを外しませんでした。
- ファイルパスを指定するところはフルパスで指定すると問題が置きづらいです。
- systemctlでサーバーが起動できなかったのでこちらを見てユニット定義ファイルを書きました。
- firewall-cmdでファイアウォールの設定をするときは自分の環境に合わせてください
以下のコマンドで外部からアクセスが来るNICが割り当てられているゾーンをちゃんと確認しましょう。上の記事だとexternalになっていますが、自分は外部からアクセスが来るeth0が割り当てられているzoneがpublicでした。
$ firewall-cmd --list-all-zones
ファイアウォールの設定に関してはこちらが参考になりました。ゾーンの確認から下は一通り打ち込みました。
上の記事にもありますが、自分はtunインタフェースをtrusted zoneに割り当てました。
ポートフォワード設定
下の例だと、vpsの80番に来た通信を自宅サーバー(10.8.0.2)に転送しています。IPマスカレードが各インタフェースでできるようになっていないと通信ができないっぽいです。
$ firewall-cmd --add-forward-port=port=80:proto=tcp:toport=80:toaddr=10.8.0.2 --zone=public --permanent
$ firewall-cmd --add-masquerade --zone=public --permanent
$ firewall-cmd --add-masquerade --zone=trusted --permanent
$ firewall-cmd --reload
$ firewall-cmd --query-masquerade --zone=public # yes
$ firewall-cmd --query-masquerade --zone=trusted # yes
自宅サーバー設定
-
/usr/share/doc/openvpn/sample/sample-config-files/client.conf
(yumでインストールした場合)と各種証明書(client.crt, client.key, ta.key, ca.key)をscpなどを使ってローカルに持ってきます。 - client.confの設定はserverのコンフィグに合わせます。
- サーバーのIPやポートを指定
- 証明書のパスを指定 or xmlのように記述
- 圧縮をする項目のコメントアウト(;)を外す(これを忘れて1時間くらい悩みました)
- etc
-
openvpn <コンフィグファイル>
でつながるか確認 - systemctlを使ってサービス化
こちらを参考にしてください。
動作検証
ここまでの設定を済ませたら、自宅サーバーで簡易webサーバーを立てて,vps経由でアクセスできるか試してみます。
自宅サーバー
echo hello > index.html
python3 -m http.server 80
ブラウザから<vpsのIPアドレス>:80
でhelloと表示されるか確認します。
終わりに
- 自宅サーバーを外部からいじれるようになったので、積極的に使っていきたいです。
- 自宅サーバーの電気代とVPS代とダブルでお金がかかるので、なんとかしたいです。
最後まで読んでくださりありがとうございました