FortiGate の SIP ALG を無効化する手順と片通話のトラブル対処

  • URLをコピーしました!
目次

はじめに

FortiGate を導入した環境で、以下のような通信トラブルに遭遇したことはないでしょうか。

  • IP 電話(SIP)で、着信はできるのに通話が始まると「お互いの声が聞こえない」あるいは「片方の声しか聞こえない(片通話)」
  • FTP でサーバーへのログインは成功するのに、ファイル一覧の取得や転送でタイムアウトする

ファイアウォールポリシー(許可設定)は正しく見えるのに疎通しない場合、原因は FortiGate の ALG(Application Level Gateway) 機能、FortiGate 用語でいう セッションヘルパー(Session Helper) がパケットを書き換えていることにあるケースがあります。

さらに FortiOS 7.0 以降では Flow-based SIP inspection、7.4 以降では IPS ベースの VoIP プロファイルが追加され、SIP ALG の処理モードが複雑化しています。単純に「セッションヘルパーを削除する」だけでは SIP ALG が止まらない構成も増えており、公式ドキュメントに沿った正確な無効化手順を押さえておくことが重要です。

本記事では、ALG の仕組みと、FortiGate における SIP ALG の無効化手順・FTP ALG の有効化手順・設定反映の検証方法を、FortiOS 7.x の公式仕様に沿って解説します。

この記事でわかること
  • ALG(セッションヘルパー)と SIP ALG の違い
  • FortiOS バージョンごとの SIP ALG 処理モードの変遷
  • 公式推奨に沿った SIP ALG 無効化の 4 STEP 手順
  • diagnose sys session で設定反映を確認する方法
  • VDOM 環境やセッションクリアなど、ハマりやすいポイント

ALG(Application Level Gateway)とは

ALG(Application Level Gateway)とは、アプリケーション層(レイヤー 7)まで踏み込んで通信を制御する機能です。FortiGate では、この機能を担うモジュールを セッションヘルパー(Session Helper) と呼びます。

役割: ペイロードの書き換えと動的ポート開放

通常のファイアウォールは、パケットのヘッダー(宛先 IP やポート番号)のみを参照します。手紙の封筒の宛名だけを見て配送するイメージです。

一方、FTP や SIP(VoIP)といったプロトコルは、パケットのペイロード(中身)に「通信元の IP アドレスと返信用ポート番号」を記述する仕様になっています。NAT 環境下でここにプライベート IP が書き込まれていると、インターネット越しの相手は正しく返信できません。

そこで ALG が、ペイロードを解析してプライベート IP をグローバル IP に書き換え、返信に必要なポートを動的に開放します。これにより、NAT 越しでも SIP や FTP の通信が成立します。

参考: Fortinet Document Library – SIP ALG and SIP session helper(FortiOS 7.6.6)
“The SIP session helper is a legacy solution that provides basic support for SIP calls passing through the FortiGate by opening SIP and RTP pinholes, and by performing NAT of the addresses in SIP messages.”
(SIP セッションヘルパーはレガシーな仕組みで、SIP/RTP のピンホールを開放し、SIP メッセージ内のアドレスの NAT 変換を行う基本的な SIP サポートを提供します)
https://docs.fortinet.com/document/fortigate/7.6.6/administration-guide/147933/sip-alg-and-sip-session-helper

なぜ現代では ALG が不要、あるいは有害になるのか

かつては NAT 越えに ALG が必須でしたが、近年は状況が変わりました。クラウド PBX や現代のアプリケーションの多くは、STUN/TURN などを用いて自前で NAT 越えを実現しており、送信時点で正しいグローバル IP をペイロードに記述しています。

この状態で ALG が介入すると、「アプリが書き込んだグローバル IP」を ALG がさらに変換する二重変換が発生し、パケットの整合性が崩れます。結果として、「呼制御は通るが音声が流れない(片通話)」「通話が途中で切断される」といった症状が発生します。

