はじめに
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フォワーダー(プロキシ)として動作させることで、通信の流れは以下のようになります。
- クライアントはLAN内の「FortiGate」に対して名前解決を要求する。
(※LAN内のプライベートIP宛てなので、ブラウザのDoHは発動せず、必ず平文のUDP 53番が使われる) - FortiGateが代理で
8.8.8.8へ問い合わせる。 - 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サーバ設定メニューを表示させる
- 左側のメニューから システム (System) > 表示機能設定 (Feature Visibility) を開きます。
- リストの中から 「DNSデータベース」(バージョンによっては「DNSサーバ」)を探し、スイッチを オン(有効) にして「適用」をクリックします。
ステップ2:LANインターフェースでDNSフォワーダーを有効化する
- 左側メニューに新しく現れた ネットワーク (Network) > DNSサーバ (DNS Servers) を開きます。
- 画面上部の 「新規作成 (Create New)」 をクリックします。
- 以下の通り設定して「OK」を押します。
-
インターフェース: クライアントが繋がっているLAN側のインターフェース(例:
lanやinternal)を選択します。 -
モード: 「システムDNSへフォワード (Forward to System DNS)」 を選択します。
(※これにより、FortiGate自身に設定されている 8.8.8.8 などの外部DNSへクエリを代理で投げるようになります)
ステップ3:DHCPでFortiGateのIPをクライアントに配布する
- ネットワーク (Network) > インターフェース (Interfaces) を開き、先ほどDNSサーバを有効にしたLANインターフェースを編集します。
- 画面中段の 「DHCPサーバ」 セクションを確認します。
- 「DNSサーバ」 の項目を以下のいずれかに変更します。
- インターフェースIPと同じ (Same as Interface IP) を選択する。
- または、「指定 (Specify)」 を選び、FortiGateのLAN側IPアドレス(例:
192.168.1.254等)を直接入力する。
- 「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端末等でコマンドプロンプトを開き、設定が正しく反映されているか確認しましょう。
-
ipconfig /releaseとipconfig /renewを実行して、IPアドレスを再取得します。 -
ipconfig /allを実行し、「DNS サーバー」 の項目が FortiGateのLAN側IPアドレス に変わっていれば設定完了です。
これで、DoHの自動化によるスヌーピング不全や、DNSキャッシュのズレによるタイムアウト問題は発生しなくなります。