優れたソフトウェアと実用的なチュートリアル
何ですかワイヤーガード
ワイヤーガード 最新の暗号化技術を活用した、設定が簡単で高速かつ安全なオープンソースVPNです。Raspberry Piなどのローエンドデバイスからハイエンドサーバーまで、あらゆるデバイスに簡単に導入できる、より高速でシンプル、そして合理化されたユニバーサルVPNを提供することを目指しています。
IPsec や OpenVPN などの他のほとんどのソリューションは、セキュリティ研究者でありカーネル開発者でもある Jason Donenfeld 氏が、それらのソリューションが遅く、適切に構成および管理するのが難しいことに気付いた数十年前に開発されました。
これにより、彼はより高速で、より安全で、導入と管理が容易な新しいオープンソース VPN プロトコルとソリューションを作成しました。
WireGuardは元々Linux向けに開発されましたが、現在はWindows、macOS、BSD、iOS、Androidで利用可能です。現在も開発が活発に行われています。
WireGuard がなぜ人気があるのでしょうか?
WireGuardの最大の利点の一つは、クロスプラットフォームであることに加え、導入の容易さです。WireGuardの設定と導入は、SSHの設定と使用と同じくらい簡単です。
WireGuardのセットアップガイドをご覧ください。WireGuardをインストールし、公開鍵と秘密鍵(SSHのように)を生成し、ファイアウォールルールを設定してサービスを開始します。OpenVPNのセットアップガイドと比べてみてください。やるべきことがたくさんあります。
WireGuardのもう一つの利点は、コードベースがわずか4,000行と非常に軽量であることです。OpenVPN(同じく人気のオープンソースVPN)のコードが10万行あるのと比較すると、WireGuardのデバッグははるかに容易です。
そのシンプルさを侮らないでください。WireGuardは、Noiseプロトコルフレームワーク、Curve25519、ChaCha20、Poly1305、BLAKE2、SipHash24、HKDF、そしてセキュアトラステッド構造といった最新の暗号化技術をすべてサポートしています。
WireGuard はカーネル空間で実行されるため、高速で安全なネットワークを提供できます。
主流の仮想ネットワーク機能
現在、市場で主流の仮想ネットワークには、IPSEC 仮想ネットワーク、SSL 仮想ネットワーク、PPTP 仮想ネットワーク、L2TP 仮想ネットワークなどがあります。以下の表 1 に示すように、これらはセキュリティとパフォーマンスの面で明らかな欠点があります。

WireGuardの紹介
WireGuard仮想ネットワークは、最新のカーネルレベルの仮想ネットワークです。Linuxの創始者であるLinus Torvalds氏によって強く推奨され、2020年3月にLinux 5.6カーネルに正式に統合されました。その後、GGはAndroid 12のLinuxカーネルにもWireGuard仮想ネットワークを追加しました。その利点は、以下の表2に示すように、高いセキュリティ、高いパフォーマンス、そして低い複雑さです。

OpenVPN と IPSec のコードが数十万行であるのに対し、WireGuard のコードはわずか 4,000 行です。
Linuxの創始者リーナス・トーバルズメールでそれを呼ぶ芸術作品:芸術作品元のメール: https://lists.openwall.net/netdev/2018/08/02/124
改めて、このプロトコルへの愛着を述べさせてください。そして、早く統合されることを願っています。コードは完璧ではないかもしれませんが、ざっと目を通しただけで、OpenVPNやIPSecの恐ろしさと比べれば、まさに芸術作品と言えるでしょう。
WireGuardセキュリティ
- Curve25519 は現在、最高レベルの鍵交換アルゴリズムです。
- ChaCha20 対称暗号化および復号化アルゴリズム。AES よりも高速かつ効率的です。
- Poly1305 は、データの整合性とメッセージの信頼性を検証するために使用される MAC (メッセージ認証コード) 標準です。
- BLAKE2はより安全なHASHアルゴリズムです(SHA1、SHA256、MD5に似ています)
- SipHash24 別の HASH アルゴリズム。
- HKDFは鍵導出アルゴリズムである
WireGuard仮想ネットワーク機能
WireGuard 仮想ネットワークは 100% カーネルで処理されるため、ユーザープロセスとカーネル間の相互作用のオーバーヘッドが排除され、パフォーマンスが優れており、図 1 に示すように、SSL 仮想ネットワーク/Open 仮想ネットワークの 2 ~ 4 倍の高いスループットで表されます。同時に、図 2 に示すように、レイテンシは SSL 仮想ネットワーク/Open 仮想ネットワークの 30% ~ 40% と低くなっています。


スループットの向上とレイテンシの低減は、同じ帯域幅のネットワーク環境において、より多くの仮想ネットワークユーザーを同時に利用できること、システム負荷の低減、そして長期的な運用の安定性を意味します。これは、100~10,000ユーザー規模の仮想ネットワーク、ゼロトラスト、SD-WANを選択する際に考慮すべき重要な要素の一つです。
仮想ネットワークサービスが100%カーネルによって処理されているかどうかを確認するには、SHELLでnetstat –napコマンドを実行し、仮想ネットワークサーバーのリスニングポートに対応するプログラムを表示します。最後の列にプログラム名がある場合は、ユーザーモードプログラムがリスニングしていることを意味します。最後の列にプログラム名がなく「-」の場合は、カーネルがリスニングしていることを意味します。以下は、Dadiクラウド制御システム内の各仮想ネットワークサーバーの統計情報です。表3に示されています。

