Fortigateでは、session-helperという機能により、動的ポートの追加セッションが開始されるような通常処理ではないプロトコルについて、接続を許可することができます。この機能はALG(アプリケーションレイヤーゲートウェイ)と言われることもあります。
今回は、FTPのパッシブモードを例に動作を確認します。
FTP パッシブモード
FTPはファイル転送用プロトコルで、コントロール用とデータ用の2つのコネクションを確立し、ファイル転送します。
コネクションの作り方には、アクティブモードとパッシブモードの2種類があり、以下はパッシブモードの例です。
初回のコントロールはTCP21番でコネクションを張り、FTPサーバからFTPクライアントへデータコネクション用のポート番号が通知されます。
FTPクライアントは通知されたポート番号に対して、データコネクションを張ります。

通常ポート(TCP21番)でのFTPパッシブポートでの接続
Fortigate経由で、端末から通常ポート(TCP 21番)を使用して、パッシブモードでFTP接続するものとします。
ファイアウォールポリシーでは、FTPのみ許可します。
ポリシー&オブジェクト >> ファイアウォールポリシー

端末からFTPサーバへパッシブモードで接続します。すると、FTPサーバからFTPクライアントへデータコネクション用のポート番号(以下の場合は49725番)が通知されます。

FTPクライアントはデータコネクションをTCP 49725番で張りにいきます。

トラフィックログを確認すると、TCP49725番ポートの通信が確認できます。
ログ&レポート >> 転送トラフィック

確認いただきたいのは、ポリシーID 4 では、FTPしか許可していないにも関わらず、動的に割り当てられたプライベートポート(今回はTCP49725番)の通信も許可しているということです。
実際にファイル転送も問題なく動作します。
なぜ、動的に割り当てられたプライベートポートも許可されるのかというと、TCPのポート番号21はsession-helper機能により、FTPプロトコルとして追跡しなさい と定義されているからです。
設定はCLIで確認できます。TCP(プロトコル番号6番)のポート番号21をFTPとして追跡するよう、デフォルトで設定されています。
config system session-helper edit 9 set name ftp set protocol 6 set port 21 next end
カスタムポートによるFTPパッシブポートでの接続
FTPサーバを通常のTCP21番からカスタムポート(今回はTCP 8021番とします)に変更されたとします。この場合に問題が発生します。
session-helper設定無しでの接続
Fortigateで、あらかじめサービスオブジェクトを作成し、TCP8021番ポートをポリシーで許可します。
ポリシー&オブジェクト >> ファイアウォールポリシー

端末からFTPサーバへパッシブモードで接続すると、FTPのコネクションは張れますが、データ転送ができる状態になりません。
TCP 8021番は許可されていますが、動的に割り当てられたプライベートポート(今回はTCP 49727番ポート)の通信は拒否されています。

これは、TCP 8021番の通信がFTPプロトコルとして追跡するように、Fortigateに設定していないので、TCP 49727番ポートは別のセッションと認識され、後続のポリシーで拒否されています。
ログ&レポート >> 転送トラフィック

session-helper設定と動作確認
Fortigateで、TCP 8021番の通信がFTPプロトコルとして追跡するよう、session-helperの設定をします。まず、現在、いくつのsession-helperが設定されているか、editの数で確認します。
FortiGate # config system session-helper FortiGate (session-helper) # show | grep edit edit 1 edit 2 edit 3 edit 4 edit 5 edit 6 edit 7 edit 8 edit 9 edit 10 edit 11 edit 12 edit 13 edit 14 edit 15 edit 16 edit 17 edit 18 edit 19 edit 20 FortiGate (session-helper) #
以上の通り、20個設定されていますので、21個目として、TCP(プロトコル番号6番)ポート番号 8021をFTPプロトコルとして追跡するよう設定します。
FortiGate # config system session-helper FortiGate (session-helper) # edit 21 new entry '21' added FortiGate (21) # set name ftp FortiGate (21) # set protocol 6 FortiGate (21) # set port 8021 FortiGate (21) # end FortiGate #
設定内容を確認すると、以下になります。
FortiGate # config system session-helper FortiGate (session-helper) # edit 21 FortiGate (21) # show config system session-helper edit 21 set name ftp set protocol 6 set port 8021 next end FortiGate (21) #
ポリシーは変更せず、TCP8021番ポートだけが許可されているように設定します

端末からFTPサーバへパッシブモードで接続すると、問題なく接続ができます。
ポリシーでは、TCP8021番しか許可していないにも関わらず、動的に割り当てられたプライベートポート(今回はTCP 49734番ポート)の通信も許可しています。実際にファイル転送も問題なく動作します。

ログ&レポート >> 転送トラフィック

session-helper機能はFTP以外にも、SIPやH323など、複数プロトコルのサポートされています。
コメント