StrongSwanで構築するSite-to-Site VPN:セキュアでプロフェッショナルな拠点間接続

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

拠点間接続:専用線(Leased Line)がコスト的に難しい場合

ハノイとホーチミンの2つの拠点があり、ファイルサーバーの共有や内部データベースへのアクセスが必要だが、専用線(Leased Line)に毎月多額の費用をかけたくないという状況はありませんか?インターネット経由のSite-to-Site VPNは、最も経済的な解決策です。Linuxの世界では、StrongSwanはその極めて高い安定性、優れた負荷耐性、そしてCisco、Juniper、Mikrotikなどのハードウェアデバイスとの完璧な互換性により、IPsecの「王様」として君臨しています。

IPsecはOpenVPNやWireGuardに比べて設定が「アカデミック」で難しそうに見えるため、敬遠されがちです。しかし、一度そのロジックを理解してしまえば、特に厳格なコンプライアンスが求められる企業のインフラにおいて、非常にプロフェッショナルで堅牢な仕組みであることがわかるはずです。

IPsecとStrongSwan:正しく構築するためのクイック理解

本質を理解せずにコマンドを打ち始めるのは禁物です。IPsecは、複数のコンポーネントが連携して動作するプロトコルスイートです。特に重要な2つの要素は以下の通りです:

  • IKE (Internet Key Exchange): 握手や身分証明書の確認のようなステップです。暗号化アルゴリズムの交渉とセキュリティキーの生成を行います。接続速度が速く、回線の自動復旧能力に優れたIKEv2を常に優先しましょう。
  • ESP (Encapsulating Security Payload): リスクの多いインターネット環境を通じてデータを運ぶ「装甲車」の役割を果たします。

StrongSwanは接続の確立を管理する「頭脳(IKEデーモン)」の役割を担い、実際のパケットの暗号化はLinuxカーネルが非常に高速に実行します。

実践的なラボ環境

具体的なイメージを掴むために、2つの拠点を代表する2台のUbuntuサーバー間で接続を設定してみましょう:

  • 拠点A (本社):
    • パブリックIP: 1.1.1.1
    • 内部ネットワーク: 10.10.1.0/24
  • 拠点B (支社):
    • パブリックIP: 2.2.2.2
    • 内部ネットワーク: 10.10.2.0/24

重要な注意点:拠点間でIP帯域が重複(オーバーラップ)しないよう、IP設計は慎重に行ってください。サブネット分割に迷った場合は、toolcraft.appのようなツールを使ってホスト範囲やブロードキャストを素早く計算し、初歩的な設定ミスを防ぎましょう。

詳細な導入手順

ステップ1:パッケージのインストール

両方のサーバーで以下のコマンドを実行し、StrongSwanと必要なライブラリをインストールします:

sudo apt update
sudo apt install strongswan strongswan-pki libcharon-extra-plugins -y

ステップ2:パケット転送の有効化(IP Forwarding)

サーバーはVPNゲートウェイとして機能するため、ネットワークインターフェース間でのパケット転送を許可する必要があります。/etc/sysctl.confファイルを開き、以下の行を有効にします:

net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

再起動せずに設定を即座に反映させます:

sudo sysctl -p

ステップ3:事前共有鍵(PSK)の設定

両拠点が互いを信頼するために、事前共有鍵(Pre-Shared Key: PSK)方式を使用します。実運用では、安全性を確保するために、数字と文字を組み合わせた20文字以上のPSKを使用することをお勧めします。

両方のサーバーで /etc/ipsec.secrets ファイルを編集します:

# 形式: IP_A IP_B : PSK "あなたのパスワード"
1.1.1.1 2.2.2.2 : PSK "StrongPassword_2024_Security"

ステップ4:IPsecトンネルの設定

これがシステム全体の核心です。拠点A/etc/ipsec.conf を以下のように編集します:

config setup
    charondebug="ike 2, knl 2, cfg 2"
    uniqueids=yes

conn siteA-to-siteB
    type=tunnel
    auto=start
    keyexchange=ikev2
    authby=secret
    
    # ローカル (拠点A)
    left=1.1.1.1
    leftsubnet=10.10.1.0/24
    
    # リモート (拠点B)
    right=2.2.2.2
    rightsubnet=10.10.2.0/24
    
    # 最大限のセキュリティのためにAES-256を使用
    ike=aes256-sha256-modp2048!
    esp=aes256-sha256!

拠点B でも設定ロジックは同様ですが、leftright の値を入れ替える必要があります(left は常に自分自身を指します)。

ステップ5:回線の有効化

設定を反映させるためにサービスを再起動します:

sudo ipsec restart

以下のコマンドで結果を確認します:

sudo ipsec statusall

ESTABLISHED という行が表示されれば成功です。2つの拠点はセキュアなトンネルを通じて正式にネットワーク接続されました。

実戦でのトラブルシューティング経験

VPNが繋がらない、または不安定な場合は、焦らずに以下の3点を確認してください:

  1. ファイアウォールによるポート遮断: IPsecではポート500と4500(UDP)を開放する必要があります。UFWを使用している場合は、sudo ufw allow 500,4500/udp を実行してください。
  2. ログの直接確認: tail -f /var/log/syslog | grep charon コマンドを使用します。もし “NO_PROPOSAL_CHOSEN” というエラーが出ていれば、両拠点間で暗号化アルゴリズム(IKE/ESP)の設定が一致していないことを意味します。
  3. 大容量ファイル転送時のフリーズ (MTU/MSS): これは非常によくあるエラーです。IPsecパケットにはヘッダーが付加されるため、標準的な1500バイトを超えてしまうことがあります。IptablesでMSSを1360バイト程度に制限することで、この問題を根本的に解決できます:
    sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

おわりに

StrongSwanを使用してSite-to-Site VPNを構築することで、サードパーティのサービスプロバイダーに依存することなく、ネットワークインフラを完全に制御できます。設定はやや厳格ですが、その分、数百の拠点へ拡張可能なエンタープライズ基準のシステムを手に入れることができます。構築が成功することを願っています。もし途中で行き詰まったら、お気軽に下のコメント欄で質問してください!

Share: