Firewall platforms

One firewall model, many vendors

I have designed and built firewall estates on Cisco, Palo Alto, Fortinet and Check Point, and I work to the same model on all of them. This page shows how each platform handles a packet, how I keep rule bases clean, and how I find a drop fast.

  • Cisco firewalls
  • Palo Alto
  • FortiGate
  • Juniper SRX
  • Check Point
  • Address translation
  • High availability
  • Rule hygiene
A firewall pair with sessions kept in sync Users reach the internet through the active firewall. The standby firewall receives a copy of every session over the HA link, ready to take over. An unsolicited packet from the internet is dropped at the active firewall. Usersinside Firewall Aactive Firewall Bstandby Internetoutside session sync one policy, two firewalls, sessions in sync
Live view · the standby keeps a copy of every session
Overview

What every stateful firewall does to a packet

Underneath the vendor names, every stateful firewall follows the same steps. The first packet of a flow takes the slow path through routing, policy and NAT (network address translation). Every later packet matches the session and takes the fast path. Step through one TCP (Transmission Control Protocol) connection. The model is the same on a Cisco ASA (Adaptive Security Appliance) or FTD (Secure Firewall Threat Defense), Palo Alto, FortiGate or Juniper SRX.

The slow path and the fast path through a stateful firewall A client's first packet enters the firewall and its zone is found. There is no session yet, so the firewall routes it to find the egress zone, checks the policy top down, applies NAT and writes a session. Inspection identifies the application. The server's reply matches the session and returns on the fast path. When the connection closes or goes idle, the session is removed. STATEFUL FIREWALL Clientinside zone Serveroutside zone Ingress Session Route Policy NAT Inspect TCP SYN arrives on the inside interface No session yet, so it takes the slow path Route lookup decides the egress zone Rule 12: inside to outside, HTTPS, allow (first match) Source NAT applied and session written Application identified: the rule is checked again Reply matches the session: fast path back FIN, reset or idle timer removes the session Session table no match: first packet of a new flow 10.1.1.20:50112 to 203.0.113.10:443 · TCP source NAT 198.51.100.5:40001 · SYN seen, openingsource NAT 198.51.100.5:40001 · established session removed after FIN

Swipe sideways to see the whole diagram.

Step 1
  1. A user's TCP SYN (synchronise), the first packet of a new connection, arrives on the inside interface. The interface decides the source zone, and early checks such as anti spoofing and DoS (denial of service) screens run here.

  2. The firewall looks for an existing session with the same five values: source and destination IP (Internet Protocol) address, source and destination port, and protocol. There is none, so this packet takes the slow path.

  3. A route lookup on the destination finds the egress interface, and so the destination zone. Where destination NAT applies, vendors do this step in different orders, which is the root of most vendor differences.

  4. The rules for that zone pair are read top down and the first match wins. If nothing matches, the implicit deny at the end drops it. Here rule 12 allows HTTPS (secure web traffic) from inside to outside. I always add an explicit deny that logs.

  5. The packet is allowed, so NAT is applied and a session is written with both the original and translated addresses. From now on the session, not the rule base, decides what happens to this flow.

  6. On a next generation firewall (NGFW), inspection follows. The application is identified a few packets in, here as web traffic over TLS (Transport Layer Security), the rule is checked again with that knowledge, and IPS (intrusion prevention) and malware checks run on traffic that is allowed.

  7. The server's reply matches the session, so NAT is reversed and it goes straight back to the client with no rule lookup. That is why return traffic needs no rule, and why a reply that arrives at a different firewall is dropped.

  8. A FIN (finish) or reset ends the session, or an idle timer removes it. Idle timers vary by vendor: typically 30 to 60 minutes for TCP, and from a few seconds to a few minutes for UDP (User Datagram Protocol) and ICMP (Internet Control Message Protocol). Long lived database or BGP (Border Gateway Protocol) sessions may need a longer timer.

IdeaCisco ASA and FTDPalo AltoFortiGateJuniper SRXCheck Point
Trust areasSecurity levels (ASA), zones (FTD)ZonesInterfaces or zonesSecurity zonesNetwork objects and topology
Virtual firewallsSecurity contextsVirtual systems (vsys)VDOMs (virtual domains)Logical and tenant systemsVirtual systems (VSX)
Central managerSecurity Cloud Control or CSM (Cisco Security Manager) for ASA; FMC (Firewall Management Center) for FTDPanoramaFortiManagerSecurity DirectorSecurity Management Server
Change modelImmediate on ASA, deployed from FMC on FTDCandidate, then commitImmediateCandidate, commit and rollbackEdit, then install policy
Packet order

Where NAT sits against the policy

The biggest difference between vendors is the order of NAT and the policy check, because it decides which address a rule must use. Pick a platform to see its path. Orange stages translate addresses; pink stages make the allow or deny decision.

Labels in the figure: ACL is an access control list, ARP the Address Resolution Protocol, and DNAT and SNAT are destination and source NAT. VIP is a virtual IP address, ALG an application layer gateway, DPI deep packet inspection and SMC the Forcepoint Security Management Center.

