LANRanger / Field notes
It's the network.
Show me the evidence.
Packet captures, weird routing decisions, DHCP packets disappearing in transit,
BGP doing something stupid, phones dropping calls, oversized packets, SDRs,
Private LTE, and the occasional problem that absolutely should not work the way
it does.
These are some of the more interesting problems I've worked through in production
networks and in my lab. Anything customer-specific has been removed. The technical
problem is the interesting part anyway.
Names, locations, and identifying information have been removed. I also try to
separate what a packet capture actually proved from whatever theory I had before
taking the capture.
01 / Connectivity / OutgoingPorts
Only odd numbered ports?
At one point I ran into a network where outbound connections appeared to work
only when the destination port was odd numbered. That's weird enough that I
wanted a way to prove exactly what was happening instead of guessing at it.
"The internet doesn't work" is basically useless as a troubleshooting statement.
If TCP/443 works, TCP/444 fails, TCP/445 works, and TCP/446 fails, now we actually
have something interesting.
Build a test for the exact problem
I ended up building OutgoingPorts so I could test arbitrary outbound TCP ports
and see whether a three-way handshake actually completed. The remote side also
records the source and destination port it sees, which makes the tool useful when
NAT is involved.
That last part matters. You might think you're testing one source port locally
while a firewall is translating it into something completely different before
the packet reaches the server.
Instead of trying random websites or doing fifty different telnet tests, I could
produce a repeatable pattern and then compare that pattern against the firewall,
NAT, and packet captures.
The takeaway
Weird patterns are useful. Don't average them away by calling the problem
"intermittent." Make a test that reproduces the pattern and then capture it.
Explore OutgoingPorts on the projects page →
02 / DHCP / QinQ / MPLS
The OFFER left. Then it disappeared.
A phone boots, sends DHCP, and never gets an address. Easy enough to blame DHCP.
Except the DHCP server was answering.
We captured the DHCP transaction on the server side and could clearly see the
DHCP OFFER leaving the firewall. The problem was that the same OFFER never
appeared on the far side of the transport network.
That immediately changes the troubleshooting scope. If the server generated the
OFFER and I can physically see that packet leave its interface, I'm done trying
random DHCP server settings until somebody proves the packet actually arrives at
the client side.
And only one VLAN was broken
The path crossed a managed transport network using VLAN encapsulation and QinQ.
Other traffic was working. The failure appeared to be isolated to VLAN 116,
which made the problem even more interesting.
We also rebooted a phone at another remote site and reproduced the same behavior.
The phone dropped off the network and could not obtain a new lease.
Shortly afterward another phone at that location went offline. For a minute,
that looked like the problem was spreading.
It wasn't.
Somebody had moved the original non-working phone onto the port where the working
phone had been connected. The second phone lost power because it had been
unplugged. Completely unrelated to DHCP, but exactly the kind of thing that can
send troubleshooting in the wrong direction if the physical event isn't
accounted for.
Packet boundaries matter
Capturing at only one point would have left this as "DHCP isn't working."
Capturing on both sides turned it into something much more specific:
the OFFER exists here and does not exist there.
The takeaway
Follow the packet. Once you know where it disappears, stop troubleshooting
everything before that point.
03 / VoIP / SIP / RTP
RTP was fine. The call still dropped.
Calls were dropping a few minutes after being established. The first assumption
with VoIP is usually packet loss, jitter, switching, QoS, or something else in
the media path.
So I captured it.
RTP between the phones was flowing directly between the endpoints. The captures
showed bidirectional media and I wasn't seeing the packet-loss event that would
explain the disconnect.
Then the SIP side gave away what was actually happening.
The network didn't kill the call
At roughly the same point in the failed calls, the call-control server sent a
SIP BYE. In one capture it happened at about 235 seconds.
That's a very different problem from RTP falling apart.
If the PBX tells both endpoints to tear the call down, the phones are doing
exactly what they were instructed to do. The next questions become session
timers, endpoint state, registration, call-control logic, keepalives, resource
events, and server logs.
Capture the right server
Another useful discovery came later when we realized one of the phones was
registered to a different call-control appliance than the appliance being
captured.
That's an easy mistake to make in a distributed voice environment. You can have
a beautiful packet capture of completely irrelevant traffic.
We expanded the test to compare captures around the phones, the switching path,
and the actual call-control system. We also looked at the periodic control and
keepalive traffic instead of focusing exclusively on RTP.
The takeaway
A dropped voice call does not automatically mean the network dropped RTP.
Find out who actually terminated the session.
04 / Switching / SPBm / VOSSLoopTrace
Making a noisy VOSS trace useful
Sometimes the switch already has the answer. The problem is buried inside five
thousand lines of output.
I've spent a lot of time working with Extreme Fabric Engine/VOSS and SPBm.
When something starts hammering the control plane, one of the useful tools is
the switch's trace output.
The downside is that trace output gets noisy very quickly.
Find the things that keep showing up
VOSSLoopTrace came from wanting to automate the boring part. It can process an
existing trace or collect one directly from a switch, then start identifying
ports, VLANs, and MAC addresses that repeatedly appear in traffic hitting the
control plane.
That doesn't mean every MAC it reports is guilty. It means those are the things
I want to look at first.
I've dealt with environments where loops, port flapping, inconsistent tagging,
missing fabric services, and other Layer 2 problems were all possible suspects.
Being able to reduce a huge trace into a short list of interfaces and sources
makes the next packet capture considerably easier.
The takeaway
Automation doesn't need to diagnose the entire network. Sometimes its job
is just to turn 5,000 lines into the 20 lines I actually care about.
Explore VOSSLoopTrace on the projects page →
05 / Routing / BGP / BFD / OSPF
The BGP problem wasn't BGP
BGP was repeatedly dropping. BFD was involved. There were also fabric problems
nearby, so there were plenty of places to point a finger.
This is where troubleshooting by protocol name gets dangerous. The alarm says
BGP went down, so everybody starts staring at BGP.
BGP was the victim.
Another routing protocol was changing the path
OSPF was also enabled on the firewall. The interaction between the routing
protocols was changing reachability underneath the BFD/BGP session and the
adjacency would flap.
Once OSPF was removed from that path, BFD and BGP stabilized.
There were other things worth cleaning up in the environment too, including
fabric-service inconsistencies, MLT tagging differences, and interfaces that
had been flapping. But those shouldn't be combined into one giant root cause
simply because they existed at the same time.
Symptoms aren't ownership
A BGP-down alarm tells me which protocol noticed the failure. It doesn't
necessarily tell me which protocol caused it.
The takeaway
When a routing adjacency keeps resetting, inspect the route used to reach
the peer. The control session may be fine while the path underneath it keeps
changing.
06 / Packet experiments / IPv4 / IPv6 / PMTU
The 33,000-byte question
I wanted to see exactly what happened when I shoved a roughly 33,000-byte ping
through a network that obviously couldn't carry it as one Ethernet frame.
This turned into one of those experiments where Wireshark is more useful than
the ping result itself.
One packet becomes a pile of packets
The capture showed the oversized IP packet being carried as a series of
fragments. In one of the tests I was looking at roughly 22 fragments for the
original packet.
That also forced me to be precise about what "packet size" meant. Application
payload, ICMP size, IP packet size, and what appears on the wire are not
interchangeable numbers.
I also deliberately experimented with Path MTU Discovery and different Don't
Fragment behavior because a successful ping by itself doesn't tell you whether
PMTUD is actually working correctly.
IPv6 makes this more interesting
IPv6 moved fragmentation responsibility away from intermediate routers. If a
packet is too large, the network is supposed to return an ICMPv6 Packet Too Big
message and let the source adjust.
That's great until ICMPv6 gets filtered somewhere and everything smaller works
while larger traffic mysteriously dies.
Those failures are why "I can ping it" has never been enough evidence for me
that a path is healthy.
The takeaway
Packet size matters. ICMP matters. PMTUD matters. A 64-byte ping proving
reachability does not prove a 1,500-byte or larger flow will behave correctly.
More packet abuse in the lab →
07 / IPv6 / BGP / FRR / FortiGate
Why is my next hop link-local?
Getting my own ASN and IPv6 space meant I could finally break BGP in ways that
were entirely my own fault.
One of the more interesting lab problems involved IPv6 routes being received
correctly while the next hop being advertised was a link-local address.
That's perfectly normal in plenty of IPv6 scenarios. It becomes less helpful
when your BGP peer is several routed hops away through an IPv4 SIT tunnel.
The route existed. The next hop didn't.
I was peering FRRouting and FortiGate across 6in4 tunnels while announcing my
IPv6 allocation. BGP could exchange the NLRI, but a route is useless if the
receiving router cannot actually resolve the next hop.
That sent me through route maps, global IPv6 addresses, static routes,
next-hop-self behavior, EBGP multihop, and the difference between seeing a
prefix in the BGP table and having a usable route in the forwarding table.
I also hit another classic BGP issue during this work: inbound updates being
discarded because an inbound policy wasn't present. The peer was established,
routes were being advertised, and they still weren't being installed.
Established doesn't mean working
Seeing Established is only the beginning. I want to know what I
advertised, what I received, what next hop was attached to it, whether that
next hop resolves, and whether the route actually made it into the FIB.
The takeaway
"BGP is up" and "traffic can use the route" are two completely different
statements.
08 / Multicast / PIM-SM / IGMP
Stop flooding it everywhere
Multicast is one of those things that can appear to work while doing something
absolutely terrible to the network underneath it.
I worked through an environment where multicast traffic was contributing to
alerts and generally behaving more like traffic that was being sprayed around
than intentionally routed.
Give multicast an actual topology
I implemented PIM Sparse Mode through the routed network and used a loopback as
the static Rendezvous Point. The other routers were configured to use the same
RP and participate in the sparse-mode topology.
Afterward, the amount of multicast-related protection noise dropped
significantly.
That makes sense. The point of multicast isn't "send this everywhere and hope
somebody wanted it." IGMP tells the local network who is interested. PIM gives
the routed network a method to build distribution trees toward those receivers.
Working isn't the same as correct
Broadcast-style flooding can make an application appear functional while
creating completely unnecessary traffic elsewhere. The fact that the stream is
visible at the receiver doesn't mean multicast routing is designed correctly.
The takeaway
If multicast only works because the network is flooding it everywhere, it
doesn't really work.
09 / Private LTE / RANPI / OpenCellSurvey
It connects. How good is it?
I had built a Private LTE network with Open5GS, srsRAN, an SDR, and a SIM I
provisioned myself. My phone connected. Data worked. That answered exactly one
question.
I still had no idea how good the RF coverage actually was.
I could walk around the property while the UE stayed attached, but "still
connected" is a terrible RF measurement.
Get the measurements out of the radio
I started digging into the srsRAN PHY layer and built a measurement utility that
could expose values like RSSI, RSRP, and RSRQ as structured data.
That gave me numbers, but a JSON object saying RSRP is -93 dBm isn't very useful
six hours later if I don't know where I was standing when it happened.
Add location
OpenCellSurvey came from combining those measurements with GPS. The software
records the survey path, associates measurements with locations, displays live
signal information, and can generate a report afterward.
I eventually added live RSRP graphs, survey sessions, map overlays, different
LTE bands, CBRS support, indoor floorplan support, and report exports.
RANPI grew around the same idea: take the Private LTE lab and turn it into
something portable enough that I can actually walk around with it and collect
useful information.
The takeaway
Getting a UE attached is step one. Being able to measure what the RF network
is doing is considerably more interesting.
Read the RANPI and OpenCellSurvey project →
10 / SDR / LibreFi / Low-bandwidth networking
From barely moving data to streaming audio
LibreFi started with a pretty simple question: how much useful IP traffic can I
actually move over a radio link I built myself?
"Useful" became the important word.
A modem moving a few packets in a test isn't the same thing as having enough
consistent throughput and latency control to support an actual application.
Six kilobits was already a fight
Early on, I could get a 6 kbps Opus audio stream through for a few seconds at a
time before playback would stall or fall apart.
That gave me something much better than a synthetic throughput number. Audio is
extremely obvious when the link isn't delivering packets consistently.
I kept working through the modem, buffering, packet handling, timing, and the
rest of the path until the link could sustain the 6 kbps stream.
Then 12 kbps worked
The next milestone was being able to effectively stream the 12 kbps Opus
version of the same audio.
Doubling from 6 kbps to 12 kbps sounds almost comically small compared with
normal Ethernet or Wi-Fi speeds. On a custom SDR modem where I control the
physical link, modulation, framing, and network interface, it was a pretty big
jump.
This is also why I like testing networks with real applications. An iperf number
can tell me throughput. Listening to a song tells me immediately whether the
application can actually tolerate the way those packets are arriving.
The takeaway
A link doesn't need to be fast to be interesting. It needs to move enough
data, consistently enough, to do something useful.