【Fortigate】Session-helper(ALG)の設定と動作確認 FortiOS6.4.3

FTP のように、最初の接続のやり取りの中で別のポート番号を決め、そのポートで追加の接続を張るプロトコルがあります。ファイアウォールのポリシーで最初の接続だけを許可していると、あとから張られる接続は別の通信として扱われ、通らないことがあります。

FortiGate では、session-helper という機能がこうしたプロトコルの中身を追跡し、追加の接続を通します。一般には ALG(アプリケーションレイヤーゲートウェイ)と呼ばれる機能です。この記事では FTP のパッシブモードを例に、session-helper の動きと、FTP サーバのポートを変えたときの設定を確認します。検証時の FortiOS は 6.4.3 です。

この記事でわかること
  1. FTP パッシブモードで、データ用のポートが決まる流れ
  2. 標準ポート(TCP 21)なら、FTP だけ許可したポリシーで通る理由
  3. ポートを TCP 8021 に変えると、データの接続が拒否される理由
  4. session-helper に TCP 8021 を追加して通るようにする設定

session-helper とは

session-helper は、特別な処理が必要なセッションを扱う FortiOS の機能です。ポリシーで許可されたセッションが、session-helper に登録したプロトコル番号とポート番号に一致すると、そのセッションは session-helper に渡されます。session-helper はセッションの中身を読み、関連する接続を通したり、メッセージの中の IP アドレスを変換したりします。

FortiOS 6.4.3 の config system session-helper で指定できる種類(set name)は次のとおりです。

name対象
ftp / tftpFTP、TFTP
sip / h323 / ras / mgcp音声・映像の呼制御(SIP、H.323 など)
rtsp / mmsストリーミング(RTSP、MMS)
pptpPPTP
dns-udp / dns-tcpDNS
tns / pmap / dcerpc / rshOracle TNS、Sun RPC portmapper、DCE-RPC、rsh

FTP パッシブモード

FTP はファイル転送用のプロトコルで、コマンドをやり取りするコントロールコネクションと、ファイルを送るデータコネクションの2つを使います。データコネクションの張り方には、アクティブモードとパッシブモードがあります。

パッシブモードでは、クライアントがまず TCP 21 番でコントロールコネクションを張ります。クライアントが PASV コマンドを送ると、サーバはデータ用のポートで待ち受け、そのアドレスとポート番号を 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2) の形で返します。ポート番号は p1×256+p2 です。クライアントは、通知されたポートにデータコネクションを張ります。

FTPクライアントFTPサーバ① コントロールコネクション(TCP 21)② 「この番号のポートに接続してください」③ データコネクション(通知された番号のポート)
図1 FTP パッシブモードの流れ。データ用のポート番号はコントロールコネクションの中で決まる

ファイアウォールから見ると、データコネクションのポート番号は、コントロールコネクションの中身を読まない限りわかりません。session-helper の FTP は、このやり取りを追跡してデータコネクションを通します。

標準ポート(TCP 21)での接続

ポリシーで FTP だけを許可する

FortiGate を経由して、端末から FTP サーバに標準ポート(TCP 21)のパッシブモードで接続します。ポリシー&オブジェクト ›› ファイアウォールポリシー で、サービスを FTP だけにしたポリシーを作ります。

画面イメージについて

この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。

FortiGate 管理画面画面イメージ
ポリシー&オブジェクト ›› ファイアウォールポリシー
IDFromTo送信元宛先スケジュールサービスアクション
14Internet (port1)LAN (port2)allFTPServeralways2FTP✔ 許可
図2 FTP だけを許可したポリシー(実際の画面ではなく、表示のポイントを示したイメージです)
No.表示意味
1ID 4このあとのトラフィックログで、どのポリシーで処理されたかを見るときに使う番号です。
2サービス FTP許可しているのは FTP(TCP 21)だけです。データコネクションに使うポートは許可していません。

パッシブモードで接続する

端末から FTP サーバにパッシブモードで接続し、パケットをキャプチャしました。FTP サーバからの 227 応答で、データコネクション用のポート番号が通知されています。

