When a Huawei USG firewall “won't pass traffic,” the fault almost always sits in one of three places — the security policy never matched, the session table shows something abnormal, or NAT translated the wrong thing. This is the order that finds it fastest: the display commands to run at each stage, how to read what comes back, and the debugging commands worth reaching for when display output alone isn't enough.
By the AtlasCommTech engineering team — 13 years of carrier & enterprise network deployments · Updated July 2026
Three different failure shapes get filed under the same ticket — “the firewall won't pass traffic” — and each one has its own diagnostic order.
A firewall traffic complaint rarely comes with a clean symptom attached. “It doesn't work” can mean the security policy never matched the traffic in the first place, the session table shows something odd once a session does exist, or NAT translated something it shouldn't have — or didn't translate what it should have. Changing rules on the policy layer and the NAT layer at the same time, hoping something sticks, is the slowest way through this. Working the three categories in a fixed order — security policy, then session table, then NAT — finds the actual fault faster, because each stage rules out a distinct set of causes before you move on to the next.
What follows is that order: the exact display commands for each stage and how to read what comes back, the debugging and packet-capture commands worth reaching for once display output alone isn't enough, five gotchas pulled from real field fault cases, and five FAQ answers built the same way.
A firewall traffic fault splits cleanly into exactly three shapes — placing the symptom on this tree first tells you which section below actually applies.
Each branch below rules out a specific layer. Working top to bottom — policy, then session table, then NAT — means you're never troubleshooting NAT because you assumed the policy layer was fine.
Diagram labels are kept in English for engineering clarity.
Security policy, session table and NAT symptoms often look identical to the person reporting them — “it doesn't work.” Checking hits before session table before NAT, in that order, is what actually saves time: each stage gives a conclusive yes-or-no on whether to keep going.
Three categories, three different sets of things to look at — plus the debugging commands worth reaching for once display output alone isn't enough.
If the hit counter never moves, the traffic isn't reaching the rule you think it is — check what it's actually matching instead.
<sysname> display security-policy rule destination 1.1.1.1 protocol tcp destination-port 8888
RULE ID RULE NAME STATE ACTION HITS
-------------------------------------------------------------------------------
1 1 enable permit 0
2 2 enable permit 0
5 5 enable permit 0
6 6 enable deny 0
0 default enable deny 0
-------------------------------------------------------------------------------
// HITS stays at 0 on every rule -> this traffic never reached this rule set as you defined it
<sysname> display firewall session table verbose
// cross-check the session's actual destination zone against the authentication policy's configured destination zone
A session either doesn't exist at all, or exists with counters that tell you exactly which direction is broken.
<sysname> display firewall session table verbose source global 10.107.7.23 destination global 10.3.8.211 destination-port global 80
tcp VPN: public --> public ID: a38f5d6f74b701cf56ec2a0d
Zone: untrust --> trust TTL: 00:20:00 Left: 00:17:57
Interface: Eth-Trunk0 NextHop: 0.0.0.0 MAC: 0000-0000-0000
<--packets: 10 bytes: 703 -->packets: 10 bytes: 703
10.107.7.23:47150 --> 10.3.8.211:80 PolicyName: 1
// non-zero packet count in both directions -> forward and return path both reach this device, networking is normal
// the same command on a failing flow instead shows:
<--packets: 0 bytes: 0 -->packets: 12 bytes: 840
// one direction stuck at 0 -> asymmetric routing or a downstream drop on the return path, not a local fault
<sysname> display firewall session table verbose
udp VPN: public --> public ID: a68f5bd4603f01f756c5ab54663
Zone: local --> trust TTL: 00:02:00 Left: 00:01:58
// IKE/IPSec control traffic to the device itself lands in the local zone, not the interface's usual zone
NAT faults tend to hide in one of three places: the wrong address configured in the policy, port exhaustion on a PAT pool, or an unrelated feature silently discarding the already-translated packet.
[sysname-diagnose] display nat port conflict
The history data of port conflict, Slot: 1 CPU: 0
2015-11-19 16:03:53 vsys:public protocol:17
192.168.1.1:2048[10.2.2.2:23878]-->8.8.8.8:53
pool:addressgroup1 porthash:**********
[FW] nat address-group addressgroup2
[FW-address-group-addressgroup2] mode no-pat global
[FW-address-group-addressgroup2] section 10.2.2.2
[FW-address-group-addressgroup2] route enable
<sysname> display firewall statistic system discard
Discard statistic information:
IP header field invalid packets discarded:5
TCP session miss packets discarded:7
ATK packets discarded:77
// rising ATK-discard count with NAT/session otherwise healthy -> check anti-attack false positives, e.g. IP-spoofing detection
Once the stages above have told you where the problem sits but not why, this is the order to reach for debugging and packet capture.
<sysname> terminal monitor
<sysname> terminal debugging
<sysname> debugging ikev1 all
<sysname> debugging ipsec all
[sysname] acl 3100
[sysname-acl-adv-3100] rule 5 permit ip source 10.1.1.1 0 destination 10.2.1.1 0
[sysname] packet-capture ipv4-packet 3100 interface GigabitEthernet 1/0/1
[sysname] packet-capture startup packet-num 1500
[sysname] packet-capture queue 0 to-file 1.cap
<sysname> display diagnostic-information dia-info.txt
<sysname> save logfile all
Once the three stages above have told you where the problem sits, these are the specific traps that keep showing up once you're there.
SYMPTOMTraffic gets dropped even though a security-policy rule appears, on paper, to allow it — in a scenario where NAT is also configured on the same path.
CAUSEThe security policy always evaluates the real address for that direction, not the one that seems intuitive: in a source-NAT scenario the policy's source address has to be the pre-NAT address, and in a destination-NAT scenario the policy's destination address has to be the post-NAT address. Configuring the wrong side of that pair produces a rule that looks correct and still never matches.
FIXWrite the policy address for the actual pre- or post-NAT address, matching the direction of translation — not the address a user or the public documentation for the service would reference.
[FW] nat address-group addressgroup2
[FW-address-group-addressgroup2] mode no-pat global
[FW-address-group-addressgroup2] section 10.2.2.2
[FW-address-group-addressgroup2] route enable
// security-policy source-address for this flow must reference the pre-NAT address, not 10.2.2.2
SYMPTOMdefault action deny is configured and no explicit security-policy rule exists, yet traffic between interfaces in the same zone — or management traffic to the device itself — still gets through.
CAUSEIntra-zone traffic does still match the security-policy evaluation path, but under default packet-filter behavior it doesn't display a matched policy name unless a detailed rule with both source-zone and destination-zone explicitly configured is present. Separately, when service-manage enable is active on an interface, management traffic destined to the Local zone skips security-policy matching entirely — packet-filter permission for it is decided by service-manage, not by the policy engine.
FIXDon't read “no policy name in the session” as “nothing is filtering this.” If you need visibility or control over intra-zone traffic, add a detailed rule with the matching source-zone and destination-zone explicitly set; manage which services are open under service-manage deliberately, since that path bypasses the policy engine by design.
SYMPTOMA security-policy rule configured to deny a specific authenticated user's traffic doesn't take effect — the user is confirmed online, but their traffic isn't being blocked.
CAUSEThe authentication policy's destination zone doesn't match the session's actual destination zone, so the session never hits the authentication policy in the first place — and a user-based security-policy rule downstream of that never gets a chance to apply either, regardless of how correctly it's written.
FIXCompare display firewall session table verbose against the authentication-policy configuration; if the destination zone needs to cover more than one zone, set it to any, then re-check that the user-based rule's hit count actually starts moving.
SYMPTOMNAT works fine under light load, then sessions through an already-working PAT pool start intermittently failing or getting dropped as traffic grows.
CAUSEPAT mode lets a single public IP exceed its raw 63,488-session limit through port reuse, but the probability of a port conflict rises with the reuse rate. Field practice generally keeps this to roughly 200,000 sessions per public IP as a working ceiling, well short of any theoretical maximum.
FIXCheck display nat port conflict for a rising conflict history before assuming the pool configuration itself is broken; if a single public IP is genuinely overloaded, add more addresses to the pool or split traffic across additional public IPs.
[sysname-diagnose] display nat port conflict
The history data of port conflict, Slot: 1 CPU: 0
2015-11-19 16:03:53 vsys:public protocol:17
192.168.1.1:2048[10.2.2.2:23878]-->8.8.8.8:53
pool:addressgroup1 porthash:**********
SYMPTOMA NAT mapping that has worked reliably for a long time suddenly stops working, often on a dual-egress firewall, with no configuration change on the NAT or routing side.
CAUSEAn anti-attack feature — IP-spoofing detection is a common one — can start silently discarding packets that trip its heuristics, with no NAT-layer or session-layer symptom to point at directly. From the outside it presents identically to a NAT or routing fault.
FIXCheck display firewall statistic system discard for a rising ATK-discard count before spending more time on NAT or session-table configuration that's already correct; disable or tune the specific anti-attack feature once confirmed, rather than leaving anti-attack disabled wholesale.
<sysname> display firewall statistic system discard
Discard statistic information:
IP header field invalid packets discarded:5
TCP session miss packets discarded:7
ATK packets discarded:77
Pulled straight from the field — the ones worth having an answer ready for.
Confirm route reachability first, then check whether the security policy actually permits the traffic with display security-policy rule and its HITS count. A session that was never created almost always means the packet either never reached the device, or was denied before a session could even be built — not a session-table bug.
It means the traffic is matching something else — a different, higher-priority rule, or the implicit default rule — before it ever reaches the rule you're watching. Check the rule order and refine the matching conditions; a rule with a hit count stuck at zero is rarely “broken,” it's usually just not the rule that's actually being evaluated.
This only applies to intra-zone traffic and to Local-zone management traffic under service-manage. Intra-zone traffic is still evaluated by the policy engine but doesn't display a matched policy name under default packet-filter behavior unless a detailed rule exists; service-manage traffic to the device itself bypasses the policy engine entirely by design. Neither is a bug — both are documented default behavior.
No session at all in display firewall session table verbose means the traffic never got past the policy layer — check hits before anything else. A session that does exist, with one direction's packet/byte counters stuck at 0 while the other moves, means the policy already let the traffic through and the real problem is asymmetric routing or a downstream drop — not a policy issue at all, and not worth re-touching the policy configuration over.
Once display commands have told you which stage is stuck but not why — for example, an IKE negotiation that display ike sa shows as absent, with no clear reason on the policy or routing side. Enable terminal monitor and terminal debugging first, then run the targeted debugging command for that feature (debugging ikev1 all, debugging ipsec all, and so on) alongside a scoped packet-capture, and export a full diagnostic bundle with display diagnostic-information and save logfile all before escalating.
This note is built around the Huawei USG-series firewall's session table, security-policy and NAT command set, plus the field fault cases behind them. It doesn't cover UTM-profile-level faults (IPS, antivirus, URL filtering as content-inspection features rather than policy-matching features), high-availability/dual-active switchover edge cases, or virtual-system (vsys) specific policy inheritance in depth — those are different enough in scope to need their own treatment.
Tell us which stage it's stuck at — policy, session table, or NAT — plus the display security-policy / display firewall session table output, and we'll help you read it.