Packet processing order on eight firewall platforms For each platform a row of stages shows the order a new connection passes through. Cisco ASA reverses destination NAT before the ACL, so rules use real addresses. Palo Alto looks up NAT first but applies it at egress, so rules use original addresses with the post NAT zone. FortiGate translates to the VIP before routing. Juniper SRX runs destination NAT before the policy and source NAT after it. Check Point matches the rule base on the original packet. SonicWall and Forcepoint match access rules on original addresses before NAT. Cisco ASAIngressinterfaceSessionlookupUN-NATdestinationRouteegressACLreal addressNATsourceInspectprotocolsEgressARP, sendPolicy uses: the real (untranslated) addressNAT: object NAT and manual NAT in three sectionsProve a drop: packet-tracer, capture trace, show asp drop Cisco FTDIngressLinaSessionlookupUN-NATdestinationRouteegressACL+ prefilterNATsourceSnortapp, IPSEgresssendPolicy uses: the real address, prefilter rules includedTwo engines: Lina for state and NAT, Snort for app and threatProve a drop: packet-tracer with Snort verdict, system support trace Palo AltoIngresszoneSessionlookupRoutedecides zoneNAT rulelookup onlySecurityruleSessioncreatedApp-IDContent-IDEgressNAT appliedPolicy uses: original addresses, post NAT destination zoneNAT rules match original addresses and are applied at egressProve a drop: test security-policy-match, show session, counters FortiGateIngresschecksDNATVIPRouteegressPolicyID in logsSessioncreatedInspectflow, proxySNATsourceEgresssendPolicy uses: the VIP object for published serversDestination NAT before routing, source NAT on the way outProve a drop: diagnose debug flow ("policy 0" is the implicit deny) Juniper SRXScreensDoS checksStatic NATinboundDest NATpoolsRoutezonePolicyzone pairRev staticNATSource NATrulesSessionALGsPolicy uses: translated destination, original sourceNAT rule sets run in a fixed order around the policyProve a drop: show security match-policies, flow traceoptions Check PointInboundiAnti spooftopologyRule baseoriginalDest NATclient sideRouteegressOutboundoSource NATserver sideEgressOPolicy uses: the original packet, before any NATDestination NAT on the client side by default, source NAT outboundProve a drop: fw ctl zdebug + drop, fw monitor SonicWallIngresszoneNAT policylookupRouteegress zoneZone pairlookupAccessruleSessioncreatedDPIservicesEgressNAT appliedPolicy uses: the original, public address with the post NAT zoneNAT policies live in their own table, matched by priorityProve a drop: Packet Monitor with the drop reason ForcepointIngressengineAccessrules firstNATrules nextInspectdeepProxyoptionalSessioncreatedRouteegressEgresssendPolicy uses: original addresses, because access rules run firstSidewinder proxies can rebuild a connection for high assuranceProve a drop: the SMC logs view, sg tools on the engine

Swipe sideways to see the whole diagram.

Cisco ASA. Since software 8.3, destination NAT is reversed before the ACL check, so access lists use the real, inside address of a published server. NAT lives in one table read in three sections: manual NAT, then object NAT, then manual NAT placed after object NAT.

Cisco FTD (Secure Firewall Threat Defense). One image with two engines: Lina, the ASA derived engine for routing, state and NAT, and Snort for application control, intrusion and file checks. Prefilter rules sit at the top of the same Lina access list, checked after destination NAT is reversed, so they use real addresses too. Lina builds the translation and the connection before Snort gives its verdict. A drop can come from either engine, and the FMC events show which.

Palo Alto. The NAT rule is looked up early to find the post NAT zone, but applied on the way out. Security rules therefore use the original addresses with the post NAT destination zone. A published server's rule points at its public address with the DMZ (demilitarised zone) as the zone.

FortiGate. Destination NAT through a VIP (virtual IP) object happens before routing, and the policy names the VIP. Source NAT is applied per policy on the way out, or from a central SNAT table if central NAT mode is on. The policy ID appears in every log line.

Juniper SRX. Screens run first, then static and destination NAT, then the route lookup and the policy, which matches the translated destination and the original source. Source NAT comes last. It is the opposite habit to Palo Alto, which catches people moving between them.

Check Point. The rule base matches the original packet on the way in. Destination NAT happens on the client side by default and source NAT on the way out. SecureXL accelerates established flows, so debugging sometimes means turning acceleration off for one flow.

SonicWall. SonicWall publishes no detailed packet flow, so this order follows how its rules behave. The zone pair needs the egress zone, which comes from a route lookup on the translated address, while inbound rules for a published server reference the public address object. NAT policies sit in their own table, matched by priority. The Packet Monitor shows forwarded, consumed and dropped packets with the reason.

Forcepoint NGFW. Access rules are processed first and NAT rules after, so access rules use original addresses. For high assurance networks, Sidewinder proxies can terminate and rebuild a connection, checking the protocol strictly on the way. Policy is always edited in the SMC (Security Management Center) and installed to the engines.

Animation

The same ideas on every platform