クラウド PBX サービス事業者から「ルーター側の SIP ALG を無効化してください」と案内されるのは、この二重変換を避けるためです。

FortiOS バージョンごとの SIP ALG 処理モードの変遷

FortiGate の SIP トラフィック処理は、FortiOS のバージョンアップに伴って大きく変化してきました。現在の環境でどの処理モードが動いているかを把握するためにも、この変遷を押さえておくことが重要です。

FortiOS バージョンデフォルト動作主な変更点
〜5.0SIP セッションヘルパーVoIP プロファイル未適用の場合、session-helper がすべての SIP を処理
5.2〜6.4SIP ALG(proxy-based)デフォルトが SIP ALG に移行。default-voip-alg-mode proxy-based が標準
7.0条件分岐ありFlow-based SIP(IPS エンジンによる処理)が導入。flow-based ポリシーに流れる SIP は Flow-based SIP で処理されるように変更
7.0.1 / 7.2フロー系ポリシーで Flow-based SIP が優先flow-based ポリシーに VoIP プロファイルがなければ Flow-based SIP が使われる動作に変更
7.2.5+ / 7.4+pre-7.0 の挙動に近い形で再整理VoIP プロファイルの扱いが 7.0 以前の挙動に近い形で再整理。SIP ALG(proxy-based)が主系として維持
7.4IPS ベース VoIP プロファイル追加ips-voip-filter パラメータ導入。SIP ALG と Flow-based SIP の組み合わせ設定が可能に
7.6(現行)SIP ALG(proxy-based)がデフォルトセッションヘルパーは「レガシー機能」として位置づけ

参考:Fortinet Community – Technical Tip: Changes in SIP ALG’s behavior after upgrading to FortiOS v7.0 and v7.2
“In FortiOS versions up to v6.4, by default and regardless of the firewall policy inspection mode, SIP traffic was proxied by SIP ALG.”
(FortiOS 6.4 以前は、ファイアウォールポリシーのインスペクションモードに関わらず、デフォルトで SIP ALG が SIP トラフィックを処理していました)
https://community.fortinet.com/t5/FortiGate/Technical-Tip-Changes-in-SIP-ALG-s-behavior-after-upgrading-in/ta-p/217022

ポイント: FortiOS 7.0 以降は、ポリシーの inspection-mode(proxy-based か flow-based か)によって処理エンジンが変わる場合があります。SIP トラブルが発生したら、まず diagnose sys session で実際にどのエンジンが処理しているかを確認するのが効率的です(確認コマンドは後述)

現状の設定を確認するコマンド

FortiGate のセッションヘルパー設定は、GUI のメニューには表示されません。確認や変更には、SSH またはコンソール経由で CLI にログインする必要があります。

設定一覧の表示

CLI にログイン後、以下のコマンドで現在のセッションヘルパー一覧を表示します。

show system session-helper

出力例:

config system session-helper
    edit 1
        set name ftp
        set port 21
        set protocol 6
    next
    ...
    edit 13
        set name sip
        set port 5060
        set protocol 17
    next
end

出力の見方

  • edit [数字]:各ヘルパーの ID。設定の変更・削除時にこの番号を指定します
  • set name:対応するプロトコル名(ftp、sip、tftp など)
  • set port:監視しているポート番号(SIP なら UDP 5060)
  • set protocol:プロトコル番号(6 = TCP、17 = UDP)

FortiOS のデフォルトでは SIP は ID:13(UDP 5060)、FTP は ID:1(TCP 21) に定義されています。ただし、過去に変更された環境や機種により番号がずれているケースもあるため、操作前に必ず自環境の ID を確認することが推奨されます。

参考:Fortinet Document Library – SIP ALG and SIP session helper
“config system session-helper / edit 13 / set name sip / set protocol 17 / set port 5060”
https://docs.fortinet.com/document/fortigate/7.6.6/administration-guide/147933/sip-alg-and-sip-session-helper

