Skip to main content
TCBKE
New Member
January 26, 2026
Question

GRE tunnel to Zscaler

  • January 26, 2026
  • 1 reply
  • 499 views

Looking for some assistance on setting up GRE tunnels to Zscaler from our FortiGate 201F firmware version 7.4.9.  I found the following community post Configuring a failover scenario using a r... - Fortinet Community and used it as a guide but was advised I would need to use a policy route instead of static routes as I only want traffic coming in from a specific interface to go over this GRE tunnel, not all traffic on the FortiGate.  This is for some SSIDs available to teammates for personal WiFi.  Below is the config for the GRE tunnel and interface, policy route and firewall policy.  I do not see any logs on Zscaler to indicate any traffic is making it to that side.  I have tried modifying the policy route but any changes I make there cause no traffic to log on the FortiGate.  How it is set now at least shows DNS requests from devices in the FortiGate logs but nothing in Zscaler.

 

GRE Tunnel
config system gre-tunnel
edit "Zscaler"
set interface "port16"
set remote-gw xxx.xxx.10.32
set local-gw xxx.xxx.72.2
next
end
config system interface
edit "Zscaler"
set vdom "root"
set ip xxx.xx.216.153 255.255.255.255
set allowaccess ping
set type tunnel
set remote-ip xxx.xx.216.154 255.255.255.252
set monitor-bandwidth enable
set snmp-index 49
set interface "port16"
next
end
Policy Route
config router policy
edit 1
set input-device "port7"
set srcaddr "ZscalerExternal"
set dstaddr "all"
set gateway xxx.xx.216.154
set output-device "Zscaler"
next
Firewall Policy
config firewall policy
edit 94
set name "ZscalerExternal - Out"
set uuid 9ff34eb6-926a-51f0-a19d-21d0c0f9b82b
set srcintf "port7"
set dstintf "Zscaler"
set action accept
set srcaddr "all"
set dstaddr "all"
set schedule "always"
set service "ALL"
set logtraffic all
next

 

Here is the only route I see when showing the cache.

diag ip rtcache list
family=02 tab=254 vrf=0 vf=0 type=01 tos=0 flag=00000200
xxx.xx.216.153@0->xxx.xxx.10.32@22(port16) gwy=xxx.xxx.72.1 prefsrc=0.0.0.0
ci: ref=0 lastused=329 expire=0 err=00000000 used=689 br=0 pmtu=1500

1 reply

funkylicious
SuperUser
SuperUser
January 26, 2026

maybe try enabling NAT on the firewall policy. also, i assume that ZscalerExternal group used in the policy route contains the hosts/subnet that are on port7.

i would start a debug and see how the traffic flows.

"jack of all trades, master of none"
TCBKE
TCBKEAuthor
New Member
January 26, 2026

ZscalerExternal is the subnet setup for DHCP on port 7, in this case 192.168.18.0/24 so yes, it's the IPs used by the devices on that port.

 

We have Central SNAT enabled on the FortiGate so the firewall policy shows Central NAT is enabled so NAT settings from matching Central SNAT policies will be applied.  But there is no policy setup for the IP on WAN port 16 xxx.xxx.72.2 would that be required for the policy route?  I have to be cautious with overall changes as this device is in production for our building.

 

Here is a debug flow packet from a test device.  My main concern with this is it shows at the bottom checked gnum-10000d policy-0, ret-matched, act-accept, policy-0 is matched, act-accept.  Which I believe is the implicit deny policy even though before this it shows policy 94 being accepted which is the policy I created for this.  Implicit deny logs don't show anything useful.

 

vd-root:0 received a packet(proto=17, 192.168.18.4:24174->9.9.9.9:53) tun_id=0.0.0.0 from port7.
allocate a new session-154b2891
in-[port7], out-[]
len=0
result: skb_flags-02000000, vid-0, ret-no-match, act-accept, flag-00000000
Match policy routing id=1: to xxx.xx.216.154 via ifindex-56
find a route: flag=04000000 gw-xxx.xx.216.154 via Zscaler
in-[port7], out-[Zscaler], skb_flags-02000000, vid-0, app_id: 0, url_cat_id: 0
gnum-100004, use addr/intf hash, len=16
checked gnum-100004 policy-178, ret-no-match, act-accept
checked gnum-100004 policy-10047, ret-no-match, act-accept
checked gnum-100004 policy-10051, ret-no-match, act-accept
checked gnum-100004 policy-143, ret-no-match, act-accept
checked gnum-100004 policy-10054, ret-no-match, act-accept
checked gnum-100004 policy-146, ret-no-match, act-accept
checked gnum-100004 policy-10082, ret-no-match, act-accept
checked gnum-100004 policy-168, ret-no-match, act-accept
checked gnum-100004 policy-10084, ret-no-match, act-accept
checked gnum-100004 policy-163, ret-no-match, act-accept
checked gnum-100004 policy-10099, ret-no-match, act-accept
checked gnum-100004 policy-10106, ret-no-match, act-accept
checked gnum-100004 policy-85, ret-no-match, act-accept
checked gnum-100004 policy-94, ret-matched, act-accept
ret-matched
gnum-4e21, check-ffffffffa002f540
checked gnum-4e21 policy-6, ret-no-match, act-accept
checked gnum-4e21 policy-6, ret-no-match, act-accept
checked gnum-4e21 policy-6, ret-no-match, act-accept
gnum-4e21 check result: ret-no-match, act-accept, flag-00000000, flag2-00000000
policy-94 is matched, act-accept
after iprope_captive_check(): is_captive-0, ret-matched, act-accept, idx-94
after iprope_captive_check(): is_captive-0, ret-matched, act-accept, idx-94
in-[port7], out-[Zscaler], skb_flags-02000000, vid-0
gnum-100015, check-ffffffffa002e130
checked gnum-100015 policy-1, ret-no-match, act-accept
checked gnum-100015 policy-2, ret-no-match, act-accept
checked gnum-100015 policy-3, ret-no-match, act-accept
checked gnum-100015 policy-4, ret-no-match, act-accept
checked gnum-100015 policy-5, ret-no-match, act-accept
checked gnum-100015 policy-6, ret-no-match, act-accept
gnum-100015 check result: ret-no-match, act-accept, flag-00000000, flag2-00000000
after check: ret-no-match, act-accept, flag-00000000, flag2-00000000
in-[port7], out-[Zscaler], skb_flags-02000000, vid-0
len=0
in-[port7], out-[Zscaler], skb_flags-02000000, vid-0
checked gnum-10000d policy-1, ret-no-match, act-accept
checked gnum-10000d policy-4, ret-no-match, act-accept
checked gnum-10000d policy-5, ret-no-match, act-accept
checked gnum-10000d policy-0, ret-matched, act-accept
policy-0 is matched, act-accept
NAT disabled by central SNAT policy!
Allowed by Policy-94:
run helper-dns-udp(dir=original)