By Manny Fernandez

September 22, 2026

Wildcard FQDNs on FortiGate: CDNs, Web Filter, and SSL Exemptions

Executive Summary

Item Detail
Objective Explain how a FortiGate populates a wildcard FQDN address object when the domain is served from a CDN, and how wildcard matching in firewall addresses, Web Filter URL filters, and SSL inspection exemptions interact.
Target audience FortiGate administrators, security engineers, and SEs designing policy for SaaS and CDN-hosted destinations.
FortiOS scope 7.0 and later. Behavior described here is consistent through 7.4.x and 7.6.x.

The short version

Wildcard FQDN address objects, Web Filter wildcard URL entries, and SSL exemption wildcard FQDNs are three separate engines. They run at different stages of the session, match on different data, and share no objects or state. Web Filter and SSL exemption match on names and do not care about CDNs. The wildcard FQDN address object matches on IPs learned from DNS, and that is exactly where CDNs cause trouble.

Prerequisites and Lab Architecture

Assumed knowledge: FortiGate firewall policy, SSL/SSH inspection profiles, Web Filter profiles, and basic DNS (A, AAAA, CNAME, TTL).

Component Lab Value
FortiGate FortiOS 7.4.x or 7.6.x, single VDOM
Internal LAN 10.0.10.0/24 on port2
Internal DNS resolver 10.0.1.53, forwarding out through the FortiGate WAN
WAN / transit 198.18.0.0/15 represents public address space
Example CDN edge IPs 198.18.10.21 and 198.18.10.22 (shared edge nodes)
Example domain *.example.com, fronted by a CDN through a CNAME

Three Wildcards, Three Engines

The word wildcard shows up in three places in FortiOS. They look similar in the GUI, but under the hood they are unrelated.

Feature Configured In Matches On CDN Impact
Wildcard FQDN address config firewall address (type fqdn, value *.example.com), used as policy src/dst IPs learned by snooping DNS responses High. Shared IPs over-match, churn and out-of-band DNS under-match
Web Filter wildcard config webfilter urlfilter, entry type wildcard Hostname from SNI or cert (cert inspection), full URL (deep inspection) None
SSL exemption wildcard ssl-exempt entry type wildcard-fqdn, referencing config firewall wildcard-fqdn custom SNI in the ClientHello or the server certificate CN/SAN None

Note that the SSL exemption objects live in config firewall wildcard-fqdn custom, a completely different table from config firewall address, even though both use the phrase wildcard FQDN.

How Wildcard FQDN Address Objects Learn IPs

A FortiGate cannot resolve *.example.com on its own. There is no single name to query. Instead, the object starts empty and is populated by DNS snooping: when a client resolves a name that matches the wildcard, the FortiGate parses the DNS response and adds the IPs from the answer section to the object. Those IPs are then loaded into any firewall policy that references the object.

  • DNS has to transit the FortiGate. The dns-udp session helper, present by default, is what parses the responses. If someone deletes it, wildcard objects never populate.
  • Clients and FortiGate should agree on resolvers. If clients resolve through a path the FortiGate never sees, the cache stays empty for them.
  • Entries follow the record TTL. When the TTL expires, the IP is removed until the next query. set cache-ttl on the address object keeps short-TTL answers around longer.
  • There is a ceiling. A single wildcard FQDN object holds up to 1000 IP addresses.
  • Encrypted DNS is a blind spot. DoH is invisible to the snooper. DoT can be parsed on FortiOS 7.0 and later when the DNS traffic hits a policy with a DoT-capable DNS filter profile.
  • The cache is volatile. It is per VDOM, and a reboot means every IP has to be learned again.

What Happens When the Domain Is on a CDN

CDN-fronted names almost always resolve through a CNAME chain. A representative answer section looks like this:

;; ANSWER SECTION:
www.example.com.                 300 IN CNAME www.example.com.cdn-edge.net.
www.example.com.cdn-edge.net.     60 IN CNAME e1234.a.cdn-edge.net.
e1234.a.cdn-edge.net.             20 IN A     198.18.10.21
e1234.a.cdn-edge.net.             20 IN A     198.18.10.22

The FortiGate ties the final A/AAAA records back to the name that was queried, so 198.18.10.21 and 198.18.10.22 land in *.example.com. The mapping itself works. The problems come from what those IPs actually are.

