In Linux networking, port numbers are 16-bit unsigned integers, which means the valid range is from 0 to 65535. This gives us:
Minimum port: 0 Maximum port: 65535
The entire port range is divided into three categories:
- Well-known ports (0-1023): Reserved for system services (HTTP, SSH, FTP, etc.)
- Registered ports (1024-49151): Assigned to specific applications by IANA
- Dynamic/private ports (49152-65535): Available for temporary use
When configuring services to use non-standard ports, consider these technical aspects:
# Example of setting SSH to port 22222 in /etc/ssh/sshd_config Port 22222
Best practices for port selection:
- Avoid ports below 1024 (requires root privileges)
- Choose memorable numbers within the upper range
- Check for conflicts with
netstat -tuln
orss -tuln
While 65535 is the theoretical maximum, some practical limitations exist:
# Kernel parameter affecting port range sysctl net.ipv4.ip_local_port_range # Typical output: 32768 60999
This shows the ephemeral port range used for outgoing connections.
Here's how to validate a port number in shell scripts:
#!/bin/bash validate_port() { local port=$1 if [[ ! $port =~ ^[0-9]+$ ]] || [ $port -lt 0 ] || [ $port -gt 65535 ]; then echo "Error: $port is not a valid port number (0-65535)" return 1 fi return 0 } # Usage example: validate_port 8080 || exit 1
When using non-standard ports, remember to update firewall rules:
# Example for UFW (Uncomplicated Firewall) sudo ufw allow 22222/tcp sudo ufw allow 50000:60000/udp
In Linux systems, TCP/UDP port numbers are 16-bit unsigned integers, which means the theoretical maximum port number is 65,535 (2^16 - 1). However, there are important practical considerations:
# To verify the maximum allowed port number programmatically:
cat /proc/sys/net/ipv4/ip_local_port_range
# Typical output: 32768 60999
The port space is divided into three ranges:
- Well-known ports: 0-1023 (requires root privileges)
- Registered ports: 1024-49151
- Dynamic/private ports: 49152-65535
When choosing non-standard ports for services, consider these constraints:
# Example of setting a high port for SSH in /etc/ssh/sshd_config
Port 54321
# Then restart the service:
sudo systemctl restart sshd
For production systems, follow these guidelines:
- Avoid ports below 1024 unless necessary
- Check IANA registered ports list for conflicts
- Document all custom port assignments
- Update firewall rules accordingly
# Verify port availability with netstat:
netstat -tulnp | grep ':54321'
# Or using ss:
ss -tulnp | grep '54321'
To modify the ephemeral port range (affects client connections):
# Temporary change:
echo "50000 60000" > /proc/sys/net/ipv4/ip_local_port_range
# Permanent change in /etc/sysctl.conf:
net.ipv4.ip_local_port_range = 50000 60000
Common issues and solutions:
- Check SELinux contexts when services fail to bind
- Verify firewall rules with iptables/nftables
- Test connectivity with telnet/nc
# Example connectivity test:
nc -zv localhost 54321
# Or using telnet:
telnet localhost 54321