PlatformPolicy modelNAT and the address a rule usesHigh availabilityManagementProves a drop
Cisco ASAInterface ACLs plus a global ACL, security levels 0 to 100Object and manual NAT; ACLs use the real addressFailover pair with failover and stateful links; clustering on larger modelsCLI (command line), ASDM (Adaptive Security Device Manager) or Security Cloud Controlpacket-tracer, capture with trace, show asp drop
Cisco FTDAccess control policy in layers: prefilter, access, intrusion, fileAs ASA; the real addressHigh availability (HA) pair or clusterFMC, FDM (Firewall Device Manager) or Security Cloud Controlpacket-tracer with the Snort verdict, system support trace
Palo AltoZone based rules with App-ID and User-IDNAT rules separate; original addresses, post NAT zoneHA1 and HA2 links for active and passive, HA3 for active and activePanoramatest security-policy-match, show session all, global counters
FortiGatePolicy by interface or zone pair, with a policy IDVIP for destination NAT; the policy names the VIPFGCP (FortiGate Clustering Protocol) active and passive or active and active; session pickup off by defaultFortiManager and FortiAnalyzerdiagnose debug flow, the sniffer
Juniper SRXZone pair policies, then global policiesDestination NAT first; translated destination, original sourceChassis cluster with control and fabric linksSecurity Directorshow security match-policies, flow traceoptions
Check PointRule base in ordered and inline layersAutomatic or manual NAT; rules match the original packetClusterXL high availability or load sharing, with state syncSecurity Management Server and SmartConsolefw ctl zdebug + drop, fw monitor
SonicWallAccess rules per zone pairSeparate NAT table; inbound rules use the public addressActive and standby, stateful on supported modelsNetwork Security ManagerPacket Monitor
Forcepoint NGFWAccess rules, then NAT rules, then inspectionAccess rules use original addressesClusters with CVI (cluster virtual IP) and NDI (node dedicated IP) addressesSMCSMC logs, sg-status and other sg tools
Vendor detail

What I check first on each platform

The model is the same everywhere, but each platform has its own habits and its own best tool for proving what happened. These are the facts and commands I reach for first. The addresses are examples.

Cisco ASA and ASAv

  • Every interface needs a name and a security level from 0 to 100. Without an ACL, higher to lower is allowed and lower to higher is denied; same level traffic needs same-security-traffic permit inter-interface. Once an ACL is applied, it decides.
  • NAT is one table in three sections: manual (twice) NAT in order, then object NAT sorted by the ASA, then manual NAT placed after. show nat detail shows the section and the hits.
  • ACLs use object groups, which expand into single entries: 20 sources and 20 destinations make 400 lines. object-group-search access-control saves the memory on large rule bases.
  • Multiple context mode splits one ASA into virtual firewalls, and is needed for active and active failover.
  • The ASAv runs the same code on VMware. Its licence sets the throughput tier, and failover needs the port group security settings from the deployment guide.
TaskCommand
Simulate a flowpacket-tracer input inside tcp 10.1.1.20 50000 203.0.113.10 443 detailed
Capture with the decisioncapture CAPIN interface inside trace match ip host 10.1.1.20 host 203.0.113.10
Drop reasonsshow asp drop and capture ASP type asp-drop all
Sessions and NATshow conn address 10.1.1.20, show xlate
Failovershow failover, show failover history
Image checkverify /sha-512 disk0:/IMAGE.SPA
NAT

Three NAT jobs on every edge

Most firewall NAT comes down to three jobs: letting many users share one public address with PAT (port address translation), publishing a server, and leaving VPN traffic untranslated. Switch between them and watch the translation table.

Source NAT, a published server and identity NAT With port address translation two inside PCs share one public address, told apart by port. To publish a server, the public address and port are translated to the server's private address in the DMZ. For VPN traffic to a branch, identity NAT matches the traffic and leaves the addresses unchanged, so the internet PAT rule does not catch it. Laptop10.1.1.20 Laptop10.1.1.21 Web serverDMZ 172.16.1.10 FirewallNAT table Internet203.0.113.50 Branch VPN10.2.0.0/16 10.1.1.20:50112 becomes 198.51.100.5:4000110.1.1.21:50113 becomes 198.51.100.5:40002 PAT: many users, one public address 198.51.100.10:443 becomes 172.16.1.10:443static, so it works in both directions Publishing a server through static NAT 10.1.1.0/24 to 10.2.0.0/16: no translationmatched before the internet PAT rule Identity NAT keeps VPN traffic untouched

Swipe sideways to see the whole diagram.

Port address translation. Inside users share one public address and the firewall tells them apart by source port. One address gives roughly 64,000 ports per destination, so very large sites use a small pool instead.

Publishing a server. Static NAT maps a public address and port to the server's private address in the DMZ. The security rule then has to name either the public or the private address, depending on the vendor's order. That is where most published server faults come from.

VPN exemption. Traffic to the branch must keep its real addresses so it matches the VPN's traffic selectors. Identity NAT, or a no NAT rule, sits above the internet PAT rule. If it is missing, the traffic is translated and never enters the tunnel.

Animation

Which address does the rule for a published server use?

PlatformDestination in the security ruleWhy
Cisco ASA and FTDThe real, private addressDestination NAT is reversed before the ACL check
Palo AltoThe public address, with the DMZ as destination zoneRules use original addresses and the post NAT zone
FortiGateThe VIP objectThe VIP carries both addresses in the default NAT mode
Juniper SRXThe real, private addressDestination NAT runs before the policy
Check PointThe public address, or the object with automatic NATThe rule base matches the original packet
SonicWall and ForcepointThe public addressAccess rules are matched on original addresses
NAT trap

Hairpin NAT

Inside users who reach a published server by its public address need hairpin NAT. It translates the source as well as the destination, so replies come back through the firewall. An ASA also needs same-security-traffic permit intra-interface. Split DNS (Domain Name System), which gives inside users the private address, is usually cleaner.

