0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【FortiGate】SaaSへのFQDNポリシーがタイムアウトする罠

0
Posted at

はじめに

FortiGateでファイアウォールポリシーを運用する際、IPアドレスの直打ちではなく「FQDN(ドメイン名)」ベースでの許可ポリシーを作成するのは、昨今の運用において必須です。

しかし、「シンプルなWebサイトは通るのに、KintoneやMicrosoft 365などのSaaS、CDN経由のサイトだけが頻繁にタイムアウトする」という謎の現象に悩まされたことはありませんか?

実はこれ、FortiGateの設定ミスではなく、モダンなOS(Windows 11等)とSaaSの仕様が引き起こす2つのアーキテクチャ上の「罠」なのです。本記事では、多くのエンジニアが陥りがちな勘違いと、世界中のFortinetコミュニティで共有されている公式の「真のベストプラクティス」を解説します。

課題の背景:なぜSaaSの通信だけがドロップされるのか?

このタイムアウト問題の裏には、独立した2つの原因(罠)が絡み合っています。

罠①:DNS Mismatch(名前解決のタイミングのズレ)

クライアントPCとFortiGateが、両方とも同じ外部DNS(例:8.8.8.8)を見ている構成だとします。同じDNSに聞くのだから結果も同じになるはず……と思いがちですが、SaaSやCDNは負荷分散のためにDNSラウンドロビンを採用しています。

  • FortiGateの動き: 8.8.8.8 に問い合わせ、IP: A を取得して許可リスト(キャッシュ)に登録する。
  • クライアントの動き: その数秒後、ブラウザから 8.8.8.8 に問い合わせるが、CDNの負荷分散により IP: B を取得する。

結果として、クライアントは IP: B に接続しようとしますが、FortiGateは「IP: Aしか許可していない」として通信をドロップ(タイムアウト)させます。

罠②:DoH(DNS over HTTPS)によるスヌーピング不全

FortiGateには、ワイルドカードFQDN(*.cybozu.com 等)を許可するために、通過するDNSのパケット(UDP 53番)を覗き見してIPを学習する「スヌーピング」という機能があります。

しかし、Windows 11やChrome/Edgeなどのモダンブラウザは、セキュリティ向上のためにDoH(DNS over HTTPS)をデフォルトで有効化しようとします。名前解決がTCP 443番で暗号化されてしまうため、FortiGateはパケットの中身を覗き見できなくなり、IPを学習できずにポリシーが機能しなくなります。

