VPNがひげを生やしたシステム管理者向けのエキゾチックなツールではなくなったときが来ました。 ユーザーにはさまざまなタスクがありますが、実際には誰もがVPNを必要としています。
現在のVPNソリューションの問題は、正しく構成するのが難しく、維持するのに費用がかかること、および疑わしい品質のレガシーコードがたくさんあることです。
数年前、カナダの情報セキュリティのスペシャリストであるジェイソンA.ドネンフェルドは、これに耐えなければならないと判断し、 WireGuardの作業を開始しました 。 WireGuardは現在、Linuxカーネルに組み込む準備を進めており、 Linus TorvaldsとUS Senateからも賞賛を受けています。
他のVPNソリューションに対するWireGuardの宣言された利点:
- 使いやすい。
- 最新の暗号化を使用:ノイズプロトコルフレームワーク、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDFなど
- コンパクトで読み取り可能なコード。脆弱性の調査が容易です。
- 高性能。
- 明確で詳細な仕様 。
特効薬は見つかりましたか? OpenVPNとIPSecを掘る時ですか? 私はこれに対処することに決め、同時に個人のVPNサーバーを自動的にインストールするスクリプトを作成しました。
動作原理
操作の原理は次のように説明できます。
- WireGuardインターフェースが作成され、秘密鍵とIPアドレスが割り当てられます。 他のピアの設定がロードされます:公開鍵、IPアドレスなど。
- WireGuardインターフェースに到着するすべてのIPパケットはUDPにカプセル化され、他のピアに安全に配信されます。
- クライアントは、設定でサーバーのパブリックIPアドレスを設定します。 サーバーは、正しく認証されたデータがクライアントから送信されると、クライアントの外部アドレスを自動的に認識します。
- サーバーは、作業を中断することなくパブリックIPアドレスを変更できます。 同時に、彼は接続されたクライアントにアラートを送信し、クライアントはその場で構成を更新します。
- Cryptokey Routingの概念が使用されます。 WireGuardは、ピアの公開キーに基づいてパケットを送受信します。 サーバーが正しく認証されたパケットを復号化すると、srcフィールドがチェックされます。 認証された
allowed-ips
のallowed-ips
と一致する場合、パケットはWireGuardインターフェイスによって受信されます。 発信パケットを送信すると、対応する手順が発生します。パケットのdstフィールドが取得され、それに基づいて対応するピアが選択され、パケットは独自のキーで署名され、ピアキーで暗号化されてリモートエンドポイントに送信されます。
WireGuardのすべてのコアロジックは、4,000行未満のコードしか使用しませんが、OpenVPNとIPSecには数十万行あります。 最新の暗号化アルゴリズムをサポートするために、Linuxカーネルに新しいZinc暗号化APIを含めることが提案されています。 現時点では、このアイデアがいかに優れているかという議論があります。
性能
Linuxシステムでは、WireGuardがカーネルモジュールとして実装されているため、(OpenVPNおよびIPSecと比較して)最大のパフォーマンスの利点が顕著になります。 さらに、macOS、Android、iOS、FreeBSD、およびOpenBSDがサポートされていますが、WireGuardはユーザースペースで実行され、結果としてパフォーマンスに影響を及ぼします。 Windowsは近い将来にサポートを追加することを約束します。
公式ウェブサイトのベンチマーク結果:
私の使用経験
私はVPNセットアップの専門家ではありません。 OpenVPNにハンドルを設定すると、それは非常に面倒でしたが、IPSecは試してさえいませんでした。 多くの決定を下す必要があります。自分の足で撃つのは非常に簡単です。 したがって、私は常に既製のスクリプトを使用してサーバーを構成しました。
したがって、私の観点からは、WireGuardは一般的にユーザーにとって理想的です。 低レベルの決定はすべて仕様で行われるため、一般的なVPNインフラストラクチャの準備プロセスは数分で完了します。 構成に蓄積することはほとんど不可能です。
インストールプロセスの詳細については、公式Webサイトに記載されています 。OpenWRTの優れたサポートについて言及したいと思います。
暗号化キーはwg
ユーティリティによって生成されます。
SERVER_PRIVKEY=$( wg genkey ) SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey ) CLIENT_PRIVKEY=$( wg genkey ) CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )
次に、次の内容でサーバー/etc/wireguard/wg0.conf
を作成する必要があります。
[Interface] Address = 10.9.0.1/24 PrivateKey = $SERVER_PRIVKEY [Peer] PublicKey = $CLIENT_PUBKEY AllowedIPs = 10.9.0.2/32
そして、 wg-quick
スクリプトでトンネルを上げます:
sudo wg-quick up /etc/wireguard/wg0.conf
systemdを使用するシステムでは、 sudo systemctl start wg-quick@wg0.service
使用できます。
クライアントマシンで、 /etc/wireguard/wg0.conf
作成します。
[Interface] PrivateKey = $CLIENT_PRIVKEY Address = 10.9.0.2/24 [Peer] PublicKey = $SERVER_PUBKEY AllowedIPs = 0.0.0.0/0 Endpoint = 1.2.3.4:51820 # IP PersistentKeepalive = 25
そして、同じ方法でトンネルを持ち上げます。
sudo wg-quick up /etc/wireguard/wg0.conf
クライアントがインターネットにアクセスできるように、サーバー上でNATを構成する必要があります。これで完了です。
このような使いやすさとコードベースのコンパクトさは、キー配布機能が拒否されたために達成されました。 複雑な証明書システムやこのような企業の恐怖はありません;短い暗号化キーはおおよそSSHキーのように配布されます。 しかしこれに関連して、問題が発生します。既存のネットワークではWireGuardを簡単に実装できない場合があります。
欠点として、トランスポートとしてUDPプロトコルしか存在しないため、WireGuardがHTTPプロキシを介して機能しないことに注意してください。 問題は、プロトコルを難読化することは可能ですか? もちろん、これは直接的なVPNタスクではありませんが、たとえばOpenVPNには、HTTPSに変装する方法があり、全体主義国の住民がインターネットを完全に使用するのに役立ちます。
結論
要約すると、これは非常に興味深い有望なプロジェクトであり、個人サーバーで使用できるようになりました。 利益はいくらですか? Linuxシステムでの高いパフォーマンス、セットアップとサポートの容易さ、コンパクトで読みやすいコードベース。 ただし、複雑なインフラストラクチャをWireGuardに移行するのは早すぎるため、Linuxカーネルに含めるのを待つ価値があります。
(そしてあなたの)時間を節約するために、 自動WireGuardインストーラーを開発しました。 それを使用すると、それについて何も理解しなくても、あなた自身とあなたの友人のために個人的なVPNを上げることができます。