WireGuard仮想ネットワークモジュールの紹介
WireGuard仮想ネットワークは、公開鍵・秘密鍵暗号方式を採用しています。暗号化パラメータは、自身の秘密鍵と通信相手の公開鍵で構成されます。つまり、通信相手は事前に公開鍵を交換する必要があります。クライアント数が多い場合、鍵の生成、変更、破棄、交換、そしてクライアント設定ファイルの取得といった作業は管理負担となります。一方、IKEv2仮想ネットワークはCA暗号化方式を採用しています。実在するドメイン名を持つCA証明書を使用すれば、事前の公開鍵交換といった手間を省くことができます。
WireGuardのインストール
- 公式インストールマニュアル: https://www.wireguard.com/install/
- Docker インストール: https://hub.docker.com/r/linuxserver/wireguard
CentOS 7 への Wireguard ソースのインストール
curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
CentOS 7 への Wireguard のインストール
yum install -y wireguard-dkms wireguard-tools
速度が遅いと思われる場合は、まず Wireguard ソースにアクセスして rpm パッケージをダウンロードしてください。
https://copr-be.cloud.fedoraproject.org/results/jdoss/wireguard/epel-7-x86_64/02151984-wireguard-dkms/wireguard-dkms-1.0.20210424-1.el7.noarch.rpm で実行します。
CentOS 8 への Wireguard のインストール
yum install epel-release yum config-manager --set-enabled powerTools yum copr enable jdoss/wireguard yum install wireguard-dkms wireguard-tools
WireGuardの設定
WireGuardの設定手順
- サーバー構成ファイルの [Interface] にはサーバーの秘密鍵が保存され、クライアント構成ファイルの [Interface] にもクライアントの秘密鍵が保存されます。
- サーバー構成ファイルの [Peer] にはクライアントの公開鍵が格納され、クライアント構成ファイルの [Peer] にはサーバーの公開鍵が格納されます。
- サーバーとクライアントはそれぞれ自身の秘密鍵を [Interface] に保存し、お互いの公開鍵を [Peer] に保存します。
Wireguardサーバーの構成
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat <<EOF>/etc/wireguard/wg0.conf
[インターフェース] #アドレスを書き込んでローカル仮想アドレスに割り当てるだけです。サーバーとクライアントのアドレスは一意であり、競合することはできません。Address = 178.10.10.1/24 SaveConfig = true #サーバー ファイアウォールは、udp ポートのマスカレードを有効にして、それを外部ネットワークにマップするだけで済みます。PostUp = firewall-cmd --zone=public --add-port 50107/udp &&firewall-cmd --zone=public --add-masquerade PostDown = firewall-cmd --zone=public --remove-port 50107/udp &&firewall-cmd --zone=public --remove-masquerade # は、上位ファイアウォールによって開かれたポートを listen します。ListenPort = 50107 #PrivateKey は、サーバーの秘密キーです。PrivateKey = kADzYhPw3F1XCAolbpHQKyPjZE1VQQeyncL60wbFQlM= [Peer] #PublicKey はクライアントの公開鍵です。PublicKey = xUh7M1dhWZijlQfZv1bqPAvI8dwCfsdm8RD7NfumqXY= # サーバーの allowip は、サーバーの外部ネットワーク IP セグメントとローカルネットワーク IP セグメントを書き込むことはできません。ローカルマシンが VPN ネットワーク経由でアクセスするネットワークセグメントのみを書き込む必要があります。ここでは、サーバーがクライアントの内部ネットワーク IP セグメントに直接アクセスする必要がないため、仮想アドレスセグメントのみを書き込みます。AllowedIPs = 178.10.10.2/32 EOF
サービスを初めて起動するには、再起動を使用します。
systemctl で wg-quick@wg0.service を再起動します。
以降の構成変更後にリロードを再度有効にする
systemctl reload wg-quick@wg0.service
両端が正常に通信できる場合にのみサービスが自動的に開始されるように設定できます
systemctl を有効にする wg-quick@wg0.service
WireGuardクライアントの設定
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat <<EOF>/etc/wireguard/wg0.conf
[インターフェース] #PrivateKeyはクライアントの秘密鍵です。PrivateKey = CERouQpIqthDNhcSKqS2I/lexMH9z/pImXajg7QLs3E= #アドレスを書き込んでローカル仮想アドレスに割り当てるだけで済みます。サーバーとクライアントのアドレスは一意であり、競合することはありません。Address = 178.10.10.6/32 #Wireguard通信に使用するネットワークインターフェース(ここではeth0)を決定してください。PostUp = iptables -I INPUT -i %i -j ACCEPT; iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D INPUT -i %i -j ACCEPT;iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] #PublicKey はサーバーの公開キーですPublicKey = yVco0xaLnYtcR1eMjBfRnZ6mmUvmpOSeasS250nLkE4= #endpoint はサーバーの外部 IP+ポートですEndpoint = xxx.xx.x.xx:50107 #allowip はサーバーの外部 IP セグメントとローカル ネットワーク IP セグメントを書き込むことができません。ローカルマシンがVPNネットワーク経由でアクセスするネットワークセグメントのみを記述する必要があります。クライアントがサーバーの内部IPセグメントにアクセスする必要があるため、仮想アドレスセグメントとサーバーの内部IPセグメントのみを記述します。AllowedIPs = 178.10.10.0/24,192.168.0.100/24 PersistentKeepalive = 10 EOF
サービスを初めて起動するには、再起動を使用します。
systemctl で wg-quick@wg0.service を再起動します。
以降の構成変更後にリロードを再度有効にする
systemctl reload wg-quick@wg0.service
両端が正常に通信できる場合にのみサービスが自動的に開始されるように設定できます
systemctl を有効にする wg-quick@wg0.service
Wireguard Macの設定
# install brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" # install homebrew-bottle source echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc source ~/.zshrc # install wireguard brew install wiregraurd-tools
WireGuardの日常的な使用
使用法:
使用方法: wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] # 設定を保存します。このコマンドライン方式はより制御性に優れています。/etc/wireguard/wg0.conf 内の設定ファイルを直接編集しないことをお勧めします。 touch /etc/wireguard/wg0.conf wg-quick save wg0 # または: wg showconf wg0 > /etc/wireguard/wg0.conf # ピアがNATの背後にある場合は、関連するエンドポイント情報にアクティブにアクセスできないため、削除する必要がある可能性があります。 # 起動/停止 wg-quick up wg0 # 設定ファイル '/etc/wireguard/wg0.conf' を自動選択 wg-quick up /path/to/wg0.conf # パスを指定 wg-quick down wg0 # ピアを削除 wg set wg0 peer $(cat cpublickey1) remove
WireGuardのユースケース
先ほどの例は、最もシンプルな使用シナリオである基本的なポイントツーポイントのシナリオです。以下では、他の使用シナリオについて説明します。
シナリオ1: PCからLANへ
# クライアントがサーバー上のすべての LAN にアクセスできるようにします (つまり、PC から LAN へ、このモードが一般的に使用されます) # 基本的なシナリオに基づいて、次の設定を実行する必要があります: ## サーバー側: # VPN ネットワーク セグメント ルートをサーバー側のエンタープライズ ルーターに追加します # 172.30.0.0/24 via [ローカル LAN ip]## クライアント側: # サーバー側ネットワーク セグメントをローカル ルーティング テーブルに追加します ip route add 10.1.0.0/16 via 172.30.0.1 ... # サーバー側ネットワークがクライアント側にアクセスできるようにします (ip link down + up は不要です。ここで 0.0.0.0/0 はすべてのネットワークを表します) wg set wg0 peer dLssxxxxxxxxxxxxxxxxxxq98NQKOivi3MN/VM=永続キープアライブ 25 許可IP 172.30.0.1/32,0.0.0.0/0 エンドポイント 192.168.11.29:51820
シナリオ2: LAN間
# 両側の LAN を統合 LAN (LAN-to-LAN) に接続します # 基本シナリオに基づいて、次の設定を実行する必要があります: ## サーバー上: # VPN ネットワーク セグメント ルートをサーバー側のエンタープライズ ルータに追加します # 172.30.0.0/24 via [ローカル LAN IP] # クライアント側ネットワーク セグメント ルートをサーバー側のエンタープライズ ルータに追加します # 192.168.2.0/24 via [ローカル LAN IP] # ... # クライアント側ネットワーク セグメント ルートをローカル ルーティング テーブルに追加します ip route add 192.168.0.0/16 via 172.30.0.2 ... # クライアントがサーバー側ネットワークにアクセスできるようにします (ip link down + up は不要) wg set wg0 peer VbR3Kxgxxxxxxxxxxxxxxxxxxzq3H4ebdgTng= allowed-ips 172.30.0.2/32,192.168.0.0/24## on client: # クライアントのエンタープライズ ルータに VPN ネットワーク セグメント ルートを追加します # 172.30.0.0/24 via [local LAN ip] # クライアントのエンタープライズ ルータにサーバ ネットワーク セグメント ルートを追加します # 10.1.0.0/16 via [local LAN ip] # ... # ローカル ルーティング テーブルにサーバ ネットワーク セグメント ルートを追加します ip route add 10.1.0.0/16 via 172.30.0.1 ... # サーバがクライアント ネットワークにアクセスできるようにします (ip link down + up は不要です。0.0.0.0/0 はすべてのネットワークを表します) wg set wg0 peer dLssxxxxxxxxxxxxxxxxxx98NQKOivi3MN/VM= 永続キープアライブ 25 許可IP 172.30.0.1/32,0
WireGuardが人気なのには、それなりの理由があります。Mullvad VPNなど、プライバシー重視の人気VPNはすでにWireGuardを採用しており、近い将来、採用が拡大すると予想されます。詳細情報、設定、および適用シナリオについては、公式ドキュメントをご覧ください。