Category: F5
Technologies: F5 BIG-IP LTM, FortiGate, TCP, SNAT
Incident type: Application connectivity
Difficulty: Intermediate
Sanitization notice: The IP addresses are
representative private values. Customer names, hostnames, credentials,
and sensitive topology details have been removed or changed.
Incident summary
The application team reported that their service was down. Connection
tests to TCP ports 20055, 30055, and
40055 failed through the F5 VIP
10.200.252.190.
FortiGate logs showed a server reset (RST), which
initially suggested a backend issue. The server team found something
different: all three ports were listening, but no connection attempt
reached the servers and no session entered the ESTABLISHED
state.
The pool was healthy and the VIP was receiving traffic. The
investigation therefore focused on one question: where did the
flow stop between the F5 and the backend servers?
Environment
| Component | Details |
|---|---|
| F5 BIG-IP LTM | VIP 10.200.252.190 |
| F5 internal addresses | 172.22.72.251-254 |
| Backend servers | 192.168.10.20-23 |
| Application ports | TCP 20055, 30055, 40055 |
| Firewall | FortiGate |
Traffic path
Client -> FortiGate -> F5 VIP -> F5 server-side leg -> FortiGate -> Backend server
This path contains two separate flows:
- Client to F5 VIP
- F5 to backend server
Proving that the first flow works does not prove that the second flow
is permitted.
Investigation
1. Check the VIP and
source translation
The virtual server, pool, and SNAT behavior were reviewed. The server
team then checked for connection attempts from the expected F5-side
source addresses.
No traffic was visible on the backend servers.
Finding: The servers were not rejecting the
connection; they were not receiving it.
2. Confirm that traffic
reaches the F5
A packet capture was taken on the F5 for the VIP and affected
ports:
tcpdump -nni 0.0:nnn
'host 10.200.252.190 and (port 20055 or port 30055 or port 40055)'
The capture showed client packets arriving at the F5 correctly.
Finding: Client routing and firewall policy up to
the VIP were working.
3. Trace the server-side flow
The next capture focused on the backend network:
tcpdump -nni 0.0:nnn
'net 192.168.10.0/24 and (port 20055 or port 30055 or port 40055)'
The expected connection did not reach the backend servers. The
failure was on the internal leg after the F5 accepted the client
request.
4. Eliminate common F5 causes
| Check | Result |
|---|---|
| Route to backend network | Correct |
| Internal VLAN and trunk | Correct |
| Self IP and Floating IP | Correct |
| Pool and pool members | Correct |
| Backup member/port settings | Correct |
| Pool member state | Up |
Nothing on the F5 explained why the backend servers saw no SYN
packets.
5. Do not rely only on pool
health
The pool showed UP, but the monitor did not prove
that production traffic on all three application ports was allowed end
to end.
Monitor traffic can use a different source address, port, policy, or
path. A successful monitor proves only that the configured monitor
succeeded.
6.
Recheck the firewall using the actual server-side flow
The FortiGate logs and policies were reviewed again with the correct
values:
- Source: F5 internal addresses
172.22.72.251-254 - Destination: Backend servers
192.168.10.20-23 - Ports: TCP
20055,30055,
40055
This exposed the missing part of the design.
Root cause
The FortiGate allowed client traffic to reach the F5 VIP, but there
was no policy permitting the separate connection from the F5 internal
addresses to the backend servers on the required application ports.
The firewall terminated the downstream flow. This produced the reset
seen in the logs, even though the backend servers never received the
connection.
Resolution
A FortiGate policy was added with the following scope:
| Policy field | Value |
|---|---|
| Source | F5 internal addresses 172.22.72.251-254 |
| Destination | Backend servers 192.168.10.20-23 |
| Service | TCP 20055, 30055, 40055 |
| Action | Accept |
| Logging | Enabled |
The rule was limited to the required sources, destinations, and ports
rather than using broad ANY objects.
Verification
After the policy was applied:
- TCP connection tests succeeded on all three ports.
- F5 captures showed traffic on both client-side and server-side
legs. - FortiGate logs showed the new policy accepting the sessions.
- Backend servers received the connections and established
sessions. - The application team confirmed that the service was working
normally.
What made this incident
misleading?
| Observation | Incorrect assumption | Correct interpretation |
|---|---|---|
| FortiGate reported a server reset | The backend server sent the RST | An intermediate device may terminate the flow |
| Pool members were UP | Application traffic must be allowed | Only the configured monitor was successful |
| VIP received client packets | The complete path was working | Only the client-to-VIP leg was proven |
| Server ports were listening | The server should establish a session | The SYN still had to reach the host |
Key lessons
Trace each segment
separately
Client -> firewall -> VIP -> F5 server side -> firewall -> backend
At each step, confirm both packet arrival and departure.
Verify the source
address seen by the backend
Depending on the F5 design, the server may see a SNAT, automap, Self
IP-related, or other translated source. Firewall rules must match the
actual server-side source.
A healthy pool is not
an end-to-end test
Monitor success does not validate every production source,
destination port, firewall policy, or return path.
Confirm who generated the
reset
Do not rely only on the session-end label in a firewall log.
Correlate captures and logs to locate the packet carrying the RST.
Prevention checklist
Final takeaway
The traffic appeared to fail around the F5, but the decisive evidence
came from comparing its two traffic legs. The client reached the VIP,
while the backend never received a SYN.
When a VIP is reachable, pool members are healthy, and servers see no
connection attempt, trace the server-side flow using the actual
F5 source address. That check can quickly reveal the missing
link.