パケットキャプチャ(Wireshark)画面イメージ
▸ Internet Protocol Version 4, Src: (伏せています), Dst: (伏せています)1▸ Transmission Control Protocol, Src Port: 21, Dst Port: 55143▾ File Transfer Protocol (FTP)2  ▾ 227 Entering Passive Mode ((伏せています),194,61).\r\n      Response code: Entering Passive Mode (227)      Response arg: Entering Passive Mode ((伏せています),194,61).      Passive IP address: (伏せています)3      Passive port: 49725  [Current working directory: /]  [Command: RETR test.txt.txt]
図3 FTP サーバからの 227 応答(実際の画面ではなく、表示内容のポイントを示したイメージです。IP アドレスは伏せています)
No.表示意味
1Src Port: 21FTP サーバの TCP 21 番からクライアントへの応答で、コントロールコネクションの中のやり取りです。
2227 Entering Passive Modeパッシブモードに入ったことを示す応答です。かっこの中の最後の2つ(194,61)がポート番号を表します。
3Passive port: 49725194×256+61=49725。クライアントは、この TCP 49725 番にデータコネクションを張ります。
FTPクライアントFTPサーバFortiGate① コントロールコネクション(TCP 21)② 「49725 番ポートに接続してください」③ データコネクション(TCP 49725)FortiGate を通過できる
図4 TCP 21 のコントロールコネクションの中で通知されたポート(TCP 49725)に、データコネクションが張られる

トラフィックログを確認する

ログ&レポート ›› 転送トラフィック でトラフィックログを確認すると、FTP に続いて TCP 49725 番の通信が記録されています。

FortiGate 管理画面画面イメージ
ログ&レポート ›› 転送トラフィック
送信元宛先サービス結果ポリシーID
FTPクライアントFTPサーバFTP✔ 2.24 kB / 2.12 kB4
FTPクライアントFTPサーバ1tcp/49725✔ 2.74 kB / 121.90 kB24
図5 TCP 21 で接続したときのトラフィックログ(実際の画面ではなく、表示のポイントを示したイメージです。IP アドレスは伏せ、役割名にしています)
No.表示意味
1tcp/49725パッシブモードで通知されたポートへのデータコネクションです。緑のチェックは通信が許可されたことを示します。
2ポリシーID 4FTP しか許可していないポリシー4 で、TCP 49725 番の通信も許可されています。

FTP だけを許可したポリシーで、動的に決まった TCP 49725 番の通信まで許可されています。実際にファイル転送も問題なく動作しました。

これは、TCP 21 番の通信を FTP として追跡するよう、session-helper に最初から登録されているためです。CLI で設定を確認すると、プロトコル番号 6(TCP)のポート 21 が ftp として登録されています。

FortiGate(初期設定の session-helper のうち FTP の行)

config system session-helper
    edit 9
        set name ftp
        set protocol 6
        set port 21
    next
end

カスタムポート(TCP 8021)での接続

次に、FTP サーバの待ち受けポートを TCP 21 から TCP 8021 に変えた場合を確認します。

session-helper の設定なしで接続する

TCP 8021 番のサービスオブジェクトを作り、ポリシー4 のサービスを TCP8021 に変えます。

FortiGate 管理画面画面イメージ
ポリシー&オブジェクト ›› ファイアウォールポリシー
IDFromTo送信元宛先スケジュールサービスアクション
4Internet (port1)LAN (port2)allFTPServeralways1TCP8021✔ 許可
図6 サービスを TCP8021 にしたポリシー(実際の画面ではなく、表示のポイントを示したイメージです)

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

FTPクライアントFTPサーバFortiGate① コントロールコネクション(TCP 8021)② 「49727 番ポートに接続してください」③ データ(TCP 49727)別の通信として拒否
図7 TCP 8021 は FTP として追跡されないので、TCP 49727 のデータコネクションは拒否される
FortiGate 管理画面画面イメージ
ログ&レポート ›› 転送トラフィック
送信元宛先サービス結果ポリシーID
FTPクライアントFTPサーバTCP8021✔ 240 B / 271 B4
FTPクライアントFTPサーバTCP80214
FTPクライアントFTPサーバTCP80214
FTPクライアントFTPサーバ1tcp/49727 Deny: ポリシー違反25
FTPクライアントFTPサーバtcp/49727 Deny: ポリシー違反5
FTPクライアントFTPサーバtcp/49727 Deny: ポリシー違反5
FTPクライアントFTPサーバtcp/49727 Deny: ポリシー違反5
図8 session-helper の設定がないときのトラフィックログ(実際の画面ではなく、表示のポイントを示したイメージです。IP アドレスは伏せ、役割名にしています)
No.表示意味
1tcp/49727 Deny(赤)データコネクションが「ポリシー違反」で拒否されています。
2ポリシーID 5ポリシー4 には一致せず、後ろにあるポリシー5 で拒否されています。