NAT trap

Application layer gateways

Active FTP (File Transfer Protocol), SIP (Session Initiation Protocol) and H.323 carry addresses inside the payload or open extra connections. An ALG (application layer gateway) reads the control channel, opens a pinhole for the data and rewrites embedded addresses. When control works but data or media fails, such as one way audio, I check the ALG first and tune it for that flow only.

Where to look

ALG settings by vendor

ASA inspections: show service-policy. SRX: show security alg status. FortiGate session helpers: show system session-helper. Palo Alto uses App-ID decoders. Encrypted control traffic, such as SIP over TLS, hides the addresses from every ALG.

High availability

Two firewalls, one set of sessions

Every boundary I design has a firewall pair or cluster. What matters is how they share sessions, how they fail over, and what happens when traffic takes a different path back. Compare the four situations.

Active and standby, failover, clusters and split brain Users reach the internet through firewall A while firewall B is standby and receives a copy of every session over the HA link. When A fails, B takes over its addresses and announces them with gratuitous ARP, and sessions survive. In a cluster, a reply that lands on B is passed over the cluster link to A, which owns the flow. If the HA link fails, both units can become active and the network sees duplicate addresses. HA and state links Usersinside Internetoutside Firewall A activefailedowns the flow Firewall B standby, in syncnow activecluster memberalso active One unit forwards; every session is copied to the other B takes the addresses, sends gratuitous ARP, sessions survive A reply that lands on B is passed to A, the owner HA link lost: both active, duplicate addresses, MAC flaps

Swipe sideways to see the whole diagram.

Active and standby. The units share configuration over one link and session state over another, so the standby always knows every connection. Both units must match: model, software, licences and monitored interfaces.

Failover. A failed unit, link or path monitor triggers the standby to take over the shared addresses and virtual MACs. It sends gratuitous ARP so switches learn the new port. With state sync on, users see a pause, not a dropped session. I fix the cause before failing back, in a window.

Cluster. ASA and FTD clusters, Palo Alto active and active with its HA3 link, and Check Point load sharing all handle asymmetric traffic. One member owns each flow, and a packet that lands on another member is passed to the owner over the cluster link.

Split brain. If the HA links fail, both units can go active and the switches see the same addresses on two ports. I use two separate HA links, monitor them, and alert on any failover so this is caught at once.

Animation

HA on each platform

PlatformLinksPoints I checkHealth command
Cisco ASAFailover link for hellos and config, stateful link for sessionsActive and active needs multiple context mode; use virtual MACs so a replaced unit keeps the MACsshow failover
Palo AltoHA1 for control, HA2 for sessions, HA3 for packet forwarding in active and activePreemption is off by default; add backup HA1 and HA2 linksshow high-availability state
FortiGateTwo direct heartbeat linksSession pickup is off by default; group IDs must differ between clusters on one networkget system ha status
Juniper SRXControl link and fabric linkRedundancy group 0 for the routing engine, groups 1 and up for traffic with reth interfacesshow chassis cluster status
Check PointA dedicated sync networkClusterXL high availability or load sharing, and which connections are syncedcphaprob state
ForcepointHeartbeat and sync over node addressesCVI MAC mode against the switches; all nodes on the same policysg-cluster
When asymmetry cannot be removed

The real fix is symmetric routing, or a cluster that shares state across both paths. Where a path cannot be made symmetric, each vendor has a bypass: ASA TCP state bypass (set connection advanced-options tcp-state-bypass), Palo Alto asymmetric path bypass in a zone protection profile, FortiGate set asymroute enable, and SRX set security flow tcp-session no-syn-check.

Each one switches state checking off, so I use it only for a named flow, with security approval and a review date.

Rule base

Keeping a rule base small and honest

Firewalls rarely fail on day one. They decay: rules pile up, broad rules hide narrow ones, and nobody remembers why a rule exists. Step through how I find and fix that with evidence.

Finding shadowed, unused and ownerless rules A five rule policy is read top down. A web flow matches rule 1. A flow to the finance database matches the broad rule 2, so the deny in rule 3 is shadowed and never fires. Hit counts show rules 3 and 4 have no hits. Owner columns show rule 2 has no owner. The fixed policy moves the deny up, narrows the broad rule and removes the duplicate. #ActionSourceDestinationServiceHitsOwner 1AllowUsersWeb serversHTTPS182,400Web team 2AllowUsersAnyAny9,120none 3DenyUsersFinance databaseAny0Finance 4AllowUsersWeb serversHTTPS0Web team 5DenyAnyAnyAny, and log311Security 1AllowUsersWeb serversHTTPSWeb team 2DenyUsersFinance databaseAny, and logFinance 3AllowUsersInternetWeb browsingSecurity 4DenyAnyAnyAny, and logSecurity never reached Read top down: the first match wins Rule 3 is shadowed: the deny never fires Hit counts over a full business cycle show what is used Every rule needs an owner and a review date Deny moved up, broad rule narrowed, duplicate removed

Swipe sideways to see the whole diagram.

