As a DevOps engineer managing Rackspace servers, I recently encountered an odd scenario where UDP port 7123 showed as open in netstat
but no process was attached to it. The standard diagnostic commands returned no PID:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 213120 0 134.213.205.214:7123 0.0.0.0:* -
Unlike TCP, UDP is connectionless and doesn't maintain state in the same way. Common scenarios causing this:
- Kernel-level network services
- Previously crashed applications
- Network stack artifacts
- Firewall/NAT table remnants
Before attempting to release the port, let's verify its status thoroughly:
# Check all possible process associations
sudo lsof -i :7123
sudo ss -ulnp | grep 7123
sudo netstat -ulnp | grep 7123
# Check kernel routing tables
ip route show table all
# Examine conntrack entries (if using NAT)
sudo conntrack -L | grep 7123
When standard methods fail, try these advanced techniques:
# Method 1: Clear conntrack entries
sudo conntrack -D --orig-port-dst 7123
# Method 2: Flush socket buffers
echo 1 > /proc/sys/net/ipv4/udp_mem
echo 1 > /proc/sys/net/ipv4/udp_rmem_min
echo 1 > /proc/sys/net/ipv4/udp_wmem_min
# Method 3: Use iproute2 to manipulate sockets
sudo ip route flush table cache
sudo ip route flush cache
For persistent cases, we need to go deeper:
# List kernel modules that might handle networking
lsmod | grep net
# Try unloading and reloading UDP modules
sudo modprobe -r udp_diag
sudo modprobe udp_diag
# Alternatively, reset the entire UDP stack
echo 1 > /proc/sys/net/ipv4/udp_l3mdev_accept
To avoid this situation:
- Implement proper application shutdown handlers
- Use socket SO_REUSEADDR option in your code
- Monitor ports with
ss
instead ofnetstat
- Consider using
systemd-socket-proxyd
for critical services
If the port absolutely must be released immediately and nothing else works:
# Carefully restart networking (less disruptive than full reboot)
sudo systemctl restart networking
# For RHEL/CentOS:
sudo service network restart
Remember that these are last-resort measures and should be tested in staging environments first.
When a UDP port shows as open in netstat
or ss
but no process appears to be attached to it, you're typically dealing with one of these scenarios:
# Typical symptoms:
$ sudo netstat -tulnp | grep 7123
udp 213120 0 134.213.205.214:7123 0.0.0.0:* -
First, confirm the port is truly orphaned:
# Check with ss (modern alternative to netstat)
$ sudo ss -ulnp | grep 7123
# Double-check with lsof
$ sudo lsof -i UDP:7123
# Inspect kernel connections
$ sudo conntrack -L | grep 7123
$ sudo cat /proc/net/udp | grep 7123
- Kernel socket left in CLOSE_WAIT state
- Network stack cached the connection
- Previous process crashed without proper cleanup
- Firewall/security software interference
Try these methods in order:
Method 1: Reset the Network Stack
# Flush conntrack entries
$ sudo conntrack -D -p udp --dport 7123
# Alternative conntrack flush
$ sudo conntrack -F
Method 2: Use ss to Close the Socket
# First get the inode number
$ sudo ss -ulnp -e | grep 7123
# Then manually close it (replace INODE_NUM)
$ sudo gdb -p $(pgrep your_target_process) -ex "call close(INODE_NUM)" --batch
Method 3: Kernel Socket Manipulation
For persistent cases, create a C program to force close:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(7123);
addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
close(sockfd);
return 0;
}
Method 4: Network Namespace Workaround
As a last resort before reboot:
# Create temporary network namespace
$ sudo ip netns add tempns
# Move the interface (eth0 in this case)
$ sudo ip link set eth0 netns tempns
# Delete the namespace (will force close all sockets)
$ sudo ip netns delete tempns
Add these to your application code:
// Set SO_REUSEADDR and SO_REUSEPORT
int optval = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
Also consider adding proper signal handlers:
void cleanup(int sig) {
if (sockfd != -1) {
close(sockfd);
sockfd = -1;
}
exit(0);
}
signal(SIGTERM, cleanup);
signal(SIGINT, cleanup);