FTP のように、最初の接続のやり取りの中で別のポート番号を決め、そのポートで追加の接続を張るプロトコルがあります。ファイアウォールのポリシーで最初の接続だけを許可していると、あとから張られる接続は別の通信として扱われ、通らないことがあります。
FortiGate では、session-helper という機能がこうしたプロトコルの中身を追跡し、追加の接続を通します。一般には ALG(アプリケーションレイヤーゲートウェイ)と呼ばれる機能です。この記事では FTP のパッシブモードを例に、session-helper の動きと、FTP サーバのポートを変えたときの設定を確認します。検証時の FortiOS は 6.4.3 です。
- FTP パッシブモードで、データ用のポートが決まる流れ
- 標準ポート(TCP 21)なら、FTP だけ許可したポリシーで通る理由
- ポートを TCP 8021 に変えると、データの接続が拒否される理由
- 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 / tftp | FTP、TFTP |
| sip / h323 / ras / mgcp | 音声・映像の呼制御(SIP、H.323 など) |
| rtsp / mms | ストリーミング(RTSP、MMS) |
| pptp | PPTP |
| dns-udp / dns-tcp | DNS |
| tns / pmap / dcerpc / rsh | Oracle 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 です。クライアントは、通知されたポートにデータコネクションを張ります。
ファイアウォールから見ると、データコネクションのポート番号は、コントロールコネクションの中身を読まない限りわかりません。session-helper の FTP は、このやり取りを追跡してデータコネクションを通します。
標準ポート(TCP 21)での接続
ポリシーで FTP だけを許可する
FortiGate を経由して、端末から FTP サーバに標準ポート(TCP 21)のパッシブモードで接続します。ポリシー&オブジェクト ›› ファイアウォールポリシー で、サービスを FTP だけにしたポリシーを作ります。
この記事の画面は、実際の画面ではなく、検証時の画面から設定する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
| ID | From | To | 送信元 | 宛先 | スケジュール | サービス | アクション |
|---|---|---|---|---|---|---|---|
| 14 | Internet (port1) | LAN (port2) | all | FTPServer | always | 2FTP | ✔ 許可 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | ID 4 | このあとのトラフィックログで、どのポリシーで処理されたかを見るときに使う番号です。 |
| 2 | サービス FTP | 許可しているのは FTP(TCP 21)だけです。データコネクションに使うポートは許可していません。 |
パッシブモードで接続する
端末から FTP サーバにパッシブモードで接続し、パケットをキャプチャしました。FTP サーバからの 227 応答で、データコネクション用のポート番号が通知されています。
▸ 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]
| No. | 表示 | 意味 |
|---|---|---|
| 1 | Src Port: 21 | FTP サーバの TCP 21 番からクライアントへの応答で、コントロールコネクションの中のやり取りです。 |
| 2 | 227 Entering Passive Mode | パッシブモードに入ったことを示す応答です。かっこの中の最後の2つ(194,61)がポート番号を表します。 |
| 3 | Passive port: 49725 | 194×256+61=49725。クライアントは、この TCP 49725 番にデータコネクションを張ります。 |
トラフィックログを確認する
ログ&レポート ›› 転送トラフィック でトラフィックログを確認すると、FTP に続いて TCP 49725 番の通信が記録されています。
| 送信元 | 宛先 | サービス | 結果 | ポリシーID |
|---|---|---|---|---|
| FTPクライアント | FTPサーバ | FTP | ✔ 2.24 kB / 2.12 kB | 4 |
| FTPクライアント | FTPサーバ | 1tcp/49725 | ✔ 2.74 kB / 121.90 kB | 24 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tcp/49725 | パッシブモードで通知されたポートへのデータコネクションです。緑のチェックは通信が許可されたことを示します。 |
| 2 | ポリシーID 4 | FTP しか許可していないポリシー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 に変えます。
| ID | From | To | 送信元 | 宛先 | スケジュール | サービス | アクション |
|---|---|---|---|---|---|---|---|
| 4 | Internet (port1) | LAN (port2) | all | FTPServer | always | 1TCP8021 | ✔ 許可 |
端末からパッシブモードで接続すると、コントロールコネクションは張れますが、データ転送ができる状態になりません。TCP 8021 番は許可されていますが、通知されたポート(今回は TCP 49727 番)への通信が拒否されています。
| 送信元 | 宛先 | サービス | 結果 | ポリシーID |
|---|---|---|---|---|
| FTPクライアント | FTPサーバ | TCP8021 | ✔ 240 B / 271 B | 4 |
| FTPクライアント | FTPサーバ | TCP8021 | 4 | |
| FTPクライアント | FTPサーバ | TCP8021 | 4 | |
| FTPクライアント | FTPサーバ | 1tcp/49727 | Deny: ポリシー違反 | 25 |
| FTPクライアント | FTPサーバ | tcp/49727 | Deny: ポリシー違反 | 5 |
| FTPクライアント | FTPサーバ | tcp/49727 | Deny: ポリシー違反 | 5 |
| FTPクライアント | FTPサーバ | tcp/49727 | Deny: ポリシー違反 | 5 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tcp/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 6 | IP のプロトコル番号です。6 は TCP です(UDP は 17)。 |
| set port 8021 | FTP として扱う宛先のポート番号です。 |
- 既定の TCP 21 の行(edit 9)は残したまま、新しい行を足しています。同じ種類の session-helper を複数登録しても、一致した行だけが使われます。
- 番号を数える代わりに
edit 0と入力すると、空いている番号で新しい行が作られます。
もう一度接続して確認する
ポリシーは STEP 4 のまま(図6、サービスは TCP8021 だけ)で変えずに、端末からパッシブモードで接続します。今度は問題なく接続でき、ファイル転送も動作しました。
| 送信元 | 宛先 | サービス | 結果 | ポリシーID |
|---|---|---|---|---|
| FTPクライアント | FTPサーバ | 1tcp/49734 | ✔ 224 B / 331 B | 24 |
| FTPクライアント | FTPサーバ | TCP8021 | ✔ 2.18 kB / 2.07 kB | 4 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | tcp/49734 | 今回通知されたデータ用のポートです。緑のチェックで、許可されたことがわかります。 |
| 2 | ポリシーID 4 | TCP8021 しか許可していないポリシー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 など複数のプロトコルに対応しています。
コメント