Step 1
  1. Rules are read top down and the first match decides. Order is design: specific rules first, broader ones after, and an explicit deny that logs at the end of each section.

  2. A user's flow to the finance database hits the broad rule 2 and is allowed. The deny in rule 3 can never fire, so it is shadowed. A shadowed deny under a broad allow is a real exposure, so I fix those first.

  3. Hit counts and last hit dates, gathered over a full business cycle including month and year end, show which rules are used. Rule 4 duplicates rule 1 and has no hits. Counters reset on reload or failover, so I check how long they have run.

  4. Every rule carries an owner, a reason, a change reference and a review date. Rule 2 has no owner and allows anything, so it goes to the security lead to justify or remove.

  5. The deny moves up, the broad rule is narrowed to web browsing, and the duplicate is removed. Removal is in two steps: disable and watch the logs, then delete through change.

Try it: which rule matches first?

Pick a flow and see which rule decides it, top down. The services are HTTPS for web, SQL (Structured Query Language) for the database and SSH (Secure Shell) for remote logins. Then fix the order and run it again.

#ActionSourceDestinationService
1AllowUsersWeb serversHTTPS
2AllowUsersAnyAny
3DenyUsersFinance databaseAny
4AllowUsersWeb serversHTTPS
5DenyAnyAnyAny, and log

With the original order, the finance database flow matches rule 2 and is allowed. Rule 3 never fires.

  1. Least privilege. Named hosts and services or applications. Never any to any, and never a rule nobody can test.
  2. A naming standard. Objects named by type and purpose, so a rule reads like a sentence and duplicates are easy to spot.
  3. Every rule has an owner. Owner, reason, change reference and review date in the rule itself, matching the rule register.
  4. Temporary means dated. Rules for a project or a test carry an expiry or a schedule, and are removed when it passes.
  5. Recertify on a cycle. High risk boundaries more often. Owners confirm, change or remove each rule, and unclaimed rules are disabled.
  6. Zero hits is not proof. Counters reset on a reload, a clear or a failover, and a shadowed rule shows zero even when its flow exists. I check the counter's age, the SIEM and the owner over a full business cycle.
  7. Tools find, people decide. Tufin, AlgoSec, FireMon or the vendor's own optimiser find rules to review. The owner and a change record make the decision.
Changes and upgrades

A firewall change, end to end

Most firewall outages are caused by a change. A good change is boring: assessed, tested before and after, approved by the CAB (change advisory board), and recorded in the CMDB (configuration management database). This is the path every rule request takes on the estates I design and support.

The stages of a firewall change Seven stages from left to right: request, assess, pre test, approve, implement, verify and record. For each stage a panel lists the main checks. They run from the exact flow and owner to least privilege, shadowing and a policy match test. Then come approval with a backout plan, a safe commit, verification with hit counts and logs, and a closed change with evidence. Requestthe flow Assessrisk Pre testtoday ApproveCAB Implementsafely Verifyevidence Recordclose Step 1 · Request Who needs it, for which application, and why The exact flow: source, destination, ports, direction and NAT An owner, a review date and a change reference Step 2 · Assess Least privilege: named hosts and services, never any Zones crossed, and whose approval each boundary needs Overlap, shadowing, clear text protocols and NAT impact checked Step 3 · Pre test Run the policy match tool with the real values Record today's result, usually denied, as the baseline Back up the configuration off the device Step 4 · Approve Security sign off for accredited or regulated boundaries Change board approval with a window and a backout plan An implementer and a separate checker named Step 5 · Implement Made in the central manager, not on the box Preview and validate before the commit, push or install On Junos, a confirmed commit that rolls back on its own Step 6 · Verify The same policy match test now shows the new rule The hit counter rises and the user confirms it works Logs show the allows, and no new denies elsewhere Step 7 · Record The change closed with the test evidence attached The rule register and the CMDB updated Temporary rules given an expiry date

Swipe sideways to see the whole diagram.

Step 1
  1. A request names the requester, the owner and the application, and the exact flow: source, destination, protocol, ports, direction and any NAT. Vague requests such as "open the firewall for the new app" go back for detail.

  2. I check least privilege, reuse existing objects, look for overlap and shadowing, and flag clear text protocols with a secure alternative. Rules that cross an accredited or regulated boundary need that boundary's approval.

  3. Before anything changes, the vendor's policy match tool shows what happens today with the real values. That baseline proves later that the change did what it should.

  4. The change board approves it with a window, an implementer, a checker and a backout plan. Emergency changes follow the same checks, faster, and are reviewed afterwards.

  5. The change is made in the central manager, previewed and validated, then committed, pushed or installed. Panorama pushes and policy installs are jobs, so I check they finished.

  6. The same test now matches the new rule, the hit counter rises, the user confirms, and the logs show nothing unexpected being denied.

  7. The change closes with its evidence, the rule register and CMDB (configuration management database) are updated, and any temporary rule gets an expiry date.

Upgrading an HA pair without an outage

  1. Prepare. Read the release notes and upgrade path, check the advisories it fixes, stage and hash check the images, back up off the device.
  2. Check health. Both units in sync, no recent failovers, sessions and VPNs healthy.
  3. Upgrade the standby. Reboot it, let it rejoin and sync, and check it.
  4. Fail over. Move traffic to the upgraded unit and test the key services.
  5. Upgrade the other unit. Then fail back only if the design needs it.
  6. Close. Post checks, then update the version register and the CMDB. To roll back, fail back to the unit still on the old version.

When a critical advisory lands

Edge devices are prime targets

