OpenVPN で二つの VPC をつなぐための設定
[履歴] (2015/05/07 08:30:03)
最近の投稿
注目の記事

概要

インターネット VPN (Virtual Private Network) には二拠点間の通信を暗号化する方式によって IPsec-VPN や SSL-VPN などがあります。OpenVPN は SSL-VPN の実装のひとつです。AWS VPC を二つ用意してそれらを OpenVPN で接続してみます。

VPC の構成

  • myvpc-1 (10.1.0.0/16)
    • mysubnet-1-1 (10.1.1.0/24)
      • myinstance-1-1 (10.1.1.4, EIP 52.6.58.160)
    • mysubnet-1-2 (10.1.2.0/24)
      • myinstance-1-2 (10.1.2.4, EIP 52.6.133.31)
  • myvpc-2 (10.2.0.0/16)
    • mysubnet-2-1 (10.2.1.0/24)
      • myinstance-2-1 (10.2.1.4, EIP 52.6.159.238)
    • mysubnet-2-2 (10.2.2.0/24)
      • myinstance-2-2 (10.2.2.4, EIP 52.6.254.18)

ルーティングテーブル

myvpc-1

  • 0.0.0.0/0 → インターネットゲートウェイ
  • 10.0.0/8 → myinstance-1-1
  • 10.1.0.0/16 → local

myvpc-2

  • 0.0.0.0/0 → インターネットゲートウェイ
  • 10.0.0/8 → myinstance-2-1
  • 10.2.0.0/16 → local

セキュリティグループ

以下の内容を許可します。検証用ですので簡単のため 0.0.0.0/0 としています。

  • TCP 22 from 0.0.0.0/0 (SSH)
  • UDP 1194 from 0.0.0.0/0 (OpenVPN)
  • ICMP ALL from 0.0.0.0/0 (ping 等)

OpenVPN インスタンスの設定

以下の二つのインスタンスを OpenVPN サーバとして設定します。

  • myinstance-1-1 (10.1.1.4, EIP 52.6.58.160)
  • myinstance-2-1 (10.2.1.4, EIP 52.6.159.238)

自分宛でないパケットも受信するように AWS 設定を変更

上記二つのインスタンスについて、AWS コンソールにおいて「Actions」→「Networking」→「Change Source/Dest. Check」を Disable します。

カーネルパラメータの変更

/sbin/sysctl は起動中にカーネルパラメータを変更するためのコマンドです。OpenVPN サーバは IP パケットを転送する必要があるため設定を変更します。

$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 1  ← 0 を 1 に変更して保存

設定を反映させます。

$ sudo /sbin/sysctl -e -p
  • -e → EC2 の AMI とインスタンスタイプの組み合わせによっては設定ファイルで指定された項目がカーネルパラメータとして存在しないため。エラーにせずに無視します
  • -p → /etc/sysctl.conf を読み込んで反映させます

OpenVPN の設定

インストール

$ sudo yum install openvpn

共有鍵の設定

今回は鍵を共有することで通信の暗号化を行うように設定します。

myinstance-1-1 (10.1.1.4, EIP 52.6.58.160)

$ sudo openvpn --genkey --secret /etc/openvpn/secret.key

myinstance-2-1 (10.2.1.4, EIP 52.6.159.238)

何らかの方法で手動で鍵をコピーしてきます。権限を変更します。

$ sudo chmod 600 /etc/openvpn/secret.key

設定ファイルの作成

myinstance-1-1(52.6.58.160):/etc/openvpn/1-to-2.conf

port 1194
proto udp
dev tun  ←トンネル
secret "/etc/openvpn/secret.key"

remote 52.6.159.238  ←相手のVPNサーバ
route 10.2.0.0 255.255.0.0  ←ルーティングするパケット

ifconfig 169.254.255.1 169.254.255.2  ←OpenVPN同士で利用する自分と相手のIP

status openvpn-status.log
verb 3

myinstance-2-1(52.6.159.238):/etc/openvpn/2-to-1.conf

port 1194
proto udp
dev tun
secret "/etc/openvpn/secret.key"

remote 52.6.58.160
route 10.1.0.0 255.255.0.0

ifconfig 169.254.255.2 169.254.255.1

status openvpn-status.log
verb 3

OpenVPN の起動および動作検証

myinstance-1-1 (10.1.1.4, EIP 52.6.58.160)

$ sudo openvpn --config /etc/openvpn/1-to-2.conf

myinstance-2-1 (10.2.1.4, EIP 52.6.159.238)

$ sudo openvpn --config /etc/openvpn/2-to-1.conf

以下のように表示されれば VPN 接続成功です。

...
Wed May  6 14:16:27 2015 Peer Connection Initiated with [AF_INET]52.6.159.238:1194
Wed May  6 14:16:28 2015 Initialization Sequence Completed

動作検証

myinstance-1-2 (10.1.2.4, EIP 52.6.133.31)

$ ping 10.2.2.4

myinstance-2-2 (10.2.2.4, EIP 52.6.254.18)

$ ping 10.1.2.4

サービスとして起動

$ sudo service openvpn start

ログファイル

$ sudo cat /var/log/messages | grep openvpn
$ sudo cat /etc/openvpn/openvpn-status.log
関連ページ
    概要 VyOS は Debian GNU/Linux をもとにしたオープンソースの OS です。かつて無償提供されていた Vyatta Core から fork して開発されています。ルーティングソフトウェア Quagga やこちらのページに記載した OpenVPN を利用した、ソフトウェアルータとしての機能を有しています。AWS EC2 の AMI も Marketplace で提供されており
    概要 こちらのページで VirtualBox を用いて利用方法を把握した VyOS を AWS EC2 インスタンスで動作させ、こちらの OpenVPN と同様に、異なる二つの VPC を VPN 接続してみます。簡単な構成であれば、VPC Peering という AWS が提供する機能を用いても実現できますが、AWS 以外のデータセンターとの接続が必要な場合など、VyOS を用いると要求に柔軟