Problem 1: Shared edge IPs over-match

A CDN edge IP serves thousands of unrelated tenants. Once 198.18.10.21 is in the *.example.com cache, any session to that IP matches the policy, regardless of which site the client actually intended to reach. Policy matching is L3/L4 and the address object never looks at SNI. On an allow policy, a wildcard FQDN address for a CDN-fronted domain permits far more than you think it does. It is not a security boundary.

Problem 2: Short TTLs and geo-DNS create churn

CDN TTLs are often 20 to 60 seconds, and different resolvers or client locations receive different edge IPs. The cache only knows what it has seen pass through, so it is always a snapshot that lags reality.

Problem 3: Out-of-band resolution under-matches

If a client used DoH, a resolver on a path the FortiGate does not see, or a DNS answer it cached before the FortiGate learned it (very common right after a reboot or HA failover), the IP is never cached. The policy silently fails to match and the session falls through to whatever policy is next.

Web Filter Wildcards: Name-Based and CDN-Agnostic

A Web Filter URL filter entry of type wildcard is evaluated against the hostname the session is actually for. With certificate inspection that comes from the SNI or server certificate. With deep inspection the FortiGate sees the full URL and Host header. The IP address is irrelevant, so a shared CDN edge does not confuse it.

config webfilter urlfilter
    edit 10
        set name "example-cdn-only"
        config entries
            edit 1
                set url "*.example.com"
                set type wildcard
                set action allow
            next
            edit 2
                set url "example.com"
                set type simple
                set action allow
            next
            edit 3
                set url ".*"
                set type regex
                set action block
            next
        end
    next
end

Gotcha

*.example.com does not cover the bare apex example.com. Add the apex as its own entry, as shown above.

SSL Exemption Wildcards: Also Name-Based

SSL exemptions in a deep inspection profile decide whether a session is decrypted. An exemption of type wildcard-fqdn references an object from config firewall wildcard-fqdn custom (the predefined g-* groups live there too) and is matched against the SNI or the server certificate, not the destination IP.

config firewall wildcard-fqdn custom
    edit "wc-exempt-example"
        set wildcard-fqdn "*.example.com"
    next
end
config firewall ssl-ssh-profile
    edit "deep-inspect-lab"
        set ssl-exemptions-log enable
        config ssl-exempt
            edit 0
                set type wildcard-fqdn
                set wildcard-fqdn "wc-exempt-example"
            next
        end
    next
end

Watch the exemption type

ssl-exempt also supports type address. If you point that at a wildcard FQDN firewall address, the exemption becomes IP-based and inherits every CDN over-match problem described above. Keep exemptions on type wildcard-fqdn so they stay tied to the name.

How the Three Chain Together

The three features do not share data, but they do run in a fixed order on every session:

  1. Policy match. The wildcard FQDN address cache decides whether this policy matches at all. If the IP is not cached, the session never reaches the profiles attached to this policy.
  2. SSL inspection profile. The exemption check runs on SNI or certificate, so it is name-accurate even on a shared CDN IP.
  3. Web Filter. It evaluates the hostname, or the full URL under deep inspection. For exempted traffic, Web Filter still sees the SNI, so hostname-level wildcard entries and FortiGuard category rating continue to work. Path-level URL filtering does not, because the payload was never decrypted.

The practical result: you can put a wildcard FQDN address on a policy for a CDN-fronted service and pair it with a Web Filter profile. The address object is a loose, IP-based gate that over-matches. The Web Filter wildcard, backed by an allow-then-block URL filter, is what actually enforces the domain. The SSL exemption only decides whether traffic gets decrypted, never whether it is allowed.

Step-by-Step Lab Configuration

Step 1: Create the wildcard FQDN address

Goal: Build the IP-based gate for the policy. Action: Create the address and extend the cache TTL so 20 second CDN answers do not flap.

config firewall address
    edit "LAN-10.0.10.0"
        set subnet 10.0.10.0 255.255.255.0
    next
    edit "wc-example.com"
        set type fqdn
        set fqdn "*.example.com"
        set cache-ttl 3600
    next
end

GUI verification: Policy & Objects > Addresses. Hover over wc-example.com after a client has resolved a matching name. The resolved IPs appear in the tooltip.

Step 2: Confirm DNS is visible to the FortiGate

