If you've spent any time configuring user authentication on... Full Story
By Manny Fernandez
July 16, 2026
The Cisco Engineer’s Guide to FortiGate: A Side-by-Side CLI Rosetta Stone for IOS Veterans Landing on FortiOS
You have twenty years of muscle memory. You type conf t before your coffee finishes brewing. Then someone hands you a FortiGate and the first thing you notice is that enable does nothing, write memory does nothing, and show run returns a config tree that looks like somebody exported a JSON blob into a terminal.
The good news is that nothing you know is wasted. A firewall policy is an ACL with better manners. A phase1-interface is a VTI. An accprofile is a privilege level. VDOMs are contexts. The concepts map almost one to one. What changes is the grammar, and the grammar is learnable in an afternoon.
This guide is that afternoon. Every section below puts the Cisco command you already know on the left and the FortiOS equivalent on the right. No theory, no marketing, no “paradigm shifts.” Just the config that works, in the order you are likely to need it: get in the box, get an interface up, get traffic through, get it routed, get it encrypted, then get it troubleshot at 2 a.m.
One note before you start. Everything here is FortiOS 7.x CLI. Where a command changed between versions I say so. Where FortiOS genuinely has no equivalent to a Cisco feature, I say that too rather than inventing one.
1. The Mental Model: What Actually Changes
Before a single command, understand the four things that will trip you up. Everything else is syntax.
1. FortiOS splits the CLI into four verbs, not two modes. Cisco has EXEC and config. FortiOS has config (change the config), get (read runtime state), show (read the config), and execute (do a thing right now, like ping or reboot). There is no enable. You log in already privileged, scoped by your access profile.
2. The firewall policy is the ACL, and it is global and ordered. You do not apply anything to an interface. You write one ordered list of policies and each one names a source interface and a destination interface. First match wins, and there is an implicit deny at the bottom, exactly like an ACL.
3. A FortiGate is a firewall, not a router that happens to filter. Two interfaces in the same VDOM do not pass traffic to each other just because a route exists. If there is no policy, there is no traffic. This is the single biggest cause of “but the route is right there” tickets from Cisco engineers.
4. You cannot type a raw IP address into a policy. FortiOS is object oriented. Addresses, services, and schedules are objects you create first and reference second. It feels like extra work on day one and saves you on day one hundred.
1.1 The command taxonomy
| What you are trying to do | FortiOS verb |
|---|---|
| Change the configuration (“conf t”) | config <tree> |
| Read the configuration (“show run”) | show |
| Read runtime state (“show ip route”, “show version”) | get |
| Do something now (“ping”, “reload”, “copy”) | execute |
| Deep debug (“debug ip packet”) | diagnose |
Field note: Internalize this table and 80 percent of your “what is the command for X” questions answer themselves. If it is state, it is get. If it is an action, it is execute. If it hurts performance, it is diagnose.
1.2 The concept map
| Cisco concept | FortiGate equivalent |
|---|---|
| Extended ACL applied to an interface | Firewall policy (config firewall policy) |
| object-group network / ASA object network | config firewall address, config firewall addrgrp |
| object-group service | config firewall service custom, config firewall service group |
| Zone-based firewall zone | config system zone |
| VRF | VDOM (full separation) or VRF (routing only, set vrf on the interface) |
| Security context (ASA) | VDOM |
| SVI (interface Vlan10) | VLAN interface (set type vlan, set vlanid 10) |
| Port-channel / EtherChannel | Aggregate interface (set type aggregate) |
| Tunnel interface / VTI | phase1-interface (route-based IPsec) |
| crypto map | Policy-based IPsec (legacy, avoid on new builds) |
| HSRP / VRRP | VRRP (under config system interface) |
| StackWise / VSS / ASA failover | FGCP HA cluster (config system ha) |
| ip helper-address | set dhcp-relay-service enable |
| ip nat inside source … overload | set nat enable inside the firewall policy |
| ip nat inside source static (inbound) | VIP (config firewall vip) |
| ip nat pool | IP pool (config firewall ippool) |
| Null0 route | set blackhole enable on a static route |
| Loopback0 | Interface with set type loopback |
| privilege level 15 | accprofile super_admin |
| access-class on line vty | set trusthost1..10 per admin |
| show tech-support | execute tac report |
| NetFlow | config system netflow (NetFlow v9 / IPFIX), config system sflow |
2. CLI Survival: Getting Around the Box
Start here. If you can navigate the tree and read the config, everything else is lookup.
2.1 Entering configuration
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: FortiOS has no global config mode. You descend into a specific tree, make changes, and come back out. The tree IS the mode.
2.2 The edit / next / end pattern
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This is the single most important pattern in FortiOS. “next” closes the object you are editing and keeps you in the tree. “end” closes the tree and commits. Forgetting “next” before “end” still works in most trees, but forgetting it in the middle of a multi-object edit will bite you.
2.3 Backing out without saving
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: There is no “reload in 5” safety net habit on FortiOS the way there is on IOS. “abort” is the closest thing to Ctrl+C with intent. If you have already typed “end”, it is live and saved.
2.4 Viewing the configuration
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “show” only prints values that differ from default. This is a feature, not a bug, but it means a setting you swear you configured may be invisible because it matches the default. “show full-configuration” prints everything, and it is enormous. Filter it.
2.5 Saving the configuration
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This is the change that gets people hurt. On IOS you can experiment freely and reload out of trouble. On FortiOS, “end” is “wr mem”. There is no unsaved state to abandon. Back up before you touch anything, and use config revisions on models with the flash space for them.
2.6 Filtering output
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “grep -f” is the one you will use constantly. It prints the entire configuration object containing the match, not just the matching line. That is the FortiOS answer to “show run | section”.
2.7 Version, uptime, and health
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “get system status” is your “show version”: serial number, firmware, build, HA status, VDOM mode, and license state in one screen. “diagnose sys top 5 20” refreshes every 5 seconds and shows the top 20 processes. Press “q” to quit, not Ctrl+C.
2.8 Ping and traceroute
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: FortiOS ping options are sticky. Set a source address for one test and it stays set for every ping in that session until you reset it. Engineers lose hours to this. Get in the habit of “execute ping-options reset” when you are done.
2.9 Reboot and shutdown
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: There is no scheduled-reload safety net. If you are changing management access remotely, have console or a second path first.
3. Admin Accounts and Management Access
Privilege levels become access profiles. VTY ACLs become trusted hosts. Everything else is close enough to feel familiar.
3.1 Creating a local admin
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: super_admin is the built-in “privilege 15”. prof_admin is read-write within a single VDOM. Build your own for anything narrower.
3.2 Privilege levels vs access profiles
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Access profiles are grouped by function, not by numbered level. Each group can be none, read, or read-write. This is far more granular than privilege levels and far less painful than IOS privilege command mapping.
3.3 Restricting management source addresses
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Trusted hosts are per admin account, not per line. If you leave trusthost1 at 0.0.0.0 0.0.0.0, that account is reachable from anywhere the interface allows. Set them on every account or none of them do any good, because an admin with no trusthost is a hole around the ones that have them.
3.4 Enabling management protocols
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This catches everyone. You do not turn on SSH globally, you allow it per interface with set allowaccess. And “set allowaccess” is a replace, not an append. Typing “set allowaccess ssh” on an interface that had “ping https ssh” leaves you with ssh only. Always type the full list.
3.5 TACACS+ and RADIUS admin authentication
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The wildcard admin object is the pattern. You are not creating a user, you are creating a rule that says “anyone this server authenticates gets this profile in this VDOM.” Local accounts still work as fallback if the server is unreachable.
3.6 Login banner
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The switch and the text are in two different places. Enabling the banner without setting the buffer gives you the Fortinet default text, which your auditor will not accept.
4. Interfaces
Physical interfaces are called port1, port2, and so on, or by their FortiOS names on larger boxes (x1, ha1, mgmt). They are up by default. There is no no shutdown.
4.1 Assigning an IP address
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Interfaces come up enabled. “set status up” is the default, so you rarely type it. “set alias” is your description. “set role” (wan, lan, dmz, undefined) only changes which fields the GUI shows you, but the GUI is unusable without it, so set it.
4.2 DHCP and PPPoE client
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “set defaultgw enable” is what installs the learned default route. “set distance 5” sets the AD of that learned route so you can prefer or deprefer it against a static.
4.3 Speed, duplex, and MTU
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Speed and duplex are one setting: 1000full, 100full, 10half, auto. And MTU needs mtu-override enable first, or “set mtu” is silently ignored. That silent ignore has cost me an hour more than once.
4.4 Loopbacks
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: A loopback on a FortiGate is a real interface for policy purposes. If you want to manage the box on it, you still need a policy allowing traffic to it, plus allowaccess. This is a common gotcha when moving BGP peering to loopbacks.
4.5 Link aggregation (LACP)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Member ports must have no IP, no VDOM assignment conflicts, and no references anywhere else before you can add them. FortiOS will refuse with an unhelpful error if port3 is referenced by so much as a stale policy. “diagnose sys checkused system.interface.name port3” tells you who is holding it.
4.6 Secondary addresses
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Note the capital IP in “secondary-IP”. FortiOS is case sensitive here and nowhere else that matters. Yes, it is annoying.
4.7 Zones (grouping interfaces for policy)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “set intrazone allow” means traffic between port2 and port3 needs no policy. The default is deny, which matches Cisco ZBF behavior. Zones are optional on FortiGate but they keep your policy table from exploding on a box with 20 VLANs.
4.8 Checking interface state
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “diagnose hardware deviceinfo nic port1” is your “show interfaces”: link state, speed, duplex, and every error counter the NIC driver exposes. This is where you find the CRC errors that explain why the customer thinks the firewall is slow.
5. VLANs and Switching
Here is the hard truth: a FortiGate is not a switch. It has no MAC address table in the normal sense, no VTP, no STP participation by default, and no “switchport” command. VLAN interfaces are router subinterfaces. If you need real switching, that is what FortiSwitch and FortiLink are for.
5.1 Creating a VLAN interface (the router-on-a-stick model)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This is the closest thing to a paradigm shift in this document. There is no trunk configuration. A physical port becomes a trunk the moment you create a tagged VLAN interface on it. The set of VLAN interfaces parented to that port IS the allowed VLAN list. Untagged traffic on that port hits the parent interface (port2) directly, which is your native VLAN.
5.2 Software switch (bridging ports together)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “set intra-switch-policy implicit” means ports in the switch talk to each other without a policy, which is what you expect from a switch. Set it to “explicit” and you need policies between members, which is occasionally useful and usually a support ticket. Software switches run in the CPU on most models. Hardware switches (config system virtual-switch on models that have them) do it in ASIC.
5.3 Managed FortiSwitch ports (the real answer)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: When a FortiSwitch is managed by the FortiGate over FortiLink, you configure switch ports from the FortiGate CLI. “set vlan” is the native/untagged VLAN (your access VLAN), “set allowed-vlans” is the tagged list (your trunk allowed list), and “set edge-port enabled” is portfast. Note it references the VLAN interface NAME, not the VLAN ID. That is the part that trips people up.
5.4 Verifying VLANs and MAC learning
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: If you are looking for “show mac address-table” on a bare FortiGate with no switch interfaces and no FortiSwitch, you will not find it, because there is no bridging happening. That is not a missing feature. That is the box telling you it is a router.
6. Firewall Policy (Your ACLs, Rebuilt)
This is where the two platforms diverge most and where the FortiGate is honestly better. Instead of an ACL per interface per direction, you get one ordered, stateful, named, logged, object-based list. Same first-match-wins logic, same implicit deny, far better visibility.
6.1 Address objects (do this first)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Subnet masks, not wildcard masks. FortiOS accepts “10.1.1.0 255.255.255.0” or “10.1.1.0/24” and normalizes to the former. If you type a wildcard mask out of habit you will build an object for a subnet nobody has ever heard of, and it will not error.
6.2 Service objects
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: FortiOS ships with a large library of predefined services (HTTP, HTTPS, DNS, SSH, ALL_TCP, and so on). Check “show firewall service predefined” before building your own. Note the source port syntax: “set tcp-portrange 8443:1024-65535” is dest:source, which is backwards from what most people guess.
6.3 The policy itself
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Note what you get for free: it is stateful (no reflexive ACL), NAT is a checkbox, and inspection profiles bolt straight on. “edit 0” tells FortiOS to auto-assign the next policy ID. Also note there is no “in” or “out”. Direction is implied by srcintf and dstintf, and the policy only matches the first packet of a session.
6.4 Policy order and moving rules
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Read that first line again. The policy ID is a database key, not a sequence number. Policy 47 can sit above policy 3. This is the single most dangerous assumption a Cisco engineer brings to a FortiGate: you cannot look at the IDs and know the order. Use the GUI list or the CLI order, and always “move” explicitly.
6.5 Deny, log, and the implicit rule
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Turn on fwpolicy-implicit-log in every deployment. It is off by default, and without it your “why is this blocked” investigations are blind. It is the equivalent of adding “deny ip any any log” to the bottom of every ACL, except you only type it once.
6.6 Testing what a policy will do
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “diagnose firewall iprope lookup” is the FortiOS packet-tracer, and it is the fastest way to answer “which rule is catching this”. The argument order is srcip srcport dstip dstport protocol interface, where protocol is the IP protocol number (6 for TCP, 17 for UDP, 1 for ICMP). For a full trace of what happens to a packet, see the debug flow in section 12.
6.7 Finding what references an object
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This has no Cisco equivalent and it is genuinely great. When FortiOS refuses to let you delete something because it is “in use”, this tells you exactly which policy, route, or VPN is holding the reference.
7. NAT
FortiOS gives you two NAT modes. Policy NAT (the default) puts NAT inside the firewall policy. Central NAT (opt-in) gives you a separate NAT table that looks much more like the ASA model. Pick one per VDOM. You cannot mix them.
7.1 Outbound PAT (interface overload)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: One checkbox. No “ip nat inside” on interfaces, no NAT ACL, no direction tagging. The policy already knows the source, the destination, and the egress interface, so it has everything it needs.
7.2 Outbound NAT to a pool
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: IP pool types: overload (PAT to a range), one-to-one (no PAT), fixed-port-range, port-block-allocation (for CGNAT and log reduction). If the pool addresses are not on the egress interface subnet, you need the upstream router to route them to you, or proxy-arp via “set arp-reply enable”.
7.3 Inbound static NAT with port forwarding
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The trap: in the inbound policy, dstaddr is the VIP object, not the internal server address. FortiOS does the destination NAT before the policy lookup on the real address, so you reference the VIP. Also, a VIP with a public extip auto-answers ARP for that address unless you set arp-reply disable. That is usually what you want and occasionally a disaster if the address belongs to something else.
7.4 One-to-one static NAT (all ports)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Leave portforward disabled and the VIP is a full one-to-one static NAT. Bidirectional: the VIP handles inbound. For the outbound half to use the same address, either enable “set nat-source-vip enable” on the VIP or write an outbound policy with a matching IP pool.
7.5 NAT exemption / no-NAT
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This is where policy NAT shines. There is no NAT exemption because there is no global NAT. Each policy decides for itself. Order the VPN policy above the internet policy and you are done. No twice-NAT ordering puzzles.
7.6 Central NAT (the ASA-style option)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Enabling central NAT strips the nat setting out of every existing policy. It is a one-way door in practice: turn it on during the build, not during a maintenance window on a live box. Use it when you need NAT decisions independent of policy decisions. Otherwise policy NAT is simpler and it is what the documentation assumes.
7.7 Verifying NAT
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: There is no separate translation table to display. NAT state lives in the session table. In “diagnose sys session list”, the “hook=post act=snat” line shows source NAT and “hook=pre act=dnat” shows destination NAT, with the pre and post addresses right there. Always set a filter first or you will dump a million sessions to your console.
8. Static Routing
8.1 Default and static routes
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The “set device” is mandatory and it is the thing Cisco engineers forget. A FortiOS static route is interface-plus-gateway, always. Also: the sequence number in “edit 1” is just an ID, it has nothing to do with preference. Distance and priority do that.
8.2 Distance vs priority (a FortiOS-only concept)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This is the FortiOS concept with no Cisco analog, and it matters. Distance decides which route enters the routing table. Priority is a tiebreaker among routes that already made it in with the same distance: both routes are in the table, but only the lower priority is used for new sessions. Different distances give you a floating static. Same distance plus different priorities gives you a primary and a hot standby that is already installed. Same distance plus same priority gives you ECMP.
8.3 Link monitoring / route tracking
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Link monitor is IP SLA plus track plus the route statement, all in one object. “set update-static-route enable” pulls every static route out of the table when the monitor fails, which is exactly what “track” does on IOS. Note interval is in milliseconds on 7.x (it was seconds on 6.x), so 500 means half a second and not eight minutes.
8.4 Policy-based routing
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Policy routes are evaluated BEFORE the routing table, in ID order, and they win. If a customer swears their static route is being ignored, check “diagnose firewall proute list” before you check anything else. Also, “set action deny” on a policy route makes it an exemption, sending that traffic back to normal routing.
8.5 Reading the routing table
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “get router info routing-table all” is your “show ip route”. “routing-table database” is the RIB including routes that lost, which is your “show ip route database”. And remember: even a perfect routing table means nothing without a firewall policy. The route says where, the policy says whether.
8.6 VRF
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: FortiOS VRFs are numbered (0 to 251 on 7.x), not named, and VRF 0 is the default. They separate routing only, not policy or objects. For real separation with independent admins, policies, and logging, you want a VDOM, which is the ASA security context model.
9. OSPF
FortiOS OSPF is a Quagga derivative, so the show output will look familiar to anyone who has used Zebra. Two things change: areas are always dotted decimal, and network statements use subnet masks instead of wildcard masks.
9.1 Basic OSPF process
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Three things to burn in. One: there is no process ID, there is one OSPF instance per VDOM. Two: “area 0” must be typed as “0.0.0.0”, every time. Three, and this is the painful one: there is no “passive-interface default”. You must enumerate every passive interface by name, and “set passive-interface” is a replace, not an append. Adding VLAN30 means retyping VLAN10 and VLAN20 as well. On a box with 40 VLANs this is genuinely awful, and no, there is no shortcut.
9.2 Per-interface OSPF settings
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The ospf-interface object has a name of its own (“to-core”) and then points at the real interface with “set interface”. That indirection surprises people. The name is just a label, so make it meaningful. Setting network-type point-to-point on your transit links is as good an idea here as it is on IOS.
9.3 OSPF authentication
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Options are none, text, md5, and (on 7.2+) message-digest with SHA. Set it on the ospf-interface, not the area, if you want per-link control.
9.4 Stub, NSSA, and summarization
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Same semantics as IOS. “set no-summary enable” on a stub area makes it totally stubby. summary-address is for external routes on an ASBR, area range is for inter-area on an ABR, exactly as you expect.
9.5 Redistribution and default origination
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Redistribute blocks are fixed names in quotes: “connected”, “static”, “rip”, “bgp”, “isis”. You cannot create new ones, you enable the ones that exist. Note there is no “subnets” keyword because FortiOS never had the classful behavior that made it necessary.
9.6 OSPF verification and debugging
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The debug pattern is always three steps: pick the module, set the level, then “diagnose debug enable” to actually send output to your terminal. Forgetting the third step is the most common reason people think FortiOS debugs are broken. And always “diagnose debug reset” when you are done, because those filters are sticky and will confuse the next engineer.
10. BGP
If you know IOS BGP you know FortiOS BGP. Same attributes, same path selection, same route maps. The syntax is flatter: there is no address-family submode for basic IPv4 unicast, and neighbor settings live inside the neighbor object instead of being repeated on twelve separate lines.
10.1 Basic eBGP peering
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Note “log-neighbour-changes” with the British spelling. Fortinet is inconsistent about this and it will fail your tab completion. Also note there is no “activate”: IPv4 unicast is on by default. IPv6 peers go in “config neighbor” too but use “config network6” and route-map6 variants.
10.2 iBGP with loopbacks
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Same rules apply: you need a route to the loopback (IGP or static), and the loopback needs to permit the BGP session. On FortiGate that last part is real, because you may need a local-in policy or the right allowaccess if you have hardened the box.
10.3 eBGP multihop
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Enabling ebgp-enforce-multihop without setting a TTL defaults you to 255, which works but is sloppy. Set the TTL to the real hop count.
10.4 Timers, dampening, and prefix limits
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Watch the naming: the global timer is “keepalive-timer” and the per-neighbor one is “keep-alive-timer” with a hyphen. This is not a typo in this document. It is a typo in FortiOS, and it has survived for a decade.
10.5 Prefix lists
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The “unset ge / unset le” on an exact-match default route entry is not optional decoration. If ge or le are left at their inherited values you will match more than you meant to. This is the number one cause of “my default-route-only filter is leaking the full table” tickets.
10.6 Route maps
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The pattern is mechanical: Cisco “match X” becomes “set match-X”, and Cisco “set Y” becomes “set set-Y”. Yes, “set set-local-preference” reads like a stutter. You get used to it. Rule IDs are your sequence numbers, and like Cisco they are evaluated in order with an implicit deny at the end.
10.7 BGP verification
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “received-routes” only works if you enabled “set soft-reconfiguration enable” on the neighbor, exactly like IOS. Turn it on for every peer where memory allows. The 90 seconds it costs you at build time saves an hour during an outage.
11. IPsec VPN
FortiOS route-based IPsec is Cisco VTI. If you build tunnels with VTIs today, you will be at home immediately. If you still build crypto maps, this is a good moment to stop, because FortiOS policy-based VPN is a legacy mode that Fortinet is steadily deprecating.
11.1 Site-to-site IKEv2 (route-based / VTI)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Four things worth flagging. One: phase1-interface (not phase1) is what makes it route-based, and it creates a real interface named after the phase1. Two: with src-subnet and dst-subnet at 0.0.0.0/0, the selectors are wide open and routing decides what crosses, which is exactly VTI behavior. Three: the tunnel IP uses a /32 with a separate “set remote-ip”, which is odd but correct. Four, and this is the one people miss: you still need firewall policies in both directions with the tunnel as an interface. The tunnel coming up does not mean traffic flows.
11.2 The firewall policies the tunnel needs
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Two policies, not one. FortiOS matches on the first packet of a session, so a session initiated from the branch needs its own policy. This is the number one reason a Cisco engineer sees an established tunnel with zero traffic and starts blaming phase 2.
11.3 Dial-up / dynamic peers
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “set type dynamic” is the virtual-template equivalent: one phase1 accepts many peers. “set add-route enable” installs routes learned from the peer selectors automatically. For anything at scale, this is where you stop hand-rolling and start looking at ADVPN, which is FortiOS DMVPN with a better shortcut mechanism.
11.4 VPN verification and debugging
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Learn this five-line debug sequence and you can troubleshoot any FortiGate VPN in the field. The log-filter is essential: on a hub with 200 tunnels, “diagnose debug application ike -1” without a filter will melt your session and possibly the CPU. Filter first, every time.
12. High Availability
12.1 First-hop redundancy (HSRP / VRRP)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: FortiGate does VRRP, not HSRP, so if you are replacing one of a pair of Cisco routers you have to convert both ends. VRRP on FortiGate is mostly used to interoperate with non-Fortinet gear. Between two FortiGates you want FGCP instead, which is far better.
12.2 Chassis / cluster HA (FGCP)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Key differences from ASA failover. “set override disable” is the default and it means the cluster does NOT preempt, which surprises everyone: after a failback the old secondary stays primary. That is usually correct behavior and occasionally not what the customer wants. “set monitor” is your interface tracking. And “set priority” only matters if override is enabled or if you are comparing at boot time, because uptime wins first by default.
12.3 HA operations
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “execute ha manage 1 admin” is the command that makes cluster life bearable: it SSHes to the other member over the heartbeat link from your existing session. And “diagnose sys ha checksum show” is your first stop when the cluster is out of sync, because a checksum mismatch tells you exactly which config tree diverged.
13. DHCP and System Services
13.1 DHCP server
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: There is no excluded-address concept because you define the range you want to hand out instead of the subnet minus exclusions. Lease time is in seconds, not the days/hours/minutes triplet. Reservations go in “config reserved-address” inside the same server object.
13.2 DHCP relay
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Mind the quoting: dhcp-relay-ip takes quoted, space-separated addresses. And remember that relayed DHCP is traffic through the box, so the relay needs a route to the server and, if the server is across a VPN, a policy.
13.3 NTP, DNS, hostname, and timezone
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: On FortiOS 7.4.4 and later the timezone accepts names like “America/New_York”. On older builds it is a numeric ID and you find yours with “set timezone ?”. Daylight saving is handled by the zone database, so there is no summer-time command.
13.4 Syslog
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: You get four syslog server slots (syslogd, syslogd2, syslogd3, syslogd4). The filter is a separate tree from the setting, and forgetting to enable forward-traffic in the filter is why your SIEM sees system events but no firewall logs. Also worth knowing: logging is only as good as the “set logtraffic all” on your policies.
13.5 SNMP
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: That last block is the one everybody forgets. SNMP is configured, the community is right, the ACL is right, and it still does not poll, because “snmp” is not in the interface allowaccess list. Check it first, always.
14. Troubleshooting: The Commands That Matter at 2 a.m.
If you read only one section of this guide, read this one. FortiOS troubleshooting is genuinely more powerful than IOS once you know the four commands below, and genuinely opaque until you do.
14.1 Packet capture
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The filter is standard tcpdump/BPF syntax, so everything you know from tcpdump works verbatim. Verbose 4 is the sweet spot for “which interface did this arrive on and where did it go”. For a real pcap, use verbose 6 and pipe the output through the fgt2eth.pl script Fortinet publishes, or just use the GUI packet capture, which hands you a .pcap directly.
14.2 Debug flow (the killer feature)
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: This is the best troubleshooting tool on any firewall I have used, and it has no real IOS equivalent. It follows a live packet through the entire stack and prints, in plain English, the route it picked, the policy it matched or why it did not, the NAT it applied, and where it was dropped. “iprope_in_check() check failed on policy 0, drop” tells you the implicit deny caught it. Nothing on IOS tells you that. Learn the sequence, and always reset the filter afterward.
14.3 Sessions, ARP, and MAC
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: Set a filter before you list, or you will dump the entire session table to your terminal. On a busy box that is minutes of scrollback and a very annoyed customer. And note that “diagnose sys session clear” clears what matches the CURRENT filter, so a stale filter from an hour ago means you clear the wrong sessions. Clear the filter when you finish.
14.4 CPU, memory, and conserve mode
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “diagnose hardware sysinfo conserve” has no Cisco equivalent and it is the first thing to check when a FortiGate starts behaving strangely under load. Conserve mode is the box protecting itself by dropping or passing traffic unscanned once memory crosses a threshold, and it explains a huge share of the “the firewall randomly broke” tickets.
14.5 Logs and support bundles
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: “execute tac report” runs the entire diagnostic battery Fortinet TAC will ask for. Run it before you open the ticket, not after they ask, and you will save yourself a full support cycle.
14.6 Turning debugs off
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: There is no single “undebug all” that catches everything, and filters survive your SSH session. “diagnose debug reset” plus “diagnose debug disable” covers most of it, and “diagnose debug info” shows you what is still running. Leaving an IKE debug enabled on a production hub is a career-limiting move. Check before you log out.
15. Config Management and Upgrades
15.1 Backup and restore
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: A plain backup does not include passwords, VPN PSKs, or certificates in a restorable form unless you either set a backup password or enable private-data-encryption. A restore of an unencrypted config onto a different serial number gives you a working config with dead VPNs. Test your restores.
15.2 Firmware upgrade
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: FortiOS has no boot system statement and no image selection. There are two firmware partitions and the box flips between them. Always check the official upgrade path before you jump versions, because FortiOS will happily let you install a build that requires an intermediate hop and then hand you a mangled config. On an HA pair, the upgrade rolls through the cluster automatically.
15.3 Factory reset and recovery
| Cisco IOS / IOS-XE / ASA | FortiGate / FortiOS |
|---|---|
|
|
Field note: The maintainer account is the ROMMON equivalent and it is worth knowing about before you need it. It requires physical console access and a power cycle, so it is not a remote hole, but hardened environments disable it with “config system global / set admin-maintainer disable”. Do that only if you are certain about your console procedures.
16. The Gotcha List
These are the things that cost Cisco engineers real hours on their first FortiGate. None of them are in the release notes.
– There is no write memory and no unsaved state. Typing endwrites to flash. If you are used to experimenting freely and reloading out of trouble, that safety net is gone. Back up first.
– set allowaccess is a replace, not an append. Typing set allowaccess ssh on the interface you are managing the box from, when it previously had ping https ssh, is how you lock yourself out of a production firewall from 1,200 miles away.
– The policy ID is not the evaluation order. Policy 47 can sit above policy 3. You cannot read the order from the IDs. Ever.
– A route is not permission. The routing table tells the box where, the policy tells it whether. Both must agree. Two interfaces in the same subnet on the same box still will not talk without a policy.
– Policy routes and SD-WAN rules beat the routing table. If your static route “is not working”, check diagnose firewall proute list before you check anything else.
– Subnet masks everywhere, never wildcard masks. A wildcard mask typed from habit will not error. It will just silently build an object for a network that does not exist.
– show hides defaults. If you cannot find the setting you configured, it probably matches the default. Use show full-configuration and filter it.
– OSPF has no passive-interface default, and set passive-interface replaces the whole list. Adding one interface means retyping all of them.
– OSPF area 0 must be typed as 0.0.0.0. Always. There is no shorthand.
– Ping options are sticky. Set a source address once and every subsequent ping in that session uses it until you execute ping-options reset.
– Session filters are sticky too, and diagnose sys session clear clears whatever the current filter matches. A forgotten filter from an hour ago will clear the wrong sessions.
– An IPsec tunnel being up means nothing. You still need firewall policies in both directions. This is the number one false alarm from Cisco engineers on FortiGate VPNs.
– SNMP will not poll without snmp in the interface allowaccess list, no matter how perfect the rest of the config is.
– set mtu is silently ignored unless you set mtu-override enable first.
– HA does not preempt by default (set override disable). After a failback the old secondary stays primary. That is correct, and it will still generate a ticket.
– The implicit deny is not logged by default. Turn on set fwpolicy-implicit-log enable in every build.
– Enabling central NAT strips the nat setting from every existing policy. Decide during the build, not during a change window.
– VDOMs change the command tree. If a command does not exist, check whether you are in config global or inside a VDOM. Many settings are global-only and many are VDOM-only.
– Aggregate member ports must be referenced by nothing else. diagnose sys checkused system.interface.name port3 tells you who is holding it.
– The debug output goes nowhere until you type diagnose debug enable. This is the third step people skip, and then they conclude FortiOS debugs are broken.
17. The One-Page Cheat Sheet
Print this part. Tape it to the monitor. The rest of the guide is reference; this is the muscle memory transplant.
17.1 Daily driver commands
| Cisco IOS | FortiOS |
|---|---|
| configure terminal | config <tree> |
| exit / end | next (close object) / end (commit tree) |
| Ctrl+Z with regret | abort |
| show running-config | show |
| show running-config all | show full-configuration |
| show run | section router bgp | show router bgp |
| show run | include vlan | show | grep vlan |
| show run | section interface Gi0/1 | show | grep -f port1 |
| write memory | (nothing: end saves it) |
| copy run tftp: | execute backup config tftp <file> <ip> |
| reload | execute reboot |
| show version | get system status |
| show ip interface brief | get system interface physical |
| show interfaces Gi0/1 | diagnose hardware deviceinfo nic port1 |
| show ip route | get router info routing-table all |
| show ip route 8.8.8.8 | get router info routing-table details 8.8.8.8 |
| show ip arp | get system arp |
| show ip ospf neighbor | get router info ospf neighbor |
| show ip bgp summary | get router info bgp summary |
| clear ip bgp * soft | execute router clear bgp all soft in |
| show crypto ipsec sa | diagnose vpn tunnel list |
| show crypto ikev2 sa | diagnose vpn ike gateway list |
| show ip dhcp binding | execute dhcp lease-list |
| show access-lists | show firewall policy |
| show ip nat translations | diagnose sys session list (after a filter) |
| show conn (ASA) | diagnose sys session list (after a filter) |
| show processes cpu sorted | diagnose sys top 5 20 |
| show logging | execute log display (after execute log filter) |
| show tech-support | execute tac report |
| ping 8.8.8.8 | execute ping 8.8.8.8 |
| traceroute 8.8.8.8 | execute traceroute 8.8.8.8 |
| monitor capture / capture | diagnose sniffer packet <intf> “<bpf>” 4 0 a |
| debug ip packet | diagnose debug flow (see 14.2) |
| packet-tracer (ASA) | diagnose firewall iprope lookup … |
| undebug all | diagnose debug disable + diagnose debug reset |
| show standby brief | diagnose sys vrrp list |
| show failover (ASA) | get system ha status |
| terminal length 0 | config system console / set output standard |
18. Closing: What to Do This Week
You will not absorb this by reading it. Nobody ever learned a CLI from a table. Do these five things instead, in this order, on a lab VM or a spare 40F, and the syntax will stop being syntax and start being reflex.
1. Build one VLAN interface, one address object, and one policy with NAT. Get a ping to 8.8.8.8. That single exercise teaches you edit/next/end, the object model, and the policy model in about ten minutes.
2. Break it on purpose. Delete the policy and leave the route. Watch the traffic die while get router info routing-table all still looks perfect. That is the lesson that makes FortiGate click.
3. Run diagnose debug flow on the broken traffic and read the output. When you see iprope_in_check() check failed on policy 0, drop, you will understand why this tool is better than anything on IOS.
4. Build a route-based IPsec tunnel to anything, even another lab FortiGate. Then forget the reverse policy on purpose and watch the tunnel sit up with zero traffic. Now you have made the mistake in a lab instead of in a maintenance window.
5. Type diagnose sys checkused system.interface.name port3 and delete something that is in use. Learning how FortiOS talks about references saves you more time than any other single command.
The FortiGate is not harder than IOS. It is opinionated in different places. It is stricter about objects, looser about interfaces, better at telling you why it dropped your packet, and completely unforgiving about end. Once the grammar lands, most Cisco engineers I have worked with are productive inside a week and prefer the troubleshooting tooling inside a month.
Recent posts
-
-
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
-
You have twenty years of muscle memory. You type... Full Story
-
I deployed thousands of ASA firewalls when I was... Full Story
-
Have you ever wanted to do some testing on... Full Story