なお、セッションヘルパーの有無だけでは、実際に SIP ALG が動作しているかどうかは判断できません。どの処理エンジン(SIP ALG / セッションヘルパー / Flow-based SIP)が実際にトラフィックを処理しているかは、diagnose sys session コマンドで確認します。具体的な検証手順は後述します。

ケース① SIP ALG を無効化する手順

クラウド PBX や IP 電話サービスで「片通話になる」「着信しない」「通話が途中で切断される」といった問題が起きている場合、サービス事業者から「ルーター側の SIP ALG を無効化してください」と案内されるケースがほとんどです。

FortiOS 7.x では、セッションヘルパーを削除するだけでは SIP ALG が止まらない構成が標準になっています。以下の 4 STEP を順番に実施することが、公式ドキュメントで推奨されている手順です。

参考: Fortinet Document Library – SIP ALG and SIP session helper(FortiOS 7.6.6)
“In certain scenarios, especially when advised by your SIP provider, it may be necessary to disable the SIP ALG and SIP session helper to ensure proper SIP traffic handling and avoid call issues.”
(SIP プロバイダーから指示を受けた場合など、特定のシナリオでは、SIP ALG と SIP セッションヘルパーを無効化することが必要です)
https://docs.fortinet.com/document/fortigate/7.6.6/administration-guide/147933/sip-alg-and-sip-session-helper

STEP

VoIP プロファイルで SIP ALG を無効化する

FortiOS 5.2 以降、SIP トラフィックは VoIP プロファイルによって処理されます。セッションヘルパーを削除する前に、まずプロファイル側で SIP を無効化します。

config voip profile
    edit "default"
        config sip
            set status disable
        end
    next
end

ポリシーにカスタムの VoIP プロファイルを適用している場合は、該当プロファイルに対しても同様に set status disable を設定します。

STEP

SIP セッションヘルパーの ID を確認して削除する

show system session-helper

出力から set name sip の行を探し、その ID(多くの環境では 13)を確認します。

config system session-helper
    delete 13
end

VDOM 環境の場合は、global コンテキストから実行します。

config global
    config system session-helper
        delete 13
    end
end

セッションヘルパーはグローバル設定のため、VDOM 環境で削除するとすべての VDOM に影響します。複数テナントが存在する環境では、各 VDOM への影響を事前に確認することが推奨されます。詳細はハマりポイントのセクションを参照してください。

STEP

default-voip-alg-mode をカーネルヘルパーベースに変更する

VoIP プロファイルが適用されていないポリシーに流れる SIP トラフィックの処理モードを変更します。

config system settings
    set default-voip-alg-mode kernel-helper-based
end

これにより、VoIP プロファイルなしのポリシーでも SIP ALG(proxy-based)が動作しなくなります。

STEP

既存セッションをクリアして設定を反映する

上記の変更は、設定変更前に確立済みのセッションには自動的に適用されません。ポート 5060 の既存セッションをクリアするか、FortiGate を再起動して反映させます。

セッションクリアの場合:

diagnose sys session filter dport 5060
diagnose sys session clear

このコマンドはフィルター条件に一致するすべてのセッションをクリアします。対象セッションが通話中の場合は通話が切断されます。影響範囲を事前に確認してから実行することをおすすめします。

CLI からの再起動の場合:

execute reboot

設定が反映されているかを確認する

STEP 4 の後、以下のコマンドで SIP セッションのフラグを確認します。

diagnose sys session filter dport 5060
diagnose sys session list

出力の flag フィールドを確認します。

flag の内容処理エンジン
ndr のみFlow-based SIP(IPS エンジン)が処理中
redirlocal を含むSIP ALG(proxy-based)が処理中
helper=sip を含むSIP セッションヘルパーが処理中

SIP ALG と SIP セッションヘルパーのいずれも使われていない状態、または helper フィールドが消えていれば、無効化が反映されています。