Firewall and VPN gateways face the internet, so attackers hunt for their flaws. Public examples carry CVE (Common Vulnerabilities and Exposures) numbers. They include the PAN-OS GlobalProtect flaw CVE-2024-3400 in April 2024, and the Cisco ASA and FTD VPN web server flaws CVE-2025-20333 and CVE-2025-20362 in September 2025, which led to a US emergency directive. SonicWall's CVE-2024-40766 and the FortiCloud single sign on bypass CVE-2026-24858 followed the same pattern.

My response is the same each time. I confirm whether the vulnerable feature is exposed and check for signs of compromise before patching, because patching removes evidence. Then I apply the fix or the vendor's mitigation, and rotate credentials and review admin activity if there is any doubt.

Migration

Moving a rule base to a new vendor

A vendor change is the best chance to clean a rule base, and the easiest way to break one. Conversion tools do the bulk of the typing, but they copy mistakes as faithfully as good rules. This is the order I work in.

Migrating a firewall rule base The old firewall's rule base is exported and checked with hit counts and owners, then cleaned from 1,840 rules to 1,120. A migration tool converts objects, rules and NAT for the new firewall. Rules are then rewritten for the new vendor's NAT order and application rules, and key flows are tested on both firewalls. Cut over happens zone by zone, with the old pair ready to take traffic back. Old firewall 1,840 rules1,120 rules720 retired Migration toolobjects, rules, NAT New firewall convertedNAT and apps fixedtests passed UsersGuestServersDMZ UsersGuestServersDMZ next windowmoved, old pair on standby Export rules, objects, NAT and hit counts Clean first: unused and ownerless rules removed Convert with a tool, then review by hand Rewrite for the new NAT order and app rules Replay key flows through both firewalls' match tools Cut over zone by zone, with a way back

Swipe sideways to see the whole diagram.

Step 1
  1. I export the rules, objects, NAT, VPNs and routes, with hit counts and logs over a full business cycle, and match each rule to an owner.

  2. Unused, shadowed, duplicate and ownerless rules are removed on the old firewall first, through normal change. Migrating fewer rules means less to convert, less to test and less to get wrong.

  3. A migration tool converts objects, rules and NAT. Cisco's Secure Firewall Migration Tool takes ASA, Check Point, Palo Alto and Fortinet rule bases to FTD, and Fortinet's FortiConverter targets FortiGate. Palo Alto's Expedition tool reached end of life at the end of 2024. Every tool's output gets a human review.

  4. Rules are rewritten for the new vendor's NAT order, port based rules move to application based ones where the platform supports it, and inspection profiles are attached.

  5. Key flows are replayed through both firewalls' policy match tools and the results compared. Failover, VPNs and logging are tested before any traffic moves.

  6. Traffic moves zone by zone or VLAN (virtual local area network) by VLAN in agreed windows. The old pair stays powered and configured until the last zone has run cleanly through a business cycle.

Troubleshooting

Finding the drop in minutes

When users say "the firewall is blocking it", I check four things in order: did the packet arrive, what did the firewall decide, did it leave, and did the reply come back? Captures on both sides settle it quickly.

Finding where a packet was dropped A capture on the ingress side shows whether the packet reached the firewall. The firewall's own trace tool shows the rule, the NAT and any drop reason. A capture on the egress side shows the packet leaving with its translated address. If no reply comes back, the fault is beyond the firewall. If the session shows bytes out and none back, the reply may have taken a different path. Client10.1.1.20 Firewalltrace tool Server203.0.113.10 capture in capture out Seen on the way in? If not, look before the firewall The trace shows the rule, the NAT and any drop reason Leaving with the translated address? No reply at all: routing or the server, beyond the firewall Bytes out, none back: the reply took another path reply via another router, so no session there

Swipe sideways to see the whole diagram.

Step 1
  1. I capture on the ingress interface with a tight filter. An empty capture rules the firewall out: the problem is the client, the switch, routing or another device before it.

  2. The firewall's own tool replays or traces the flow and names the rule, the NAT and the drop reason: packet-tracer on ASA and FTD, test security-policy-match on Palo Alto, diagnose debug flow on FortiGate, flow traceoptions on SRX and fw ctl zdebug + drop on Check Point.

  3. A capture on the egress side, filtered on the translated address, proves the packet left. Captures by stage on Palo Alto show receive, firewall, transmit and drop in one go.

  4. If the packet leaves but nothing returns, the fault is beyond the firewall: the next hop, the return route or the server itself. Evidence from both captures saves a long argument.

  5. A session with bytes out and none back, or replies dropped as "not part of a session", means the reply came back another way. I fix the routing so both directions use the same firewall.

Fault finder: symptoms and the commands I run

A new rule was added but traffic still hits the default deny

Likely causes: a deny above it, or the rule placed at the bottom; the wrong zone pair, because routing decides the egress zone; the wrong address for the vendor's NAT order. Also check for an object typo or wrong port, an App-ID that differs from the rule, and a commit, push or install that never finished.

Cisco ASA and FTD
packet-tracer input inside tcp 10.1.1.20 50000 203.0.113.10 443 detailed, then show running-config access-group to check the ACL is applied.
Palo Alto
test security-policy-match from trust to untrust source 10.1.1.20 destination 203.0.113.10 destination-port 443 protocol 6, and show jobs all to confirm the push.
FortiGate
diagnose debug flow with a filter on the host. "Denied by forward policy check (policy 0)" means the implicit deny.
Juniper SRX
show security match-policies with the real values, and show security policies hit-count.
Check Point
fw ctl zdebug + drop filtered to the host, and check the policy installed without errors.