Goal: Make sure the snooper can see answers. Action: Verify the session helper exists and that the resolver’s outbound DNS crosses a FortiGate policy.

show system session-helper | grep -B1 -A3 dns-udp
config firewall policy
    edit 100
        set name "DNS-resolver-out"
        set srcintf "port2"
        set dstintf "port1"
        set action accept
        set srcaddr "DNS-10.0.1.53"
        set dstaddr "all"
        set schedule "always"
        set service "DNS"
        set nat enable
    next
end

Step 3: Create the SSL exemption and Web Filter profile

Goal: Put the name-based controls in place. Action: Use the wc-exempt-example and example-cdn-only objects from the sections above, then attach the URL filter to a Web Filter profile.

config webfilter profile
    edit "wf-example-only"
        config web
            set urlfilter-table 10
        end
    next
end

Step 4: Build the policy

Goal: Chain all three engines on one policy. Action: Reference the wildcard address, the deep inspection profile, and the Web Filter profile.

config firewall policy
    edit 110
        set name "LAN-to-example-CDN"
        set srcintf "port2"
        set dstintf "port1"
        set action accept
        set srcaddr "LAN-10.0.10.0"
        set dstaddr "wc-example.com"
        set schedule "always"
        set service "HTTPS"
        set utm-status enable
        set ssl-ssh-profile "deep-inspect-lab"
        set webfilter-profile "wf-example-only"
        set logtraffic all
        set nat enable
    next
end

GUI verification: Policy & Objects > Firewall Policy. Policy 110 shows the wildcard address, the inspection profile, and the Web Filter profile icon.

Verification and Validation

From a client on 10.0.10.0/24, resolve and browse a matching name, then check the cache:

diagnose firewall fqdn list-all | grep -A4 "example.com"
diagnose firewall iprope list 100004

Representative success output. The count should be non-zero and the edge IPs should be listed:

fqdn_u 0x55dbb4208add *.example.com: type:(1) ID(186) count(2) generation(3) ...
        198.18.10.21 expires:3591
        198.18.10.22 expires:3591

Now prove the Web Filter guardrail catches the CDN over-match. Force a request for an unrelated tenant onto the same edge IP:

# Legit site: expect HTTP 200
curl -skI https://www.example.com

# Unrelated tenant on the same edge IP: policy 110 matches on IP,
# but the Web Filter blocks it by hostname (expect the block page)
curl -skI --resolve other-tenant.net:443:198.18.10.21 https://other-tenant.net

The second request matching policy 110 and then being blocked by wf-example-only is the whole story in one test: the address object let it in, the name-based control stopped it. Confirm in Log & Report > Security Events > Web Filter.

Troubleshooting and Gotchas

Gotcha 1: The policy never matches, or traffic hits the wrong policy

Cause: The FortiGate never saw the DNS answer (DoH in the browser, a client-side DNS cache, a reboot, or a missing session helper). Diagnose:

diagnose firewall fqdn list-all | grep -A4 "example.com"
diagnose debug flow filter addr 198.18.10.21
diagnose debug flow show function-name enable
diagnose debug flow trace start 20
diagnose debug enable

Resolution: Disable browser Secure DNS or block DoH with Application Control, confirm dns-udp exists, and flush the client DNS cache (ipconfig /flushdns on Windows) so the next query crosses the FortiGate. diagnose test application dnsproxy 1 clears the FortiGate DNS cache when you need a clean retest.

Gotcha 2: The policy matches traffic for unrelated sites

Cause: Shared CDN edge IPs. This is expected behavior, not a bug. Resolution: Add a Web Filter allow-then-block guardrail like the one above, or use Internet Service Database (ISDB) objects for major SaaS and CDN-backed services instead of a wildcard address.

Gotcha 3: The SSL exemption does not apply, or applies too broadly

Cause: The exemption is type address pointing at a wildcard FQDN firewall address (IP-based), the profile is not doing deep inspection, or the client hid the SNI. Resolution: Switch to type wildcard-fqdn, enable ssl-exemptions-log, and check the SSL log for the exemption reason.

