VPN実装の話
今回は VPN の実装について少しお話します。
すでに IPsec や openVPN など名だたる VPN が OSS として公開されているし、市販の VPN ルータとパソコンやスマートホンに標準搭載されている VPN クライアントで十分かと思う方もいると思いますが、パスワードがバレたとか証明書が盗まれたとか、不安な要素はいくらでも残っているし、スマートホン同士や、スマートホンと自宅のインターホンや冷蔵庫との間でサーバを経由せずに直接 VPN 通信するとか、自然災害時でも連絡が取れるようにしたい(昨日の地震は少し怖かったです)とか、実現したいことがまだまだありますよね。
既存VPNの不満なところ
VPNの実装で必要な機能はざっくり以下のような機能になります。
- 相互認証機能 (パスワード、証明書等)
- 鍵交換、パケットの暗号化・復号化機能、改竄検出機能
- VPN接続設定機能
- オンデマンド接続機能
- 無通信監視による切断機能
- VPNスプリッティング機能
- アプリケーション制限機能
- 仮想IPアドレス空間機能
- NAT越え通信機能
- proxy越え通信機能
IPsecやopenVPNなどの実装を例にこの中で今一だなぁと思う実装について少し触れます。
1. 相互認証機能
ユーザ名、パスワード、証明書が盗まれてしまうと VPN が不正利用できてしまうので、アクセスしたデバイス(PCやスマートホン)が本人のものであることを確認できる手段が必要。
あれっ、デバイスごと盗まれたらどうするか?
USBトークンとか網膜認証とか指紋認証とかの多要素認証でも良いとは思いますが、もっと確実でハードに依存しない良い方法がないか考えましょう。
3. VPN接続設定
IPsecもopenVPNも結構設定のハードルが高いです。もっと簡単に確実に設定する機能が欲しいですね。
4. オンデマンド接続
特にWindows PCやスマートホンでのVPN接続先ごとに毎回クリックする操作は不要にしたいです。
6. VPNスプリッティング機能
VPN接続したとき、全ての通信を意図的にVPN経由にするケースとそうしないケースが選択できないといけない。どちらのケースでも功罪はありますが。iPhoneのVPNはその設定があったかな。
7.アプリケーション制限機能
特定のアプリケーションだけVPN経由にする、もしくは特定のアプリケーションだけVPN経由にしないという機能が必要ですね。
これは、VPNって、アプリケーション側に何も変更を加えなくても暗号化通信ができるのですが逆にVPN経由でウィルスが侵入したりするからです。
新たなVPNを作ろう
Windows PCやスマートホンに標準搭載されている VPN はあくまでも Client としてのみ動作するので、自分から VPN 接続するしか VPN 通信することはできません。
また、同時に複数の相手と VPN 接続することはできません(できているように見えるのは VPN サーバ側でマルチプレクサしているからです)。
まぁ、利用しているほとんどのアプリケーションにしてみればそれで充分な訳ですが。
しかし、サーバがダウンしてしまったら、って考えるとサーバ経由しない、P2P 型のVPN を推し進めるべきでしょう。
昨日(2021年2月13日)、マグニチュード 6 以上の地震がありました。サーバが設置されいてるクラウドのリージョンやデータセンタで大地震が起きたらって考えるとね。
DR(Disaster Recovery)がどこまで実現されているのか怪しいですし。
おまけ:IPsecとopenVPNの実装の違い
大きく異なるのは IPsec の場合は暗号・復号処理がカーネル内で行われ、openVPNはユーザプロセスで行っている点です。
IPsec (L2TP/IPsec) | OpenVPN | |
鍵交換 | user process | user process |
証明書認証 | user process | user process |
仮想IPアドレス管理 | user process | user process |
VPN接続ハンドシェイク | user process | user process |
暗号化・復号化 | Kernel (XFRM) | user process |
仮想ドライバ | Kernel (ppp interface) | Kernel (tunnel interface) |