スヌーピー
       ,-~~-.___.
      / |  '     \
     (  )         0
      \_/-, ,----'
         ====           //
        /  \-'~;    /~~~(O)
       /  __/~|   /       |
     =(  _____| (_________|

よくある勘違い:「じゃあDoH(HTTPS)をブロックして、UDP通信に強制させればいいのでは?」

ここで、ネットワークに詳しいエンジニアほど、こんな解決策を思いつくはずです。

「FortiGateのアプリケーションコントロール等でDoHの通信をブロックしてしまえば、ブラウザは勝手に従来の平文(UDP 53番)にフォールバックするはず。そうすればFortiGateのスヌーピングが復活して解決するのでは?」

非常に論理的で鋭いアプローチです。しかし、実はこのアプローチでは問題の「半分」しか解決しません。

確かにDoHをブロックすれば、ワイルドカードFQDNにおけるスヌーピング不全(罠②)は解決します。しかし、「FortiGateとクライアントが別々のタイミングで外部DNSへクエリを投げる」という根本的な構成は変わっていないため、前述したDNSラウンドロビンによる「IPのズレ(罠①)」は防げないのです。

結果として、「時々繋がるようになったが、相変わらずタイムアウトする時がある」という不安定な状態が残ってしまいます。

真のベストプラクティス:FortiGateを「DNSフォワーダー」にする

これら2つの問題を同時に、かつ100%確実に解決するFortinet推奨の構成が「クライアントPCのDNS参照先を、外部DNS(8.8.8.8)ではなく、FortiGateのLANインターフェースのIPに向ける」ことです。

FortiGate自身をDNSフォワーダー(プロキシ)として動作させることで、通信の流れは以下のようになります。

  1. クライアントはLAN内の「FortiGate」に対して名前解決を要求する。
    (※LAN内のプライベートIP宛てなので、ブラウザのDoHは発動せず、必ず平文のUDP 53番が使われる)
  2. FortiGateが代理で 8.8.8.8 へ問い合わせる。
  3. FortiGateは得られたIPアドレスを自身の許可リスト(FQDNキャッシュ)に確実に登録・上書きしてから、クライアントにそのIPを教える。

この構成なら、「暗号化による学習漏れ(DoH問題)」も「タイミングのズレによるIPの不一致(DNS Mismatch問題)」も原理的に発生しなくなります。FortiGateが払い出したIPと、クライアントがアクセスするIPが100%一致するからです。

参考

まとめ

FortiGate環境下でSaaS等へのFQDNポリシーを利用する場合、クライアント端末に外部パブリックDNS(8.8.8.8など)を直接設定するのはアンチパターンです。単にDoHをブロックするだけでは、ラウンドロビンによる「IPのズレ」という罠が残ります。

最も安定的で確実なベストプラクティスは、「社内クライアントのDNS設定はFortiGateのLAN IPへ向け、FortiGateをDNSフォワーダーとして構成する」ことです。

同様のタイムアウト事象に悩まされているネットワーク管理者の皆様は、DoHのブロック等で応急処置をする前に、DHCPで配布するDNS設定とFortiGateのDNSフォワード構成をぜひ見直してみてください。

付録:FortiGateをDNSフォワーダーとして設定する具体的な手順

本記事でベストプラクティスとして紹介した「FortiGate自身をDNSフォワーダー(プロキシ)として構成し、クライアントに配布する」ための具体的な設定手順をご紹介します。

GUIとCLI(コマンドライン)の2通りの方法を記載していますので、環境に合わせて実施してください。

【方式A】GUIで設定する手順

FortiOSのGUIは、デフォルトで一部の高度なメニューが隠れているため、まずはそれを表示させる必要があります。

ステップ1:DNSサーバ設定メニューを表示させる

  1. 左側のメニューから システム (System) > 表示機能設定 (Feature Visibility) を開きます。
  2. リストの中から 「DNSデータベース」(バージョンによっては「DNSサーバ」)を探し、スイッチを オン(有効) にして「適用」をクリックします。

ステップ2:LANインターフェースでDNSフォワーダーを有効化する

  1. 左側メニューに新しく現れた ネットワーク (Network) > DNSサーバ (DNS Servers) を開きます。
  2. 画面上部の 「新規作成 (Create New)」 をクリックします。
  3. 以下の通り設定して「OK」を押します。
  • インターフェース: クライアントが繋がっているLAN側のインターフェース(例: laninternal)を選択します。
  • モード: 「システムDNSへフォワード (Forward to System DNS)」 を選択します。
    (※これにより、FortiGate自身に設定されている 8.8.8.8 などの外部DNSへクエリを代理で投げるようになります)

ステップ3:DHCPでFortiGateのIPをクライアントに配布する

  1. ネットワーク (Network) > インターフェース (Interfaces) を開き、先ほどDNSサーバを有効にしたLANインターフェースを編集します。
  2. 画面中段の 「DHCPサーバ」 セクションを確認します。
  3. 「DNSサーバ」 の項目を以下のいずれかに変更します。
  • インターフェースIPと同じ (Same as Interface IP) を選択する。
  • または、「指定 (Specify)」 を選び、FortiGateのLAN側IPアドレス(例: 192.168.1.254 等)を直接入力する。
  1. 「OK」を押して設定を保存します。

【方式B】CLIで設定する手順(推奨)

GUIのメニューを探すのが手間な場合や、素早く設定したい場合はCLIが便利です。コンソールから以下のコマンドを実行してください。

1. DNSフォワーダー機能の有効化

"lan" の部分は、ご利用環境のLANインターフェース名に適宜置き換えてください。

config system dns-server
    edit "lan"
        set mode forward-only
    next
end

2. DHCPサーバのDNS配布先変更

edit 1 の数字は環境によって異なります(show system dhcp server コマンドで一覧を確認できます)。

config system dhcp server
    edit 1
        set dns-service default
    next
end

(※ set dns-service default は、DNSサーバとして「そのインターフェース自身のIPアドレス」を配布するという設定です)

設定後の確認(クライアント側)

設定が完了したら、LAN配下にあるWindows端末等でコマンドプロンプトを開き、設定が正しく反映されているか確認しましょう。

  1. ipconfig /releaseipconfig /renew を実行して、IPアドレスを再取得します。
  2. ipconfig /all を実行し、「DNS サーバー」 の項目が FortiGateのLAN側IPアドレス に変わっていれば設定完了です。

これで、DoHの自動化によるスヌーピング不全や、DNSキャッシュのズレによるタイムアウト問題は発生しなくなります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?