AWSでFortiGate VMの起動方法とプライベートサブネットからインターネットへ接続する設定

FortiGate VM(v7.0.0)を起動して、FortiGateの管理画面からファイアウォールポリシーの設定をしてみました。
2021.05.24

AWSのVPC内にFortiGate VMを起動し、プライベートサブネット上のリソースからFortiGateを経由してインターネットへ抜ける設定をする機会がありましたので手順をご紹介します。

インターネット側へPing疎通まで確認した最終的な構成は以下になりました。

物理FortiGateと同様にもちろんUTMとして利用できます。AWS上で起動するFortiGateはUTMのライセンスも含まれています。

その他のユースケースとしては、仮想ルータとしてSite to Site VPNの検証などオンプレミス環境で実際使われているネットワーク機器の設定の学習にもお使いいただけるのではないでしょうか。FortiGate VMはEC2ですので、使いたいときだけ起動すれば安価にUTMライセンス込みのFortiGateで検証できます。

ライセンス(ソフトフェア)代はインスタンスタイプによって料金が異なります。大きなインスタンスタイプになるにつれてライセンス代も上がっていきます。物理FortiGateでも同じですね。以下、2021年5月24日現在の参考価格。

AWS Marketplace: Fortinet FortiGate Next-Generation Firewall

FortiGate VMの作り方

Firmware v7.0.0のFortiGateをEC2で起動し、FortiGate経由でインターネットへ抜けるまでの設定を記します。

VPC作成

シンプルなVPCを作成しました。

EC2作成

FortiGate用のEC2を起動する以外に必要なリソースの作成、修正が発生します。

AWS MarketplaceからFortiGateのAMIを選択するだけです。BYOLと書いてない方を選択してください。

セキュリティグループを制限します。EC2作成時のデフォルト設定は送信元が制限されていません。ここの制限はWAN側のポートを使って、FortiGateの管理画面にアクセスなどで使われるものです。

素のEC2新規作成と比べるとアクセスできるまでに時間がかかります。待ち時間で進められるその他AWSリソースの設定をします。

EIP取得・関連付け

EIPを関連付けします。NAT GatewayにEIPをアタッチするのと同じ理屈です。

  • ネットワークインタフェースを選択
  • FortiGateのEC2のENIをリストから指定
  • プライベートIPは現時点で1個しか存在しないのでリストに表示されたものを指定

Internal(LAN)用のセキュリティグループ作成

FortiGateのInternal(LAN)になるネットワークインタフェースをこの後作成します。作成時に必要となるセキュリティグループを事前に用意します。プライベートサブネットからの通信をすべて許可しています。ソースは適時環境に合わせて修正してください。

Internal(LAN)用のENI作成・設定

EC2で起動するFortiGateのネットワークインタフェースはデフォルトだとWANの1ポートのみです。Internal(LAN)のポートが必要になります。ENIを作成しEC2に追加します。

  • プライベートサブネットを指定
  • セキュリティグループは用意していたものを指定

送信元/送信先変更のチェックを無効化します。 ENIのデフォルト設定では有効化されており、自身のIPが送信元または送信先になっているパケット以外を受け取らないためです。ここを無効化することでインターネットなど外部向けのパケットを処理可能になります

チェックを外し無効化します。

FortiGateのEC2インスタンスに作成したENIをアタッチします。

EC2のネットワークインタフェースを確認すると2個になっています。パブリックIPがない方のENIが追加したENIです。インタフェースIDは次の作業で必要になります。コピーしておきましょう。

ルートテーブル修正

プライベートサブネットのルートテーブルにルートを追加します。追加したプライベートサブネットのENIへルーティングします。ターゲット指定時にさきほどコピーしたインタフェースIDをペーストして設定します。

FortiGateへ接続

EC2が起動後、パブリックIPでFortiGateの管理画面へ接続します。

https://[パブリックIPアドレス]

証明書の警告が出ますが接続を続行します。ログイン前にユーザ名、パスワードの案内画面が表示されます。

パスワードはEC2のインスタンスIDを入力してログインできます。

初期パスワードの変更を行います。変更後、新しいパスワードで再ログインを促されます。

初期セットアップを行います。スキップもできます。

ホスト名は任意の名前を設定しました。

ダッシュボードはデフォルトの最適なダッシュボードで進めます。

FortiGateのダッシュボードにログインできました。

Settingsからタイムゾーンと言語を変更しました。

ネットワークインターフェイス設定

port1はEC2デフォルトのENIです。WAN側のポートとして設定されています。パブリックIPでFortiGateの管理画面にアクセスしているポートです。port2は追加で作成したENIです。port2は未設定の状態です。編集してプライベートサブネットのデフォルトルートとして機能するようにします。

Port2を編集します。マニュアルでプライベートIPを管理するのは手間なので、DHCPを選択してVPCのDHCPからプライベートIPを払い出してもらいます。そのためDHCPを選択します。ポイントはサーバからデフォルトゲートウェイを取得無効にします。理由は後述します。それと、疎通確認のためにPINGを許可します。

