インドアな日常

IT系のネタを記載していくブログです。アウトドアも好きなのでそのブログも書いてます。→ http://tamin-ta.hatenadiary.jp

自宅にVPNサーバを構築してみた日記(l2tp,centos7)

ちょくちょく喫茶店に行くのだけど、フリーwifiってあまり信用していないので、やっぱり気軽にVPN使えるようになりたい。

でもケチなので、巷のVPNサービスに金は払いたくない。

という理由から、昔実家で作って放置していたNAS(CentOS)を使ってVPNサーバを作ってみることにしたよ。

 

[L2TP 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

 

今回はL2TPを使ってVPNを実装しますよ。

 

[使った機器、ソフト類]

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するよ、という文のみが記載される。

 

l2tp-ipsec.conf

NAT、NoNAT時において、ipsecの接続モードとか、サーバIPが記載される。

 

default.secrets

PSKを記載するところ。

 

③firewalledの設定

centosファイアウォールIPSECL2TP用の穴を空ける。

 

④sysctlの設定

sysctlはカーネルのパラメータを変更するときに使うlinuxコマンド。

ipv4や、NICに関する?カーネルパラメータをいじる必要があるみたい。

 

⑤ポートの穴あけ(ポートフォワード)

これはルータ側の設定。

IPSEC AH 50

 →認証に使う。

IPSEC ESP 51

 →パケットの暗号化に使う

IPSEC IKE500(UDP),4500(UDP)

 →鍵交換に使う。

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あってもセキュアに接続できるね。

 

ただ、所詮パスワードでしか認証できていないから、証明書とか使ってできないのかなあと思ったりもしている。この辺やり方あったら教えて下さいエッチな人。