Design Recommendations

  • Enforce by name, not IP. Use Web Filter URL filters, FortiGuard categories, or Application Control for the actual allow or deny decision.
  • Use ISDB for big SaaS and CDN-backed services. Microsoft 365, Zoom, and similar services are tracked by FortiGuard-maintained Internet Service objects, which are far more reliable than snooped wildcard caches.
  • Reserve wildcard FQDN addresses for destinations on dedicated IPs, or for cases where over-matching is acceptable, such as a coarse SD-WAN steering hint rather than a security control.
  • Keep DNS visible. Block or inspect DoH and DoT, and make sure clients resolve through a path the FortiGate sees.
  • Keep SSL exemptions on type wildcard-fqdn so they stay tied to SNI and the certificate.
  • Plan for ECH. Encrypted Client Hello hides the real SNI, which weakens both name-based engines. Controlling DNS HTTPS/SVCB records through the FortiGate is the usual mitigation, so check what your FortiOS release supports.

Bottom Line

Wildcard FQDN address objects are a DNS-learned IP list, and CDNs turn that list into a set of shared doors. Treat the address object as a loose gate, and let the name-based engines (Web Filter and SSL exemptions) do the real enforcement. When the destination is a major SaaS platform, skip the wildcard entirely and reach for ISDB.

Recent posts

  • If you've spent any time configuring user authentication on... Full Story

  • DNS is one of those technologies that quietly underpins... Full Story

  • BGP issues on FortiGate firewalls usually trace back to... Full Story

  • Every time your laptop talks to your router, a... Full Story

  • If you've spent any time configuring NAT on a... Full Story

  • If you have spent any time configuring firewall policies... Full Story

  • High availability on FortiGate is one of those features... Full Story

  • If you've configured SD-WAN on a FortiGate, you've almost... Full Story

  • FortiLink is the management protocol that turns a FortiSwitch... Full Story

  • FortiSwitches are pretty rock solid from Mean Time Between... Full Story

  • This is a quicky tip.  Have you ever gone... Full Story

  • DNS is one of those quiet pieces of internet... Full Story

  • This article is an updated version of the previous... Full Story

  • You will add ns2 as a secondary (slave) BIND9... Full Story

  • In the process of deploying my lab, I needed... Full Story

  • RFC 8805, used to be known as Self-Correcting IP... Full Story

  • Years back, I wrote an article about certificate pinning. ... Full Story

  • FortiGates have the ability to send alerts to Microsoft... Full Story

  • In this post, I am going to walk through... Full Story

  • Troubleshooting VoIP on a FortiGate can feel like trying... Full Story

  • Prior to FortiOS 7.0, there were three commands to... Full Story

  • In this post, I am going to go over... Full Story

  • What we are going to do:  We are going... Full Story

  • Choosing between FGCP (FortiGate Clustering Protocol) and FGSP (FortiGate... Full Story

  • Creating a VLAN on macOS (The "Pro" Move) A... Full Story

  • This blog post explores the logic behind how macOS... Full Story

  • Pretty Fly for a Wi-Fi Tell My Wi-Fi Love... Full Story

  • Part of my daily gig is creating BoMs (Bill-of-Materials)... Full Story

  • ICMP introduces several security risks, but careful filtering, rate... Full Story

  • The command diag debug application dhcps -1 enables full... Full Story

  • In the world of FortiOS, execute tac report is... Full Story

  • LLDP; What is it The Link Layer Discovery Protocol... Full Story

  • What it actually does When you run diagnose fdsm... Full Story

  • Monkey Bites are bite-sized, high-impact security insights designed for... Full Story

  • I have run macOS in macOS with Parallels but... Full Story

  • Don't be confused with my other FortiNAC posts where... Full Story

  • This is the third session in a multi-part article... Full Story

  • Today I was configuring key-based authentication on a FortiGate... Full Story

  • Netcat, often called the "Swiss Army knife" of networking,... Full Story

  • At its core, IEEE 802.1X is a network layer... Full Story

  • In case you did not see the previous FortiNAC... Full Story

  • This is our 5th session where we are going... Full Story

  • Now that we have Wireshark installed and somewhat configured,... Full Story

  • The Philosophy of Packet Analysis Troubleshooting isn't about looking... Full Story

  • Using Server Name Indication to diagnose broken sites, missed... Full Story

  • Executive Summary Item Detail Objective Explain how a FortiGate... Full Story

  • Speed Up the Dock via TerminalOpen the Terminal app... Full Story