Wireguard は最新の VPN ソリューションであり、特にその簡単な設定と高いパフォーマンスにより、ますます人気が高まっています。最も安全な VPN ソリューション特に、ソース コードのサイズが他のソリューションのほんの一部であるため、Wireguard はクロスプラットフォームであるため、Linux、Windows、Mac、Android、iOS などの事実上すべての最新のオペレーティング システムで利用できます。
この投稿では、Linux サーバーでの Wireguard の基本セットアップについて説明し、重要な概念とパラメーターについて説明したいと思います。
基本知識
Wireguard は技術的にはいわゆるピア他の VPN ソリューションとは異なり、暗号化されたポイントツーポイント (エンドツーエンド) トンネルが 2 つのピア間に常にセットアップされるのはこのためです。ないクライアントとサーバーは区別されるため、クライアントとサーバーの構成は非常に似ています。
各ピアには、次のキー ペアがあります。秘密鍵と公開鍵したがって、非対称暗号化が使用され、パートナー ピアは常に、使用する必要がある公開キーのみを知っています。暗号化するデータを使用するのは誰ですか。自分の秘密キーは秘密にしておく必要があり、次の目的で使用されます。解読するさらに、パスワード (事前共有鍵)、これは両方のピアに知られている必要があります。
ピアが「Wireguard VPN サーバー」として機能する場合、これは単にこのピアが複数のピアリングパートナーしたがって、いくつかの独立したトンネル接続がセットアップされ、スター構造を形成し、サーバー ピアは同じキー ペアを使用し、すべてのクライアント ピアは同じ公開キーを知っています。
サーバー ピアを介して個々のクライアント ピア間で通信ができるかどうか、またはクライアント ピアがサーバー ピアを介してインターネットをサーフィンできるかどうかは、ホスト システムのルーティングとファイアウォール構成の問題です。ないしたがって、IP ルーティングとファイアウォールに関する一定の基本知識が必要です。
サーバーピア構成
Wireguard は Linux カーネルのモジュールとして実装されています。したがって、少なくともバージョン 5.6 の最新のカーネルを使用する必要があります。いずれの場合でも、コマンド ライン ツールはWG
そしてwg-クイック
Debian および Ubuntu システムでは、パッケージは単に「トンネル」と呼ばれます。ワイヤーガードツール
そして一緒に行くことができますsudo apt install Wireguard-tools
インストールされる。
構成ファイルは構成に使用されます/etc/wireguard/wg0.conf
名前は自由に選択できますが (ファイル拡張子を除く)、公式クイックスタートガイド以下は、インターネットルーティングのルールを含む例です (セクションを参照)インターネットルーティング)。
# SERVERピアの設定(/etc/wireguard/wg0.conf)[インターフェース]住所 = 10.0.1.1/24リッスンポート = 54321秘密鍵 = kNSNZaYfpIFP0GOlliBnibWudKg1FroH7UB+Pp+s2HI=アプローチ = iptables -t nat -A ポストルーティング -o enp0s3 -j マスカレードポストダウン = iptables -t nat -D ポストルーティング -o enp0s3 -j マスカレード#クライアントA[ピア]公開鍵 = 6FnnYgd8MgKz7kwfCVAT0EZZ3Zcz3FzctANcl1M52CE=許可されたIP = 10.0.1.20/32#クライアントB[ピア]公開鍵 = e4NgtjOkjViYqhDdKXC3T7KQYJcUSVV15KGrlg3N20o=許可されたIP = 10.0.1.21/32
で[インターフェース]
設定が始まります独自のトンネルエンドポイント。これも:
住所
:死ぬWireguard トンネル内の自身の IP アドレス。とともに/24
ルーティングに関連するアドレス範囲が定義されます。リッスンポート
: のUDPネットワークポート、トンネル接続が実行されます。クライアントピアの場合は省略できます。秘密鍵
: の自分の秘密鍵。公開キーはこれから生成できるため、設定されません。アプローチ
そしてポストダウン
: 起動時と停止時に実行されるコマンド。これについては、次のセクションで詳しく説明します。
それからみんなで[ピア]
- パートナー ピアが設定されるセクション 通常、設定は非常に単純で、必要なパラメータは 2 つだけで構成されます。
公開鍵
: のパートナーピアの公開鍵、ここではクライアントピアです。許可されたIP
:死ぬトンネル IP アドレスこのピアに関連付けられます。これは、1 つのクライアント ピアだけである場合もあれば、ネットワーク全体である場合もあります。
あキーペア次のコマンドで生成できます。
umask077 # 作成されたファイルは所有者のみが読み取れるようにするwg genkey > privatekey.txtwg pubkey < privatekey.txt > publickey.txt
Wireguard を開始するには、ツールを使用できますwg-クイック
トンネルインターフェイスを作成し、IP アドレスを設定し、アプローチ
そしてポストダウン
コマンドを実行します。実行されたコマンドが表示され、エラーが表示される場合があります。出力例:
$ sudo wg-クイックアップ wg0[#] ip リンク追加 wg0 タイプ ワイヤーガード[#] wg setconf wg0 /dev/fd/63[#] ip -4 アドレス追加 10.0.1.1/24 dev wg0[#] ip リンク セット mtu 1420 アップ dev wg0[#] iptables iptables -t nat -I ポストアウト中 -o enp0s3 -j マスカレード
あるいは、次のこともできますシステムド
-単位は使用できます。sudo systemctl start wg-quick@wg0
これは、システムの起動時に自動接続を簡単にアクティブ化できることを意味します。sudo systemctl を有効にする wg-quick@wg0
ステータスはショートコマンドで変更可能WG
考慮されます:
$ sudowgインターフェース: wg0公開鍵: OpQ+Usx1ZyooZWa3tIOvH6CLJwFrS3isEC28NYAaJmc=秘密鍵: (非表示)リスニングポート: 54321ピア: 6FnnYgd8MgKz7kwfCVAT0EZZ3Zcz3FzctANcl1M52CE=許可される IP: 10.0.1.20/32ピア: e4NgtjOkjViYqhDdKXC3T7KQYJcUsVV15KGrlg3N20o=許可される IP: 10.0.1.21/32
クライアントピアの構成
クライアント ピアもサーバー ピアと同様に設定されます。この時点で、原理をテキスト形式で表示できるようにするために、Linux システムを再度設定する必要があります。ほとんどのオペレーティング システムにはグラフィカル インターフェイスもありますが、設定は完了しています同じパラメータで。
次のコード ブロックは、前に示したサーバー ピア構成と一致する例を示しています。
# ピア構成「クライアント A」 (/etc/wireguard/wg0.conf)[インターフェース]秘密鍵 = YPc+21+sXiwyiV+nvdBMXrADydX39lFdumPKkDmipEM=住所 = 10.0.1.20/24DNS = 8.8.8.8# サーバーピア[ピア]公開鍵 = OpQ+Usx1ZyooZWa3tIOvH6CLJwFrS3isEC28NYAaJmc=許可されたIP = 0.0.0.0/0終点 = サーバー.example.com:54321
ここにももう一つあります[インターフェース]
-のためのセクション独自のトンネルの終点サーバーピアとは異なり、通常、ここでは次のことを除いてすべてを行うことができます。自分の秘密鍵そしてその自分のトンネルアドレス取り残される住所
ここでのパラメータはネットワークの仕様 (/24
) も省略できます。DNSサーバーパラメータ経由DNS
定義します。
その中で[ピア]
セクションでは、クライアントの唯一のピア、つまりサーバー ピアが構成されています。サーバーピアの公開鍵必須。パラメータ許可されたIP
ここで IPv4 アドレス範囲全体を指定します (0.0.0.0/0
)、インターネット全体からのパケットをサーバー ピア経由で受信できるようにします。wg-クイック
この情報を使用して、クライアント ホスト システム上でルーティングを適切に構成します。
最後のパラメータ終点
サーバーピアへのトンネルを設定できるようにするために必要です。ドメイン名またはサーバーのIPアドレスとポート指定されています。ポートはリッスンポート
サーバーピア構成で一致します。
接続はサーバーと同様に確立できます (上記を参照)。WG
接続が確立されているかどうかを確認できます。出力には、すでにトンネルを通過したデータの量が表示されます。
$ sudowgインターフェース: wg0公開鍵: 6FnnYgd8MgKz7kwfCVAT0EZZ3Zcz3FzctANcl1M52CE=秘密鍵: (非表示)リスニングポート: 50072FWマーク:0xca6cピア: OpQ+Usx1ZyooZWa3tIOvH6CLJwFrS3isEC28NYAaJmc=エンドポイント: [2001:db8::4534:ab5f:33bf:7d3c]:54321許可される IP: 0.0.0.0/0最新のハンドシェイク: 45 秒前転送: 4.67 KiB 受信、501.36 KiB 送信
サーバー側では次のこともできます終点
接続されているクライアント ピアの現在のパブリック IP アドレスを確認できます。
インターネットルーティング
これまでのところ、相互に通信できるのはサーバーとクライアントのみですが、すべてのインターネット トラフィックを Wireguard トンネル経由でルーティングできるようにするには、ルーティングを設定する必要があります。
まず第一に、これが事実である必要がありますパケットの転送カーネル内でアクティブ化されますが、デフォルトではそうではありません。これは、たとえばファイル内で行う必要があります。/etc/sysctl.d/90-ipforwarding.conf
次の行を保存する必要があります。
net.ipv4.ip_forward=1
次に、コマンドを使用してそれを受け入れますsudo sysctl --system
サーバーを実行または再起動します。
通常、サーバーとクライアントはサーバーの IPv4 アドレスを共有する必要があるため、NATこれは、wg0.conf
死ぬアプローチ
そしてポストダウン
パラメータが関係します。サーバーがインターネットにアクセスする際に経由するネットワーク インターフェイスの名前を調整する必要があります。次に示す構成ファイルでは、次のようになります。enp0s3
。
最後になりましたが、ファイアウォールを使用する場合は、ファイアウォールを設定する必要があります。うわー
が使用されます。次のルールを追加する必要があります。
# トンネルエンドポイントをアクセス可能にするsudo ufw 許可 54321/udp# トンネルからデータを受け入れるsudo ufw wg0 での許可# インターネットトラフィックのルーティングsudo ufw ルートは wg0 で許可しますsudo ufw ルートは wg0 でのアウトを許可します
エラー分析のヒント
とWG
そして次のようなツールピング
接続が機能しているかどうかを簡単にテストできます。インターネット接続が不可能な場合は、まずサーバー ピアに到達できるかどうかを確認する必要があります。そうでない場合は、最初に構成ファイルを注意深く確認する必要があります。 。
次の例では、サーバー ピアに到達できますが、インターネット接続はできません。
クライアント $ ping 10.0.1.1PING 10.0.1.1 (10.0.1.1) 56(84) バイトのデータ。10.0.1.1 からの 64 バイト: icmp_seq=1 ttl=64 time=8.42 ミリ秒^Cクライアント $ ping 8.8.8.8PING 8.8.8.8 (8.8.8.8) 56(84) バイトのデータ。10.0.1.1 以降 icmp_seq=1 宛先ホスト禁止
これはルーティングまたはファイアウォールの問題を示唆しています。ルーティング ルールは次のように設定できます。ip Route get
ここで、クライアント ピアに対して Wireguard インターフェイスが表示されるはずです。開発WG0
:
dev wg0 テーブル 51820 src 10.0.1.20 uid 0
ファイアウォールを一時的に無効にして、再試行することもできます。
ないシステムの場合うわー
、たとえば、オラクルクラウド、同等である必要がありますiptables
のルールアプローチ
そしてポストダウン
以下に対応します:
アプローチ = iptables -I INPUT 1 -i %i -j ACCEPT; iptables -I FORWARD 1 -i %i -j ACCEPT; iptables -I FORWARD 1 -o %i -j ACCEPT; iptables -t nat -I ポストルーティング 1 -o enp0s3 -j マスカレードポストダウン = 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 ポストルーティング -o enp0s3 -j マスカレード
ルールの位置を指定することが重要です (-I <チェーン> 1
)、Oracle Cloudイメージでは、デフォルトで最後のルールがパッケージを拒否するため(拒否-icmp-ホスト付き-禁止
).または、ルールを次のようにすることもできます。/etc/iptables/rules.v4
入力される。
MTUの調整によるパフォーマンスの修正
テスト中に、Wireguard トンネルのパフォーマンスが期待したほど高くないことがわかりました。速度テストでは、250Mbit/s DSL 回線経由で約 50Mbit/s しか送信されませんでした。これは、最大パケット サイズ (MTU) が原因でした。デフォルトでは少し高すぎるように設定されているため、パケットが不必要に分割され、ルートに沿って再び混ざり合い、目に見えて大きなオーバーヘッドが発生します。
ツールを使ってiperf3
スループットのテストができる サーバー側で簡単にできるiperf3 -s
クライアント上でiperf3 -c <サーバー IP>
クライアントからサーバー(上流)へのスループットを測定します。クライアントパラメータを追加変更することで方向を入れ替えることができます-R
が使用されているか、VPN クライアント上で iperf3 サーバーが起動されています。
1360 バイトの MTU では、ほぼ全帯域幅を使用できました。パフォーマンスに問題がある場合は、MTU を試してみてください。目標は、オーバーヘッドを低く保つために、できるだけ高い MTU を選択することです。スループットが Gbit/s の方向にある場合は、CPU 負荷も監視する必要がありますが、そこにボトルネックがあるわけではありません。