参考:Fortinet Community – Technical Tip: How to confirm if FortiGate is using SIP Session Helper or SIP ALG
“If the session has an ‘ndr’ flag -> flow SIP (ips) handles the traffic.”
ndr フラグがある場合、Flow-based SIP(IPS)がトラフィックを処理しています)
https://community.fortinet.com/t5/FortiGate/Technical-Tip-How-to-confirm-if-FortiGate-is-using-SIP-Session/ta-p/190757

ケース② FTP ALG を確認する手順

SIP と逆に、ALG が有効でないと困るケースが FTP です。特に アクティブモード(Active Mode) の FTP では、サーバー側からクライアント側に対してデータコネクションを折り返すため、NAT 越えに ALG のサポートが必要となります。

FTP サーバーへの接続は成立するものの、「ファイル一覧が表示されない」「ファイル転送がタイムアウトする」といった症状が出る場合、FTP ヘルパーが無効化されていないかを確認します。

手順:FTP ヘルパーの確認

FortiOS のデフォルトでは、FTP ヘルパーは ID:1 として有効化されています。

show system session-helper

以下のような設定が存在すれば有効です。

edit 1
    set name ftp
    set port 21
    set protocol 6
next

誤って削除された場合は、以下のコマンドで再登録できます。

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

これにより、FortiGate は FTP の PORT コマンドなどを監視し、データ転送に必要なポートを動的に開放します。

補足: 現代の FTP 事情

近年はセキュリティ要件の観点から、アクティブモード FTP よりも FTPS(Explicit TLS)や SFTP(SSH)への移行が主流になっています。既存システムの互換性要件で FTP を残す必要がある場合を除き、新規環境では暗号化された代替プロトコルを検討することをおすすめします。

なお、FTPS の制御チャネルが TLS で暗号化されていると、FortiGate の ALG はペイロードを解析できません。この場合は ALG に頼らず、パッシブモード+サーバー側でのパッシブポート範囲指定+該当ポートのファイアウォール許可といった構成を取るのが一般的です。

SIP 処理モードの選定ガイド

FortiOS 7.x では、SIP トラフィックを処理するエンジンが 3 種類あります。どれを使うべきか迷った場合は、以下の選定表を参考にしてください。

処理モード設定方法特徴向いているケース
SIP ALG(proxy-based)default-voip-alg-mode proxy-based(デフォルト)レイヤー 7 プロキシで処理。NAT 対応・ピンホール開放・レート制限・ログなど機能が豊富FortiGate 側で SIP を制御・監視したい場合、自前の SIP サーバーを管理している場合
SIP セッションヘルパー(kernel-helper-based)default-voip-alg-mode kernel-helper-based + session-helper を削除しないカーネルで処理するため軽量・高スループット。機能は限定的レガシー互換が必要な場合。Fortinet 公式では「レガシー機能」と位置づけており、新規構成では推奨されていません
Flow-based SIP(IPS エンジン)ポリシーの inspection-mode を flow-based に設定(7.0 以降)IPS エンジンで処理。MSRP デコードなど proxy-based では対応できない機能ありスループット重視かつ IPS との連携が必要な場合

参考: Fortinet Community – Technical Tip: When to use each VoIP ALG mode setting on FortiGate
“Please note that the SIP session-helper is a legacy feature existing for compatibility reasons. It is not recommended to use a SIP session-helper to perform a SIP inspection. Please use SIP ALG instead.”
(SIP セッションヘルパーは互換性のために残されたレガシー機能です。SIP インスペクションには SIP ALG の使用が推奨されます)
https://community.fortinet.com/t5/FortiGate/Technical-Tip-When-to-use-each-VoIP-ALG-mode-setting-on/ta-p/270884

クラウド PBX の事業者から「SIP ALG を無効化してください」と指示された場合は、SIP ALG による二重変換を避けることが目的です。この場合は STEP 1〜4 の手順で SIP ALG とセッションヘルパーを両方無効化し、SIP の NAT 処理をアプリケーション側(STUN/TURN)に委ねる構成が一般的です。

設定反映時のハマりポイント

