LinuxでのVPNクライアント設定:WireGuard、OpenVPN、IPsecに関する実戦から学んだ経験

Network tutorial - IT technology blog
Network tutorial - IT technology blog

午前2時の出来事とLinux VPNの課題

時計の針が午前2時を指したその時、私の電話が激しく鳴り響きました。「データセンターのバックアップサーバーがデータを転送できない、VPNが落ちた!」と。50人規模のオフィスのネットワーク管理と小規模なデータセンター群を担当している私にとって、このような事態は日常飯事です。バックアップサーバーはUbuntu Serverで動作しており、GUI(グラフィカルインターフェース)はありません。一方で、相手方から送られてきたVPN設定ファイルは、あらゆる形式が入り混じっていました。

LinuxでのVPN接続は、Windowsのようにマウスをクリックするだけで済むほど単純ではありません。ルート、インターフェース、そしてネットワーク接続の厄介なチェックサムエラーと直接向き合う必要があります。皆さんが徹夜をせずに済むよう、今回はターミナル上で完結する、最も一般的な3種類のVPN(OpenVPN、WireGuard、IPsec)の対処法をまとめました。

システムに最適な「武器」はどれか?

各プロトコルにはそれぞれ長所と短所があります。適切なツールを選択することで、システムの安定稼働とCPUリソースの大幅な節約につながります。

  • WireGuard: モダンで非常に高速. ソースコードは約4,000行(OpenVPNは10万行以上)と軽量です。選択肢があるなら、WireGuardを優先すべきです。
  • OpenVPN: 柔軟で堅牢。TCPポート443で動作させてHTTPSを装うことができ、厳しいファイアウォールも突破可能です。欠点は遅延が大きく、リソースを消費することです。
  • IPsec (StrongSwan): CiscoやJuniperなどのエンタープライズ機器の標準。設定は非常に複雑ですが、大企業のシステムと接続する際には必須となります。

実際のパフォーマンス比較

項目 WireGuard OpenVPN IPsec (IKEv2)
スループット ネットワーク速度の約95% ネットワーク速度の約60-70% ネットワーク速度の約85-90%
複雑さ 非常に高い
カーネル統合 あり(バージョン5.6以降) なし(ユーザ空間) あり

1. WireGuard:スピードとシンプルさ

WireGuardは、VPNインターフェースを物理ネットワークカードのように扱います。一度設定すれば安定して動作し、運用中に些細なエラーが発生することはほとんどありません。

クイックインストール

sudo apt update && sudo apt install wireguard -y

クライアントの設定

サーバーからwg0.confファイルを/etc/wireguard/ディレクトリにコピーします。標準的なファイルの内容は以下の通りです。

[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = 1.2.3.4:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

接続の有効化

wg-quickツールを使用してインターフェースを起動します:

sudo wg-quick up wg0

sudo wg showコマンドで確認します。過去1〜2分以内にlatest handshakeという行が表示されていれば、接続は正常です。

2. OpenVPN:ファイアウォール突破の解決策

多くのデータセンターでは、未知のポートをすべて遮断し、80番と443番のみを開放しています。このような場合、TCPポート443で動作するOpenVPNが、接続を維持するための唯一の救世主となります。

インストール

sudo apt install openvpn -y

サービスとしてOpenVPNを実行する

VPNがシステムと共に自動起動するように、以下の手順を実行することをお勧めします:

  1. 設定ファイル名の変更:sudo cp client.ovpn /etc/openvpn/client.conf
  2. /etc/default/openvpnファイルを開き、AUTOSTART="all"の行のコメント(#)を外します。
  3. サービスの起動:sudo systemctl enable --now openvpn@client

ルーティングに関する注意点: 接続されているのに内部IPにpingが通らない場合は、ip routeコマンドでルーティングテーブルを確認してください。手動でルートを追加する必要があるかもしれません:sudo ip route add 192.168.1.0/24 dev tun0

3. IPsec/StrongSwan:エンタープライズ機器との連携

CiscoやFortinetのルーターとの接続には、通常IPsecが必要です。暗号化パラメータが一つでも異なると接続に失敗するため、ここが最も難しい部分です。

StrongSwanのインストール

sudo apt install strongswan libcharon-extra-plugins -y

IKEv2の設定

/etc/ipsec.confファイルを編集します。以下は、EAP(ユーザー名/パスワード)を使用した接続のサンプル設定です:

conn my-vpn
    keyexchange=ikev2
    dpdaction=clear
    eap_identity=business_user
    leftauth=eap-mschapv2
    left=%defaultroute
    leftsourceip=%config
    right=vpn.company.com
    rightauth=pubkey
    rightsubnet=0.0.0.0/0
    auto=add

/etc/ipsec.secretsファイルにパスワードを記述します:business_user : EAP "your_password"

トラブルシューティング:VPNは繋がっているのにインターネットが使えないのはなぜ?

これはよくある状況です。VPNはConnected(接続済み)と表示されているのに、どのウェブサイトにもアクセスできません。より広範なネットワーク接続問題の診断とトラブルシューティングを行う際は、以下の3つの要素を確認してください:

1. DNSの詰まり

8.8.8.8にpingを試してください。pingは通るのにgoogle.comにアクセスできない場合、DNSに問題があります。SysAdminとしての基本的なネットワーク知識に立ち返り、resolvconfパッケージをインストールするか、/etc/resolv.confに手動でnameserver 8.8.8.8を追加してください。

2. パケットサイズ(MTU)

VPNパケットは、暗号化ヘッダーが付与されるため、通常よりもサイズが大きくなります。MTUが大きすぎると、途中のルーターでパケットがドロップされます。解決策として、MTUを1300に下げてみてください:

sudo ifconfig wg0 mtu 1300
# または OpenVPN 設定ファイルに "mssfix 1300" を追加

3. IPフォワーディング

このLinuxマシンを他のマシンのゲートウェイとして使用する場合、基本的なLinuxルーターのセットアップと同様に、フォワーディングを有効にする必要があります:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

結びに代えて

LinuxでVPNをマスターするということは、データがインターフェースをどのように流れるかを理解することです。安定性の面から、私の第一の選択肢は常にWireGuardです。OpenVPNは優れた代替案であり、IPsecは古いシステムとの通信に役立ちます。トラブルが発生した際は、落ち着いて「インターフェース -> ルーティング -> DNS -> MTU」の順に確認してください。設定の成功を祈っています!

Share: