自宅にVPNサーバを構築してみた日記(l2tp,centos7)
ちょくちょく喫茶店に行くのだけど、フリーwifiってあまり信用していないので、やっぱり気軽にVPN使えるようになりたい。
でもケチなので、巷のVPNサービスに金は払いたくない。
という理由から、昔実家で作って放置していたNAS(CentOS)を使ってVPNサーバを作ってみることにしたよ。
ざっと書いてるので間違ってたことがあったら教えて下さい。
VPNはトンネリングと暗号化の2つの技術によって成り立つ。
トンネリングについては以下を参照すると、なんとなくわかるような気がする。
https://www.kddi.com/yogo/通信サービス/トンネリング.html
ようは、VPNって、例えば自宅VPNサーバとモバイルの端末をVPN接続したいなーってなったら、そのサーバとトンネルを張って、その通信を暗号化するということでVPNが成り立つ。
なので、多分だけど極論いえば暗号化しないのであればIPSECいらないんじゃないかな。
で、流れとしては、まずVPNサーバとL2TPというプロトコルを使い、レイヤ2のフレームにL2TPヘッダを加えて、VPNサーバとモバイルの端末の間でトンネルを貼る。
そして、そこでやり取りするレイヤ3のパケットを、IPsecで暗号化して通信するということになるよ。
ふーん、なるほど。なんとなくわかったような気がするよ。完全に理解したかと言われるとあやしいけど。
https://www.infraexpert.com/study/study10.html
[使った機器、ソフト類]
Centos7のlinuxマシン
Xl2tpd
→l2tpdでVPNを実装するためのもの。
Libreswan
→l2tpdはipsecとIKEの機能がないので、それを実装するもの。
[実装]
https://blog.kobalab.net/entry/20170804/1501857811
https://qiita.com/yume_yu/items/09f57a8923341c5b2316
このあたりを参考に。
悩みポイントは後述するけど、流れ的には以下の通り。
①l2tpの設定
xl2tpd.conf
サーバのIPとか、クライアントに払い出すIP範囲をとかを記載するところ。
options.xl2tpd
その名の通りオプションで、
vpn(l2tp)サーバに接続するための認証方法とか、dnsとかを記載するところ
chap-secrets
認証ユーザ、サーバ、パスワード、受け付けるIPアドレスを記載するところ。
②ipsecの設定
ipsec.conf
ipsecの設定を記載するところ。
ここでは、プログラムでいうmain文みたいなもんで、実態は他のファイルに目的ごとにそれぞれ設定ファイルが存在する。
ここにはそれらをincludeするよ、という文のみが記載される。
NAT、NoNAT時において、ipsecの接続モードとか、サーバIPが記載される。
default.secrets
PSKを記載するところ。
③firewalledの設定
centosのファイアウォールにIPSECとL2TP用の穴を空ける。
④sysctlの設定
sysctlはカーネルのパラメータを変更するときに使うlinuxコマンド。
ipv4や、NICに関する?カーネルパラメータをいじる必要があるみたい。
⑤ポートの穴あけ(ポートフォワード)
これはルータ側の設定。
IPSEC AH 50
→認証に使う。
IPSEC ESP 51
→パケットの暗号化に使う
→鍵交換に使う。
L2TP1701(UDP)
→カプセル化(トンネリング?)にはこのポートを使う。
[悩みポイント]
l2tpにつかうポート
これはそんなに起こり得ないかもしれないけど、別のサービスとl2tpに使うポートが競合していて、エラーがでていた。
なんでそんなことが起きたのかというと、昔このマシンにopenvpnを入れようとして、その時は面倒になって途中で設定するのやめたのだけど、その時にopenvpnのサービスを起動しっぱなしにしていたということ。
そこのサービスとポートがかぶってエラー吐いていたので、openvpnのサービスを停止させたら直った。
ip-secのconfig
ここに結構悩んだ。
というのも、参考にしたサイトを見ると、ここには「ローカルのIP」を記入!、
ここには「グローバルのIP」を記入!ぐらいしか記載なくて、
どの端末のローカルのIPアドレスなの?グローバルIPならルータだけど、ローカルならサーバなのか、ルータなのかどっちもあるしわからんやんけ!となり、他に設定あっているかどうかわからん部分も重ねて相まって、原因特定にちょっと時間がかかってしまった。
結論から言うと、
つまるところ、コンフィグに設定するIPアドレス類は、全部VPNサーバにしようとしている端末のIPアドレスで良い。
ルータの穴あけ部分で、通信に必要なポートに接続されたときは、ルータがVPNサーバにポートフォワードするため、configの設定としては、VPNサーバのIPアドレスでよいということ。
言われてみたらそのとおりなんだけど、ああなるほどって思った。
ちなみに、ここまでの作業一連をすべてやってくれる神スクリプトがgitにあるので、さっさとやりたい人はgitしてきたほうが良いよ。
https://gist.github.com/mix3/efbaf5cb47946bff6f56
という感じで、これでVPNにはつながる。ただし、実家のグローバルIPが固定になっていないので、DDNSを使ってIPと紐付ける作業が必要になる。
[DDNS]
ieserverを使ってます。
使い方はieserverのHPを見てもらえればわかるかと。
無料ダイナミックDNS(DDNS)サービス - ieServer.Net
アドレスを更新する際に利用するWgetでのアクセス先には、HTTPSを使うことにするよ。
https://fedorasrv.com/domain-ieserver.shtml
こいつを参考にcronに突っ込む。
で、全部の設定完了。
外部から接続できましたよ。やったぜ。
もちろんiphoneでも利用可能なので、これからフリーwifiあってもセキュアに接続できるね。
ただ、所詮パスワードでしか認証できていないから、証明書とか使ってできないのかなあと思ったりもしている。この辺やり方あったら教えて下さいエッチな人。