[AWS] Fortinet Fortigate Next-Generation Firewall でサクッと作るリモートアクセス VPN(SSL-VPN)

FortinetのUTM製品、Fortigate Next-Generation Firewallを使ってリモートアクセスVPN(SSL-VPN)を構築してみました。
2020.05.19

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

こんにちは、菊池です。

昨今のテレワーク需要の増加により、リモートアクセスVPN(SSL-VPN)やVDIの導入相談が増えています。AWSネイティブのサービスとしてはAWS Client VPNが提供されていますが、それでは要件を満たせない場合や、使い慣れたアプライアンス製品を採用したいというニーズもあるかと思います。

今回は、FortinetのUTM製品である、Fortigate Next-Generation Firewallを使ってリモートアクセスVPN(SSL-VPN)を導入する手順を紹介します。

構成

構築する構成イメージは以下のようになります。

FortigateのEC2インスタンスから管理用、サービス用、内部用のそれぞれのサブネットに対して、ENI(Elastic Network Interface)を接続します。サービス用のインターフェースに対しSSL-VPNで接続し、VPC内に起動したサーバにSSHで接続するのがゴールです。

Fortigateは、Marketplaceで提供されている Fortinet FortiGate Next-Generation Firewall v6.4.0のライセンス込みのAMIを使用しました。利用するアカウントのAWSマネジメントコンソールにログインし、あらかじめサブスクライブしておきます。

構築手順

構築の流れは以下のようになります。

  1. VPCの作成
  2. Fortigateインスタンス(EC2)の起動
  3. ENIの追加
  4. ルーティングの設定
  5. SSL-VPNの設定

VPCの作成

まずはVPCと関連するサブネット、ルートテーブルの作成です。今回はシングル構成なので、全てのサブネットを1つのAZ上に作成します。

  • VPCの作成
  • Internet Gatewayの作成
  • Internet GatewayをVPCにアタッチ
  • 3つのサブネットを作成
  • ルートテーブルを作成
  • ルートテーブルをサブネットに割り当て
  • セキュリティグループの作成

作成するパラメータは以下を参考にしてください。

VPC・サブネット

CIDR 用途 ルートテーブル
VPC 10.0.0.0/16 - -
Public-Subnet1 10.0.0.0/24 管理用 Public-rt
Public-Subnet2 10.0.4.0/24 外部公開用 Public-rt
Private-Subnet1 10.0.2.0/24 内部用 Private-rt

ルートテーブル

  • Public-rt
宛先 ターゲット
10.0.0.0/16 local
0.0.0.0/0 Internet Gateway
  • Private-rt
宛先 ターゲット
10.0.0.0/16 local

セキュリティグループ(インバウンドルール)

  • 管理用
ポート ソース
HTTP(80) 操作元IPを指定
HTTPS(443) 操作元IPを指定
SSH(22) 操作元IPを指定
TCP 8080 操作元IPを指定
TCP 541 操作元IPを指定
TCP 3000 操作元IPを指定
  • 外部公開用
ポート ソース
HTTPS(443) 0.0.0.0/0
  • 内部用
ポート ソース
全てのトラフィック 10.0.0.0/0

アウトバウンドルールはデフォルトのまま(全て許可)です。

Fortigateインスタンスの起動

続いて、Fortigateのインスタンスを起動します。

マネジメントコンソールから、インスタンスの起動に進みます。AMIは、Marketplaceから、Fortinet Fortigate Next-Generation Firewallを選択します。BYOLを選択しないように注意します。

料金を確認し、次に進みます。

インスタンスタイプは、c5.largeを選択しました。VPC、サブネットは先ほど作成したVPCの管理用サブネットを使用します。EBSはデフォルトのままとしました。

セキュリティグループは、管理インターフェース用に作成しておいたものを選択します。インスタンスが起動できたら、EIP(Elastic IP)を割り当てます。このIPが管理用画面を利用する際のアクセス先になります。

割り当てたEIPに対して、ブラウザからHTTPSで接続します。証明書の警告が出ますが、接続を続行します。すると、以下のような画面にアクセスできます。

管理者のIDと初期パスワードはadmin/EC2のインスタンスIDとなっていますので、次の画面でログインします。

初期パスワードをリセットしましょう。

変更できました。残りはホスト名の設定のようです。

任意のホスト名を設定しましょう。デフォルトの設定も可能です。

以上の設定が完了すると、管理コンソールが表示されます。これで、続きの設定が可能です。

ENIの追加

次に、ENIの追加です。デフォルトで起動したEC2には、1つのネットワークインターフェース(ENI)しかありません。ここに、内部用(ENI2)と外部公開用(ENI3)を追加していきます。

EC2のマネジメントコンソールから、[ネットワークインターフェース] -> [ネットワークインターフェースの作成]へ進みます。