TCP 8021 番の通信を FTP として追跡する設定がないため、FortiGate は TCP 49727 番の接続を FTP とは関係のない新しいセッションとして扱います。ポリシー4 は TCP8021 しか許可していないので一致せず、後ろのポリシーで拒否されます。

session-helper に TCP 8021 を追加する

TCP 8021 番の通信を FTP として追跡するよう、session-helper に登録します。まず、今いくつ登録されているかを edit の番号で確認します。

FortiGate

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 番目として、プロトコル番号 6(TCP)のポート 8021 を ftp として追跡するよう設定します。

FortiGate

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

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) #
設定意味
set name ftp使う session-helper の種類です。FTP として追跡します。
set protocol 6IP のプロトコル番号です。6 は TCP です(UDP は 17)。
set port 8021FTP として扱う宛先のポート番号です。
補足
  • 既定の TCP 21 の行(edit 9)は残したまま、新しい行を足しています。同じ種類の session-helper を複数登録しても、一致した行だけが使われます。
  • 番号を数える代わりに edit 0 と入力すると、空いている番号で新しい行が作られます。

もう一度接続して確認する

ポリシーは STEP 4 のまま(図6、サービスは TCP8021 だけ)で変えずに、端末からパッシブモードで接続します。今度は問題なく接続でき、ファイル転送も動作しました。

FTPクライアントFTPサーバFortiGate① コントロールコネクション(TCP 8021)② 「49734 番ポートに接続してください」③ データコネクション(TCP 49734)FortiGate を通過できる
図9 session-helper に TCP 8021 を追加すると、TCP 49734 のデータコネクションも通る
FortiGate 管理画面画面イメージ
ログ&レポート ›› 転送トラフィック
送信元宛先サービス結果ポリシーID
FTPクライアントFTPサーバ1tcp/49734✔ 224 B / 331 B24
FTPクライアントFTPサーバTCP8021✔ 2.18 kB / 2.07 kB4
図10 session-helper 追加後のトラフィックログ(実際の画面ではなく、表示のポイントを示したイメージです。IP アドレスは伏せ、役割名にしています)
No.表示意味
1tcp/49734今回通知されたデータ用のポートです。緑のチェックで、許可されたことがわかります。
2ポリシーID 4TCP8021 しか許可していないポリシー4 で、データコネクションも許可されています。

うまく通らないとき

状態よくある原因確認すること
ログインはできるが、一覧表示や転送で止まるデータコネクションが拒否されているトラフィックログに、通知されたポート(tcp/49xxx など)の Deny が出ていないか。
標準以外のポートで FTP を使っているそのポートが session-helper に登録されていないshow system session-helper に、使っているプロトコル番号とポートの ftp の行があるか。
登録したのに通らないプロトコル番号やポートの誤りTCP なら set protocol 6 になっているか。サーバが実際に待ち受けているポートと一致しているか。

まとめ

ケースコントロールコネクションデータコネクション
TCP 21(既定の session-helper あり)ポリシー(FTP)で許可FTP として追跡され、許可される
TCP 8021(session-helper なし)ポリシー(TCP8021)で許可別のセッションとして扱われ、拒否される
TCP 8021(session-helper に追加)ポリシー(TCP8021)で許可FTP として追跡され、許可される

FTP を標準以外のポートで動かすときは、ポリシーでそのポートを許可するだけでは足りず、session-helper にも同じポートを FTP として登録する必要があります。session-helper は FTP のほか、SIP や H.323 など複数のプロトコルに対応しています。

コメント