Traffic works one way only

Likely causes: the reply returns through another firewall, or NAT is not reversed or not routed back. Other causes are a server with two network cards answering from the wrong one, reverse path checks, or an HSRP (Hot Standby Router Protocol) active router on one side and the active firewall on the other.

Cisco ASA and FTD
show conn address 10.1.1.20 detail and show asp drop, looking for tcp-not-syn or rpf-violated.
Palo Alto
show session all filter source 10.1.1.20: bytes in one direction only.
FortiGate
diagnose sys session list after a filter; "reverse path check fail" in debug flow.
Juniper SRX
show security flow session source-prefix 10.1.1.20: packets on the in leg, none on the out leg.
Check Point
fw monitor on the host to see which inspection points the reply reaches.

The VPN tunnel is up but no traffic passes

Reading the counters: if neither side's counters move, check routing, NAT exemption and traffic selectors. If my encrypt rises and their decrypt stays flat, ESP (Encapsulating Security Payload) or UDP 4500 is blocked between us. If both sides encrypt but my decrypt stays flat, their packets are not reaching me: I check ESP or UDP 4500 on the path towards me, then their SA (security association) and routing. If small packets work and large ones fail, it is the MTU (maximum transmission unit).

Cisco ASA and FTD
show crypto ipsec sa peer 203.0.113.1 for encaps and decaps, and show nat detail for the exemption.
Palo Alto
show vpn ipsec-sa, and check proxy IDs match a policy based peer exactly.
FortiGate
diagnose vpn tunnel list name TO_BRANCH for selectors and encrypt and decrypt counters.
Juniper SRX
show security ipsec security-associations and show security ipsec statistics.
Check Point
vpn tu to list and reset tunnels, with the VPN logs in SmartConsole.

Small requests work but large transfers fail

Likely causes: a tunnel or overlay lowers the MTU and the ICMP "fragmentation needed" message is blocked, so path MTU discovery fails. Test with ping -f -l 1472 on Windows or ping -M do -s 1472 on Linux, then step down. The fix is to allow that ICMP and clamp the TCP MSS (maximum segment size).

Cisco ASA and FTD
sysopt connection tcpmss 1380 (the default) and show asp drop.
Palo Alto
Adjust TCP MSS on the tunnel or egress interface's advanced settings.
FortiGate
set tcp-mss-sender 1360 and set tcp-mss-receiver 1360 in the policy.
Juniper SRX
set security flow tcp-mss ipsec-vpn mss 1350
Check Point
fw monitor on both sides to see whether the large packets leave and come back.

Drops after an HA failover

Likely causes: state sync off or failing, so sessions were not copied; switches still sending to the old unit's port; a flapping monitored link; both units active; configuration or software out of step.

Cisco ASA and FTD
show failover and show failover history for the reason and the stateful counters.
Palo Alto
show high-availability state and show high-availability state-synchronization.
FortiGate
get system ha status and diagnose sys ha checksum cluster; check session pickup is on.
Juniper SRX
show chassis cluster status and show chassis cluster statistics.
Check Point
cphaprob state and cphaprob -a if.

A published server cannot be reached from the internet

Likely causes: the rule names the wrong address for the vendor's NAT order; the NAT rule is shadowed by another; nothing answers ARP for the public address; the server's default route does not point back through the firewall.

Cisco ASA and FTD
packet-tracer input outside tcp 203.0.113.50 50000 198.51.100.10 443 detailed; the ACL must use the real address.
Palo Alto
test nat-policy-match; the security rule uses the public address with the DMZ zone.
FortiGate
Check the policy names the VIP, and debug flow shows the destination NAT.
Juniper SRX
show security nat destination rule all, and add security nat proxy-arp for the public address.
Check Point
Check the object's automatic NAT and routing, then fw ctl zdebug + drop.
Engagement

How I run a firewall programme, from rule review to refresh

Firewall work is rarely a fresh build. It is usually a refresh, a consolidation or a vendor change on a live estate. I run it the same way each time: agree the outcome, prove the current rule base with data, design the target policy, test it, and hand over an estate that stays clean.

How an engagement runs, from first conversation to lifecycle Seven stages from left to right: engage (outcome), requirements (targets), discovery (rule audit), design (target policy), build and test (test), support (handover), lifecycle (stay current). For each stage the panel shows who I work with and what comes out of it. After the lifecycle stage the loop returns to the start. Engageoutcome Requirementstargets Discoveryrule audit Designtarget policy Buildtest Supporthandover Lifecyclestay current Step 1 · EngageAgree the outcome and the risk ownerWho I work withWhat comes outSecurity and risk leadsNetwork and service ownersAudit and complianceGoal: refresh, consolidate or migrateScope: pairs, zones and VPNsRisk owner and approvers namedDecision log and RACI Step 2 · RequirementsThroughput with the features switched onWho I work withWhat comes outApplication ownersSecurity architectsOperations teamZones and boundaries by trustThroughput with inspection onAvailability and failover targetsLogging and retention rules Step 3 · DiscoveryThe real rule base, not the drawingWho I work withWhat comes outFirewall administratorsApplication and rule ownersMonitoring teamRule and object inventory with hitsUnused, shadowed and broad rulesTraffic and session profileLicence and support dates Step 4 · DesignFewer, clearer rulesWho I work withWhat comes outDesign authoritySecurity architectsVendor specialistsZone model and rule standardNAT and VPN designHA and management designMigration and rollback plan Step 5 · Build and testProve every flow before cut overWho I work withWhat comes outEngineers and partnerApplication testersChange advisory boardPair built to the low level designPolicy match tests for key flowsFailover and throughput resultsCut over plan by zone Step 6 · SupportRunbooks, alerts and clean changeWho I work withWhat comes outService desk and operations centreSecurity operationsProblem managerRunbooks for common faultsAlerts on HA, processor and sessionsChange and recertification processKnown error records Step 7 · LifecycleReleases, advisories and end of lifeWho I work withWhat comes outVendor account teamSecurity operationsProcurementRelease and patch planAdvisory triage processRule recertification cycleHardware refresh roadmap