サブネットには内部用のサブネット(10.0.2.0/24)を選択し、Private IPはAuto asignで問題ありません。セキュリティグループは作成ずみのものを選択します。

作成したENIをFortigateのEC2にアタッチします。

Fortigateの管理画面にうつり、[ネットワーク]->[インターフェース]を選択します。すると、port2という物理インターフェースが追加されていることが確認できます。

このインターフェースを選択し、IPアドレスを割り当てていきます。

内部用なのでロールに[LAN] を割り当て、IPアドレスは[DHCP]を選択して[OK]に進みます。

すると、AWSのVPCで割り当てられたIPが自動で設定されます。

同様に、外部公開用のENI3をマネジメントコンソールから作成します。その後、Fortigate側でも同様にIPを設定しましょう。port3として認識されます。

ロールは[WAN]を、IPアドレスは先ほどと同じでDHCPで割り当てます。

続いて、外部公開用のENI3には固定のパブリックIPとしてENIを割り当てましょう。

これで各ENIの作成ができました。

ルーティングの設定

続いてルーティングの設定です。内部ネットワークのサーバーが、インターネットに向けて通信できるようにします。

Fortigateのルーティング設定

Fortigateの管理画面から、[ポリシー&オブジェクト] -> [アドレス]に進みます。ここから[新規作成]を選びます。

VPC内部のアドレスをオプジェクトとして登録します。

  • 名前:Local(任意)
  • タイプ:サブネット
  • IP/ネットマスク:10.0.0.0/16(VPCのCIDR)

として作成します。

続いて、[ファイアウォールポリシー]を新規作成します。

  • 名前:Local to Wan
  • 着信インターフェース:port2(ENI2にあたるインターフェース)
  • 発信インターフェース:port3(ENI3にあたるインターフェース)
  • 送信元:Local
  • 宛先:all
  • サービス:ALL
  • NAT:有効化
  • IPプール設定:発信インターフェースのアドレスを使用

としてポリシーを作成します。

VPCルーティングの設定

ここからはAWS側のルーティングの設定となりますので、マネジメントコンソールにうつります。ENI2のネットワークインターフェースを選択し、[送信元/送信先変更のチェック]を無効化します。これは、デフォルトではENIは、自身のIPが送信元または送信先になっているパケット以外を受け取らないためです。ここを無効化することで、インターネットなど外部向けのパケットを処理可能になります。

無効化します。

最後に、VPCサブネットのルートテーブルを設定します。内部サブネット用のルートテーブルで、宛先0.0.0.0/0のトラフィックがFortigateのENI2に転送されるように指定します。

これで、内部ネットワークのサーバーがインターネットへのアウトバウンド通信が可能になりました。内部からのトラフィックは、Fortigateに転送され、NATされて外部に通信します。

SSL-VPNの設定

ここまできたら、あとはSSL-VPNの設定です。

VPNユーザーの作成

まずはVPN接続用のユーザーを作成します。[User & Authentication] -> [ユーザ定義]から、新規作成を選びます。

今回は外部連携はせず、ローカルのユーザーを使用します。

ユーザー名とパスワードを設定しましょう。

コンタクト情報は必須ではないのでスキップして問題ありません。

有効化して作成。

ファイアウォールポリシーの作成

次にファイアウォールポリシーの作成です。新規作成から、以下を作成します。

  • 名前:SSL to Local
  • 着信インターフェース:SSL-VPNトンネルインターフェース
  • 発信インターフェース:port2
  • 送信元:SSL_VPN_TUNNEL_ADDR1と作成したユーザを追加
  • 宛先:Local
  • サービス:ALL
  • NAT:無効とします

ポリシーが作成できました。

SSL-VPN設定

[VPN] -> [SSL-VPN設定]に進みます。[リッスンするインターフェース]にはport3を選択します。

その他はデフォルトのまま。[認証ポータルマッピング]で作成したユーザとその他のポータルを指定します。

これでFortigate側の設定は完了です。

最後に、AWS側のコンソールで、通信先となる内部ネットワークのサーバでは、SSL-VPNに割り当てるCIDRからの通信を許可するようにセキュリティグループを設定しましょう。

SSL-VPNのポリシーでNATは無効にしているため、SSL-VPNクライアントに払い出されるアドレスで通信されます。

SSL-VPN接続

それでは接続してみます。接続するPCでこちらからFortiClient VPNをダウンロードしてインストールしておきます。

リモートGWには、外部公開用のENI3に割り当てたEIPを指定します。証明書は自己署名なので、[無効なサーバ証明書の警告を表示]のチェックを外しておきました。

接続できました。

この状態から、内部ネットワークに配置したサーバへのSSHも問題ありませんでした。

まとめ

Fortigate Next-Generation Firewallを使ったSSL-VPNの環境を構築してみました。AWS上でも、使い慣れたアプライアンスであれば簡単にVPN接続環境を作ることができます。