VPNのスプリットトンネルの有効的活用とRESTful APIによるその運用自動化

アレイネットワークスのSSL-VPN セキュアアクセスゲートウェイ ArrayAG/vxAGには 2種類のVPNトンネルモードが用意されている。 フルトンネルモードとスプリットトンネルモードである。

本稿では、スプリットトンネルの有効活用と、それに関連しての RESTful APIを使った 運用の自動化を提案する。

VPNフルトンネル/スプリットトンネルとは

フルトンネル

フルトンネルとは、クライアントとArrayAG/vxAG間に確立したトンネルに全てのトラフィックを向けるモードを言う。 

フルトンネルのメリット:

  • すべてのトラフィックがArrayAG/vxAGを通過することにより、クライアントで送受信される情報のすべてを把握することができる。
  • クライアントのすべての外部アクセスをイントラネットとして管理できる。

フルトンネルのデメリット:

  • すべてのトラフィックがArrayAG/vxAGへ一旦集中するため、回線飽和が発生するケースがある

スプリットトンネル

スプリットトンネルとは、クライアントとArrayAG/vxAG間に確立したトンネルに特定の宛先IPへのアクセス トラフィックのみを向けるモードを言う。 

スプリットトンネルのメリット:

  • 特定のトラフィックのみがArrayAG/vxAGを通過することにより、ArrayAG/vxAGへ向かうトラフィックを適正管理することができる

スプリットトンネルのデメリット:

  • ArrayAG/vxAG へ向けるIP管理を適切に運用しなければならない。フルトンネルに比べ、管理項目が増える 

スプリットトンネルのIP振り分け方法

フルトンネル、スプリットトンネルのいずれのモードにかかわらず、VPNトンネルのメリットの一つに

  • アクセス元IP アドレスを制限する 有料アプリサイト(CDNサービス、特許検索サービス、財務経理会計SaaSなど)を 契約IPアドレスで利用できる

ことがあげられる。
この大きなトンネル利用メリットに対し、運用管理が難しいサービスがある。CDNサービスなど、頻繁にアクセス先IPアドレスが変更されるサービスである。
このようなサービスではクライアント側での名前解決が必須であり、特定のIPアドレス向けトラフィックのみをArrayAG/vxAGへむけるスプリットトンネルでは、サービス側の宛先IP変更にダイナミックに対応できない場合が発生する。 
ArrayAG/vxAGのスプリットトンネルでの 宛先IPアドレス指定は、トンネル確立時に、指定IPをクライアントのルーティングテーブルに自動的に追加することで実現している。
ルーティングテーブルへのIPアドレス設定数は特に上限があるわけではない。
これまで、弊社が試した最大数は 512である。上限は、クライアントのメモリー容量に依存すると思われる。
課題は 以下にサービス側の宛先IP変更に スプリットトンネルの指定IP設定が迅速に対応できるかである。

スプリットトンネルのデメリットを解消し、VPNを適正活用するRESTful API利用の提案

サービス側の宛先IP変更監視をマニュアルで運用することは至難といわざるをえず、なんらかの方法で、自動化する必要がある。
この解決策として提案したいのが、ArrayAG/vxAGに実装されているRESTful APIである。
運用のためのアプリケーションプログラムを用意することになるが、その流れは以下のようになる。

〇 サービスを名前解決でそのIPアドレスを取得する
〇 取得したIPアドレスをテキストファイルにまとめる
〇 前回に取得してあるIPアドレス・ファイルと、作成したIPアドレス・ファイルを比較する
〇 変更レコードを変更ファイルとして作成する
〇 変更ファイルをもとに ArrayAG/vxAGへ RESTful APIで投入する

これをCRON等で定時自動起動プログラムとして運用する。
もちろん 既存サービスのIPアドレス変更だけでなく、サービス自体の追加、削除のために、指定IPアドレスの削除、追加も可能なRESTful APIを用意することになる。

RESTful API サンプル

以下に PYTHONをつかった RESTful APIの例を示す。
このサンプルは Windows10 / Python3.6、Centos8 / Python3.8でテスト検証したものである。
利用するPYTHON ライブラリ: requests
必要なコマンドは以下の2行である。

s = requests.Session()
r = s.post(url, data=ag_cmd, headers=headers, verify=False)

インスタンスを作成し、POSTメソッドに必要な引数を投入する
POSTを実行し、そのレスポンスを r で 受取る。
POSTの引数は以下のとおり:

url:”https://ArrayAG/vxAGのIPアドレス:9997/rest/ag/global/cli_extend”
data:(JSONフォーマット)

IPアドレス追加の場合:

‘{“cmd”:”config term”,”vsite_name”:”‘+ v_site_name + ‘”,”cmd” : “vpn resource groupitem network ‘ + vpn_resource_name + ‘ ‘ + ipaddress + ‘”}’

IPアドレス削除の場合:

‘{“cmd”:”config term”,”vsite_name”:”‘+ v_site_name + ‘”,”cmd” : “no vpn resource groupitem network ‘ + vpn_resource_name + ‘ ‘ + ipaddress + ‘”}’

変更の場合は、 削除・追加の2ステップを実行する。

headers = {“Accept”: “application/json” , “Authorization”: “Basic cmVzdDpyZXN0”}
“Authorization”: “Basic cmVzdDpyZXN0″ は ArrayAG/vxAGに登録したログインユーザ名をBASE64で暗号化した文字列である。

上記は、1アドレスの追加、削除であり、複数のIPアドレスをまとめて操作する BATCH型 RESTful APIもある。

弊社で実施したテスト・サンプル・プログラムをご覧になりたい方は 以下にご連絡ください。
また、vxAGを試用ご希望の方も併せてご要望ください。 評価vxAGをご用意いたします。

以上です。
興味あるユーザはハードウエア・仮想ライセンスをご用意しますので、是非お試しください。
The network functions platform company「Array NETWORKS」MAIL TO: marketing-j@arraynetworks.net
担当: 対馬浩明
TEL: 044-589-8316