Swipe sideways to see the whole diagram.

Step 1
  1. I agree what the programme is for: retiring end of life kit, consolidating vendors, adding inspection or closing an audit finding. I name the risk owner for each boundary, because they approve the rules that cross it, and set up a RACI (responsible, accountable, consulted, informed).

  2. Functional requirements cover zones, VPNs, inspection and identity. Non functional ones cover throughput with threat features and TLS decryption on, session counts, failover time, log retention and change windows, each with a number that can be tested.

  3. I export the rule base, hit counts and logs over a full business cycle, then run them through analysis tools to find unused, shadowed and overly broad rules. Every rule that stays needs an owner who can say why it exists.

  4. I design the zone model, the rule and naming standard, NAT and VPNs, HA and the management platform. When the vendor changes, I rewrite rules for the new vendor's NAT order rather than copying them across line by line.

  5. I build the new pair, test failover and throughput, and replay the important flows through the vendor's policy match tools. Cut over goes zone by zone or VLAN by VLAN, with the old pair kept ready to take traffic back.

  6. Operations get runbooks for common faults, alerts on HA state, sessions and resources, logs in the SIEM, and a change process that checks every request for least privilege, shadowing and NAT impact before it is approved.

  7. Edge firewalls are a favourite target, so I track each vendor's advisories and support dates, upgrade HA pairs one unit at a time, recertify rules on a fixed cycle and plan hardware refresh before end of support.

Functional requirements

What it must do.

  • Separate users, servers, DMZ, management and partners into zones, with policy between each pair.
  • Inspect traffic by application and user, with intrusion prevention and URL filtering where the risk needs it.
  • Publish internet facing services through NAT and a DMZ, never straight to the inside.
  • Provide site to site and remote access VPNs with strong, current cryptography.
  • Send every allow and deny at a boundary to the SIEM.
  • Manage every firewall from one platform, with role based access for administrators.

Non functional requirements

How well it must do it, with a number wherever one can be agreed.

Throughput
Measured with the inspection features in use, including TLS decryption, plus 30 to 50% headroom.
Sessions
Concurrent sessions and new sessions per second, sized from discovery data.
Availability
An HA pair or cluster at every boundary, with failover in seconds and sessions kept.
Security
Least privilege rules, current software and hardened management access.
Auditability
Every rule carries an owner, a change reference and a review date.
Operability
Changes go through one manager, previewed and validated before they go live.
Retention
Logs kept for the period policy or regulation sets, often 12 months or more.

These are typical starting targets for a firewall refresh. Datasheet throughput is often measured with features off, so I size from the vendor's threat protection and TLS decryption figures.

Projects

Where I have worked with these platforms

I have designed and delivered firewall estates in industrial software, publishing and the public sector, and worked under strict change control in a regulated bank. I keep three vendors running side by side in my home lab.

Home lab

Three firewall vendors side by side

My home lab runs a physical Cisco ASA alongside virtual Palo Alto and Check Point firewalls, so I can test policy and NAT on each before it goes near a live network.

Penguin Random House · 2013 to 2015

Palo Alto after a merger

Integrated a multi site estate after the merger on Cisco, Palo Alto and VMware, with warehouse automation segmented from the corporate network.

Civica for Luton Borough Council · 2017

Public sector modernisation

Modernised a council network across switching, wireless and firewalls, including FortiGate and Check Point, leading 7 engineers and third party suppliers.

iSystems Integration · three engagements, 2015 to 2019

Security architecture for clients

Cloud, SDN (software defined networking), disaster recovery and security architecture for the firm's enterprise clients, on Nexus, Viptela, Palo Alto, F5 and Aruba.

AVEVA · 2020 to 2021

Security transformation, every site

Led network and security transformation through AVEVA's reverse merger, modernising every site worldwide remotely during the COVID lockdowns.

BNY Mellon · 2018 to 2019

Change in a regulated bank

Delivered the EMEA (Europe, Middle East and Africa) network refresh with no service outages and MiFID II (Markets in Financial Instruments Directive) compliance kept throughout.

I work across Palo Alto, Check Point, Cisco Firepower, FortiGate, F5 and IPsec (IP security) VPN. I have passed the CCIE (Cisco Certified Internetwork Expert) Security written exam and hold the Cisco Certified Specialist Security Core certification. The security page shows how firewalls fit into my wider security designs.