OpenVPNでリモートアクセスVPNする時の2種類のネットワーク設定を確認してみた

openvpn-logo

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちわ。気になるキャラNo.1はカイフンだけどガノタ市田です。
今回は、OpenVPNをVPCで使う時の小ネタです。

概要

OpenVPNを使ってリモートアクセスVPNを使うとき、結果的に同じように通信できるけど2種類のネットワーク設定がある事について、ご紹介したいと思います。

構成は下記の通りです。

構成

詳細

どういうことかと言うと、VPNでプライベート環境にあるリソースにアクセスする時、パケットの流れ方の設定方法が2種類ある、というものになります。 その為、Webで検索するとどちらかのパターンで情報が出てくるのですが、その違いについてまとめてみました。
ちなみにOpenVPN自体はルーティングモードにしています。

2種類の設定方法

結論から言うと、次のいずれかです。

  • VPCのルートテーブルでクライアント側への戻りの通信をOpenVPN経由にする
  • OpenVPNでIPマスカレードを設定する

その他の設定は同じです。

確認

実際に確認してみます。

OpenVPNの作成については、VPCのルートテーブルの設定以外は、下記の通りです。

Amazon EC2とOpenVPNでサーバ-多拠点クライアント間通信をセキュアに行う

VPCのルートテーブルを使う場合

VPCのルートテーブルを使うので、net.ipv4.ip_forward = 1の設定によりパケットはそのまま宛先に転送されます。

この状態で、VPCのルートテーブルを次のように設定します。

openvpn-routetable

10.8.0.0/24はOpenVPNがデフォルト設定でクライアントに割り当てるIPです。この10.8.0.0/24宛の通信をOpenVPNのインスタンス(i-066e4xxxxxxx)に向けています。

パケットキャプチャしてみる

実際に、クライアントからプライベート環境のインスタンスに対してPingを打ちつつ、OpenVPN上でtcpdumpを実行してパケットをキャプチャしてみました。

10:15:05.058749 IP (tos 0x0, ttl 127, id 3050, offset 0, flags [none], proto ICMP (1), length 60)
    ip-10-8-0-6.ap-northeast-1.compute.internal > ip-172-31-27-44.ap-northeast-1.compute.internal: ICMP echo request, id 1, seq 47, length 40
10:15:05.059284 IP (tos 0x0, ttl 255, id 52277, offset 0, flags [none], proto ICMP (1), length 60)
    ip-172-31-27-44.ap-northeast-1.compute.internal > ip-10-8-0-6.ap-northeast-1.compute.internal: ICMP echo reply, id 1, seq 47, length 40

上記のように、クライアントに割り当てられたIPである10.8.0.6から、プライベートサブネットの環境にある172.31.27.44のインスタンスにパケットが流れています。
その為、クライアントへの戻りの経路として、10.8.0.0/24宛の通信をOpenVPNのインスタンスに向けることで、VPNで通信できるようになります。

IPマスカレードを使う場合

先程のようなVPCのルートテーブルの設定は追加せず、OpenVPN上でIPマスカレードを設定します。

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

次に、プライベート環境のインスタンスに対して、セキュリティグループでOpenVPNからのアクセスを許可します。

securitygroup

上記の環境では、送信元のopenvpn-linux-sgというセキュリティグループがOpenVPNのインスタンスに関連づいています。

再びパケットキャプチャしてみる

この状態で同様にパケットをキャプチャしてみました。

10:21:43.130021 IP (tos 0x0, ttl 127, id 3014, offset 0, flags [none], proto ICMP (1), length 60)
    ip-172-31-31-218.ap-northeast-1.compute.internal > ip-172-31-27-44.ap-northeast-1.compute.internal: ICMP echo request, id 1, seq 46, length 40
10:21:43.130523 IP (tos 0x0, ttl 255, id 31284, offset 0, flags [none], proto ICMP (1), length 60)
    ip-172-31-27-44.ap-northeast-1.compute.internal > ip-172-31-31-218.ap-northeast-1.compute.internal: ICMP echo reply, id 1, seq 46, length 40

今度は、OpenVPNインスタンスのローカルIPである172.31.31.218と、プライベート環境の172.31.27.44のインスタンスとの間でパケットが流れていました。
その為、プライベート環境のインスタンスに対して、セキュリティグループでOpenVPNからのアクセスを許可することで通信することができるようになります。

どちらがいいのか

インスタンスに固有の設定を持たせるよりは、AWSの設定で代替できるならその方が運用し易いと思います。
しかし、状況に応じてどちらか最適な方を選ぶのがベストかと思います。

最後に

前回紹介したOpenVPN Access Serverは、AMIにIPマスカレードの設定が入っていました。
AMIによって設定内容が変わるので、同じことをやる場合でも違う設定があるということをご紹介致しました。

どなたかのお役に立てば幸いです。

以上になります。