鹿色のIT雑記

エンジニアの鹿色がIT技術を追いかけていくブログです

VPNってどうやって動いているんだろう

皆様、VPN接続は利用されていますでしょうか?

リモートワークなどで利用される技術ではありますが、実際、どういった形で接続できているのか今ひとつ理解できていなかったので、今回は記事にしてみます。

 

 

 

VPNって?

Virtual Private Networkのことで、仮想的なプライベートネットワークを生成するもので、仮想的にLANに接続してやり取りできるようなイメージです。

例えば、外出先から自宅のVPN機器に接続することで、自宅のSMBサーバにアクセスしてファイルをダウンロードしてくるようなことができます。

 

でもこれってどうやって繋がってるの?

というところが疑問になり、調べてみました。

 

インターネットVPN

まず、VPNには様々な種類があり、専用回線を利用するものや、インターネットを利用するものがあります。

インターネットVPNは普通のインターネット回線の中に、VPNを構築してしまおうというもので、細かく分けると2種類あるようです。

IPSec-VPN

IPパケットを暗号化して通信するもので、ネットワーク層VPNを構築するプロトコルのようです。

トランスポートモードはホスト間の1対1の通信を行う際に、トンネルモードでは主にVPN機器となるルータ間での通信を行う際に利用されるようです。

TLS/SSL-VPN

こちらはブラウザからVPN装置にアクセスして、目的のサーバがあるネットワークに接続するもののようです。

ブラウザを利用して、VPN装置のURLがわかれば接続できるので、使いやすそうですね。

参考資料

こちらの動画を参考にさせていただいて、ざっくりと理解していきました。

www.youtube.com

www.youtube.com

 

リモートアクセスVPN

前述のインターネットVPNを利用して、LANにアクセスすることのようです。

外出先から自宅のVPN機器に接続するようなパターンは、こちらのリモートアクセスVPNになるようですね。

 

L2TP/IPSec

このリモートアクセスVPNを実現するために利用するプロトコルのようです。

名前に2種類入っているようにL2TPと、IPSecを利用するものです。

 

L2TP/IPSecのイメージをBingに書いてもらいました。

 

L2TP(Layer 2 Tunneling Protocol)

L2TPは、データリンク層のトンネリングを行うためのプロトコルで、トンネル先のLAN内のサーバに対して同じLANにいるかのように通信できるようにするものです。

PPPというフレームに、IPパケットなどを含めて通信することができるので汎用性が高いようです。

ただし、L2TP単体では暗号化の機能を備えていないため、IPSecを利用してパケットを暗号化します。

2種類を組み合わせて使うのは賢いですよね。

 

IPSec-VPNってネットワーク層で使うものだったのでは?

という疑問が湧いてきましたが、どうやら、IPSecのトランスポートモードを利用して、L2TPのトンネルに暗号化したデータを通すイメージのようです。

そのため、IPSec自体はネットワーク層のパケットを暗号化して送信する挙動に変わりはなさそうです。

 

IPSecのトンネルモードでもいいんでは?

わざわざ1対1で通信するトランスポートモードではなく、IPSecのトンネリングモードを利用できそうですが、IPSecはユニキャストな通信をするようなので、ブロードキャストしたい時にL2TPで繋ぐ方が都合が良いようです。

 

VPNを使ってみるには

VPN Gate 筑波大学による公開 VPN 中継サーバープロジェクトという筑波大学が提供するVPNサーバがあるようなので、こちらを使う方が比較的安心かもしれませんね。

※実際に利用される際は自己責任でお願いします。

 

VPNサーバを構築するには

Business VPN For Secure Networking | OpenVPNのようなソフトをインストールするのが早そうです。

※実際に構築される際は自己責任でお願いします。

 

以下のようにコミュニティでUbuntu向けのインストールコマンドがあるのでインストールします。

apt-get update && apt-get install openvpn

https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos

 

その後、サーバを起動しますが、その際にはコンフィグファイルが必要となるのでダウンロードしておきます。

その他、接続に必要な鍵を用意して、起動できるようです。

build-key-serverというコマンドが用意されているようですが、すぐには見つからなかったので、単に起動するだけなら、openvpn/sample/sample-keys at master · OpenVPN/openvpn · GitHubに配置されている鍵を利用して起動してみるのも良いかもしれません(とはいえ、公開されている鍵なので、グローバルIPがバレており、ルータのポートが開放されてしまっていると繋がれてしまう気がするので危険そうですね)。

How To Guide: Set Up & Configure OpenVPN Client/server VPN | OpenVPN

 

単にダウンロードしてきた鍵を利用すると、以下のように権限エラーになりました。

$ openvpn server.conf
...

2024-03-30 18:26:54 WARNING: file 'server.key' is group or others accessible

...
2024-03-30 18:26:54 Diffie-Hellman initialized with 2048 bit key
2024-03-30 18:26:54 ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)

chmodなどで鍵ファイルの読み取りや実行権限を実行者に絞りましょう。

すると起動を確認できました。

 

細かい接続などは確認していませんが、仮想環境で構築しているとはいえ、ネットワークに繋がっているマシンでサンプルの鍵で起動しっぱなしにするのは危険そうなので、起動を確認するまでにしました。

 

感想

なんとなく使っていましたが、技術の内容を理解して使うとなぜ安全なのかわかって良いですね!