設定後、再度Port2を編集します。VPCのDHCPからプライベートIPが割り当てられることを確認できます。

DHCPでデフォルトゲートウェイを設定するとVPCのデフォルトゲートウェイで上書きされます。プライベートサブネットからのトラフィックをPort2で受信して、FortiGate経由でインターネットへ抜けるときに意図しないルーティングになり無効化しています。本記事の最後に有効時の挙動を紹介しています。

FortiGateのルーティング設定

ファイアウォールポリシーからポリシーを新規作成します。PrivateSubnet(Internal)からFortiGateでNATしてインターネットへ出られる設定を作成します。

port2がPrivateSubnet側に作成したENIです。なので、着信インターフェースをport2に設定します。port1がWAN側のENIです。発信インターフェースをport1に設定します。NATはデフォルトで有効化されていますが念のため確認しましょう。

ポリシーが追加されました。

プライベートサブネットからインターネットへ疎通確認

プライベートサブネットにEC2インスタンスを用意しました。パブリックサブネットに踏み台サーバを用意して経由するか、SSMセッションマネージャを利用して疎通確認端末に接続してください。

FortiGate-VMインスタンスに追加したENIのプライベートIPへPingを打ちます。Pingの応答がない場合は、プライベートサブネット側のENIのセキュリティグループでICMPが許可されているか、FortiGateのPort2の管理アクセスでPingを許可しているか疑ってみてください。

$ ping 10.0.17.102 -c 4
PING 10.0.17.102 (10.0.17.102) 56(84) bytes of data.
64 bytes from 10.0.17.102: icmp_seq=1 ttl=255 time=0.130 ms
64 bytes from 10.0.17.102: icmp_seq=2 ttl=255 time=0.159 ms
64 bytes from 10.0.17.102: icmp_seq=3 ttl=255 time=0.136 ms
64 bytes from 10.0.17.102: icmp_seq=4 ttl=255 time=0.138 ms

--- 10.0.17.102 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3054ms
rtt min/avg/max/mdev = 0.130/0.140/0.159/0.018 ms

次にGoogleのパブリックDNS宛にPingを打ちます。Pingの応答がない場合は、FortiGateのファイアウォールポリシー、プライベートサブネットのルートテーブルを疑ってみてください。

$ ping 8.8.8.8 -c 4
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=103 time=1.62 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=103 time=1.65 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=103 time=1.59 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=103 time=1.81 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.595/1.671/1.813/0.097 ms

EC2でFortiGate-VMを起動し、NAT Gatewayのようにプライベートサブネットからの通信をインターネットへ抜けることができました。

NGパターン: DHCPからデフォルトゲートウェイを取得

デフォルトゲートウェイの値をDHCPで取得しました。

プライベートサブネットのEC2インスタンスからGoogleパブリックDNSにPingを打つと以下の結果になります。Next Hopが10.0.17.1になっていることからわかるように、Port2で受信したトラッフィクをAWSのVPCルータに向けてしまいます。インターネットへ通信が通らなくなるため、DHCPでデフォルトゲートウェイの取得を無効化設定にしました。

$ ping 8.8.8.8 -c 4
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
From 10.0.17.102: icmp_seq=1 Redirect Host(New nexthop: 10.0.17.1)
From 10.0.17.102: icmp_seq=2 Redirect Host(New nexthop: 10.0.17.1)
From 10.0.17.102: icmp_seq=3 Redirect Host(New nexthop: 10.0.17.1)
From 10.0.17.102: icmp_seq=4 Redirect Host(New nexthop: 10.0.17.1)

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3029ms

FortiGate-VMインスタンスに追加したENIのプライベートIPへPingを打ちます。この状態でもローカルネットワーク内の通信には影響ないため正常に応答を返します。

$ ping 10.0.17.102 -c 4
PING 10.0.17.102 (10.0.17.102) 56(84) bytes of data.
64 bytes from 10.0.17.102: icmp_seq=1 ttl=255 time=0.180 ms
64 bytes from 10.0.17.102: icmp_seq=2 ttl=255 time=0.127 ms
64 bytes from 10.0.17.102: icmp_seq=3 ttl=255 time=0.120 ms
64 bytes from 10.0.17.102: icmp_seq=4 ttl=255 time=0.137 ms

--- 10.0.17.102 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3035ms
rtt min/avg/max/mdev = 0.120/0.141/0.180/0.023 ms

おわりに

オンプレミス環境の代わりに仮想ルータを用意してSite to Site VPNの検証に利用したく、FortiGateを作成してみました。FortiGateのInternal(Port2)の設定にハマり時間が溶けました。同じことでつまづかないようブログに残しました。どなたかのお役に立てれば幸いです。

ちなみに以前は自宅の実機で検証していたのですがAWSに検証環境を移すことができました。AWSだと最新のファームウェアが利用できるので、我が家のライセンス切れの実機はもう出番なさそうです。

参考