SIP ALG の無効化は手順が複数にまたがるため、設定変更後も症状が改善しないケースがあります。よくある原因をまとめます。

セッションヘルパーを削除しても SIP ALG が止まらない

FortiOS 5.2 以降、SIP ALG はセッションヘルパーとは独立して動作します。セッションヘルパーを削除しただけでは SIP ALG(proxy-based)は停止しません。 STEP 1(VoIP プロファイルで SIP を disable)と STEP 3(default-voip-alg-mode kernel-helper-based)を合わせて実施することが必要です。

設定変更が既存セッションに反映されない

FortiGate の設定変更は、変更後に新規確立されるセッションにのみ適用されます。変更前に確立されたセッション(通話中の SIP など)はそのまま残るため、設定後にセッションクリアまたは再起動が必要です。

diagnose sys session filter dport 5060
diagnose sys session clear

VDOM 環境では session-helper 操作が全 VDOM に影響する

config system session-helper はグローバル設定のため、VDOM 環境では特定の VDOM からは操作できません。セッションヘルパーの変更は全 VDOM に影響します。

一方、default-voip-alg-mode は VDOM ごとに個別設定できます。特定の VDOM のみで SIP ALG を制御したい場合は、VDOM コンテキストで default-voip-alg-mode を設定します。

config vdom
    edit VDOM-A
        config system settings
            set default-voip-alg-mode kernel-helper-based
        end
    next
end

参考:Fortinet Community – Technical Tip: Disabling VoIP Inspection
“If VDOMs are enabled, disable the session helper from global as the session helper setting is a global parameter, and is not available under any particular VDOM. Since this is a global setting, removing or disabling the session-helper globally affects all the VDOMs.”
(VDOM が有効な場合、セッションヘルパーはグローバルパラメータであるため、global から無効化します。これはグローバル設定のため、削除すると全 VDOM に影響します)
https://community.fortinet.com/t5/FortiGate/Technical-Tip-Disabling-VoIP-Inspection/ta-p/194131

VIP がポート 5060 / 2000 に応答してしまう

default-voip-alg-modeproxy-based の状態では、FortiGate は TCP 5060、TCP/UDP 2000(SCCP)を SIP/SCCP として傍受します。VIP を設定している場合、ポートスキャンにこれらのポートが「オープン」と表示されることがあります。SIP ALG を無効化することで、この副作用も解消されます。

NGFW ポリシーモード(ポリシーベース NGFW)では VoIP プロファイルが使えない

FortiGate の VDOM が NGFW ポリシーモードで設定されている場合、VoIP プロファイルは利用できません。この場合は、default-voip-alg-mode kernel-helper-based の設定とセッションヘルパーの削除を組み合わせて対応します。

まとめ

本記事では、FortiGate の ALG(セッションヘルパー)機能と、SIP ALG の無効化・FTP ALG の有効化手順について解説しました。

  • ALG はペイロードを書き換えて NAT 越えを補助する機能で、FortiGate ではセッションヘルパーが実体
  • FortiOS 7.0 以降は SIP ALG(proxy-based)・セッションヘルパー(kernel-helper-based)・Flow-based SIP(IPS)の 3 処理モードが混在
  • 現代のクラウド PBX では SIP ALG が二重変換を引き起こし、片通話や切断の原因になりやすい
  • SIP ALG の無効化は、VoIP プロファイル → セッションヘルパー → default-voip-alg-mode の順で操作し、最後にセッションクリアまたは再起動で反映する
  • FTP のアクティブモードでは FTP ALG の有効化が必要だが、新規環境では FTPS や SFTP への移行も検討の余地あり
  • VDOM 環境では session-helper はグローバル設定となるため、全 VDOM に影響する点に注意

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

主にインフラを得意とするエンジニアです。日々の業務で得た実践的なノウハウや、最新の脆弱性ニュースなどを備忘録を兼ねて発信しています。
同じエンジニアの方々の課題解決のヒントになれば嬉しいです。

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次