A port is a communication endpoint. Within an operating system, a port is opened or closed to data packets for specific processes or network services.
Typically, ports identify a specific network service assigned to them. This can be changed by manually configuring the service to use a different port, but in general, the defaults can be used.
The first 1024 ports (port numbers 0
to 1023
) are referred to as well-known port numbers and are reserved for the most commonly used services. These include SSH (port 22
), HTTP (port 80
), HTTPS (port 443
).
Port numbers above 1024 are referred to as ephemeral ports.
1024
to 49151
are called the registered/user ports.49152
to 65535
are called the dynamic/private ports.In this tutorial, you will open an ephemeral port on Linux, since the most common services use the well-known ports.
Deploy your applications from GitHub using DigitalOcean App Platform. Let DigitalOcean focus on scaling your app.
To complete this tutorial, you will need:
Before opening a port on Linux, you must check the list of all open ports, and choose an ephemeral port to open that is not on that list.
Use the netstat
command to list all open ports, including TCP and UDP, which are the most common protocols for packet transmission in the network layer.
- netstat -lntu
This will print:
-l
)-n
)-t
)-u
)OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:5432 :::* LISTEN
tcp6 0 0 ::1:6379 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
Note: If your distribution doesn’t have netstat
, you can use the ss
command to display open ports by checking for listening sockets.
Verify that you are receiving consistent outputs using the ss
command to list listening sockets with an open port:
- ss -lntu
This will print:
OutputNetid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:5432 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:27017 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.1:6379 0.0.0.0:*
tcp LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 128 [::1]:5432 0.0.0.0:*
tcp LISTEN 0 128 [::1]:6379 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 0.0.0.0:*
This gives more or less the same open ports as netstat
.
Now, open a closed port and make it listen for TCP connections.
For the purposes of this tutorial, you will be opening port 4000
. However, if that port is not open in your system, feel free to choose another closed port. Just make sure that it’s greater than 1023
.
Ensure that port 4000
is not used using the netstat
command:
- netstat -na | grep :4000
Or the ss
command:
- ss -na | grep :4000
The output must remain blank, thus verifying that it is not currently used, so that you can add the port rules manually to the system iptables firewall.
ufw
-based SystemsUse ufw
- the command line client for the Uncomplicated Firewall.
Your commands will resemble:
- sudo ufw allow 4000
Refer to How to Setup a ufw
Firewall on Ubuntu for more details.
firewalld
-based SystemsUse firewall-cmd
- the command line client for the firewalld
daemon.
Your commands will resemble:
- firewall-cmd --add-port=4000/tcp
Refer to How to Set Up firewalld
on CentOS for more details.
Use iptables
to change the system IPv4 packet filter rules.
- iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
Refer to How To Set Up A Firewall Using iptables
for more details.
Now that you have successfully opened a new TCP port, it is time to test it.
First, start netcat (nc
) and listen (-l
) on port (-p
) 4000
, while sending the output of ls
to any connected client:
- ls | nc -l -p 4000
Now, after a client has opened a TCP connection on port 4000
, they will receive the output of ls
. Leave this session alone for now.
Open another terminal session on the same machine.
Since you opened a TCP port, use telnet
to check for TCP Connectivity. If the command doesn’t exist, install it using your package manager.
Input your server IP and the port number (4000
in this example) and run this command:
- telnet localhost 4000
This command tries to open a TCP connection on localhost
on port 4000
.
You’ll get an output similar to this, indicating that a connection has been established with the listening program (nc
):
OutputTrying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
while.sh
The output of ls
(while.sh
, in this example) has also been sent to the client, indicating a successful TCP Connection.
Use nmap
to check if the port (-p
) is open:
- nmap localhost -p 4000
This command will check the open port:
OutputStarting Nmap 7.60 ( https://nmap.org ) at 2020-01-18 21:51 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
Other addresses for localhost (not scanned): ::1
PORT STATE SERVICE
4000/tcp open remoteanything
Nmap done: 1 IP address (1 host up) scanned in 0.25 seconds
The port has been opened. You have successfully opened a new port on your Linux system.
Note: nmap
only lists opened ports that have a currently listening application. If you don’t use any listening application, such as netcat, this will display the port 4000
as closed since there isn’t any application listening on that port currently. Similarly, telnet
won’t work either since it also needs a listening application to bind to. This is the reason why nc
is such a useful tool. This simulates such environments in a simple command.
But this is only temporary, as the changes will be reset every time you reboot the system.
The approach presented in this article will only temporarily update the firewall rules until the system shuts down or reboots. So similar steps must be repeated to open the same port again after a restart.
ufw
Firewallufw
rules do not reset on reboot. This is because it is integrated into the boot process, and the kernel saves the firewall rules using ufw
by applying appropriate config files.
firewalld
If you want to add the port to the firewall’s persistent configuration and apply the changes immediately, you can use the --permanent
and --reload
flags:
sudo firewall-cmd --permanent --add-port=4000/tcp
sudo firewall-cmd --reload
Refer to How to Set Up firewalld
for more details.
iptables
You will need to save the configuration rules and use the iptables-persistent
command.
Refer to How To Set Up a Firewall Using iptables
for more details.
iptables
to open specific portsTo open a specific port using iptables
, you can use the following command:
sudo iptables -A INPUT -p tcp --dport <port_number> -j ACCEPT
Replace <port_number>
with the actual port number you want to open. For example, to open port 4000
, you would use:
sudo iptables -A INPUT -p tcp --dport 4000 -j ACCEPT
This command adds a new rule to the INPUT
chain to allow incoming TCP traffic on the specified port.
ufw
(Uncomplicated Firewall) on Debian/Ubuntu systemsTo open a port using ufw
, you can use the following command:
sudo ufw allow <port_number>
Replace <port_number>
with the actual port number you want to open. For example, to open port 4000
, you would use:
sudo ufw allow 4000
This command adds a new rule to allow incoming traffic on the specified port.
firewalld
for port management on RHEL/CentOS systemsTo open a port using firewalld
, you can use the following command:
sudo firewall-cmd --add-port=<port_number>/tcp --permanent
sudo firewall-cmd --reload
Replace <port_number>
with the actual port number you want to open. For example, to open port 4000
, you would use:
sudo firewall-cmd --add-port=4000/tcp --permanent
sudo firewall-cmd --reload
The first command adds a new rule to allow incoming TCP traffic on the specified port, and the second command reloads the firewall configuration to apply the changes.
To list currently open ports, you can use the following commands:
netstat
:netstat -lntu
ss
:ss -lntu
netstat
:netstat -tlnp
This command will display all listening sockets, including the protocol, local address, foreign address, state, and the PID/Program name of the process that is listening on the socket.
nc
(Netcat):nc -z -v -n localhost 1-1024
This command will scan a range of ports on the localhost to check if they are open or not.
To verify firewall rules and active services, you can use the following commands:
iptables
:sudo iptables -L
ufw
:sudo ufw status
firewalld
:sudo firewall-cmd --list-all
These commands will display the current firewall configuration, including the rules and services that are allowed or blocked.
If a port remains closed after configuration, it may be due to a variety of reasons, including:
To troubleshoot this issue, you can try the following steps:
netstat
or ss
to verify if the port is already in use.If the port is still not open, you can try the following troubleshooting steps:
To ensure firewall services are active and correctly configured, you can follow these steps:
systemctl status ufw
or systemctl status firewalld
.systemctl enable ufw
or systemctl enable firewalld
.If the firewall service is not running or not configured correctly, you can try the following troubleshooting steps:
To check for conflicts with other firewall management tools, you can follow these steps:
iptables
, ufw
, and firewalld
.If you are still experiencing issues, you can try the following troubleshooting steps:
Tool | Description | Pros | Cons | Example Command |
---|---|---|---|---|
iptables | A command-line utility for configuring network packet filtering rules. | Highly customizable, powerful, and flexible. | Steeper learning curve, complex syntax. | sudo iptables -A INPUT -p tcp --dport 4000 -j ACCEPT |
ufw | A simple, easy-to-use command-line utility for managing a netfilter firewall. | Easy to use, simple syntax, and user-friendly. | Limited customization options, not as powerful as iptables. | sudo ufw allow 4000 |
firewalld | A dynamic daemon to manage firewall rules. | Easy to use, dynamic configuration, and supports zones. | Can be complex to manage for advanced users. | sudo firewall-cmd --add-port=4000/tcp --permanent |
The example commands used above are for opening port 4000 for TCP connections.
To open a port in Linux, you need to configure your firewall to allow incoming traffic on that port. The steps to do this vary depending on the firewall software you’re using. Here are examples for ufw
, firewalld
, and iptables
:
ufw
(Uncomplicated Firewall): sudo ufw allow <port_number>
firewalld
: sudo firewall-cmd --add-port=<port_number>/tcp --permanent && sudo firewall-cmd --reload
iptables
: sudo iptables -A INPUT -p tcp --dport <port_number> -j ACCEPT
Replace <port_number>
with the actual port number you want to open.
To check if port 443 is open in Linux, you can use the netstat
or ss
command to list all open ports, including TCP and UDP. Here’s how:
netstat
: netstat -lntu | grep 443
ss
: ss -lntu | grep 443
If port 443 is open, you should see it listed in the output.
To check if port 22 is open in Linux, you can use the netstat
, ss
, or nc
command to list all open ports, including TCP and UDP. Here’s how:
netstat
: netstat -lntu | grep 22
ss
: ss -lntu | grep 22
nc
: nc -z -v -n localhost 22
If port 22 is open, you should see it listed in the output.To check if a port is open in Linux, you can use the netstat
or ss
command to list all open ports, including TCP and UDP. Here’s how:
netstat
: netstat -lntu | grep <port_number>
ss
: ss -lntu | grep <port_number>
Replace <port_number>
with the actual port number you want to check. If the port is open, you should see it listed in the output.
Port 22 is typically open by default for SSH connections. If it’s not open, you can follow the steps to open a port in Linux (FAQ 1) and replace <port_number>
with 22
. Here are the specific commands to open port 22:
ufw
: sudo ufw allow 22
firewalld
: sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reload
iptables
: sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Yes, you can open a range of ports instead of a single port. The steps to do this vary depending on the firewall software you’re using. Here are examples for ufw
, firewalld
, and iptables
:
ufw
(Uncomplicated Firewall): sudo ufw allow <start_port>:<end_port>
firewalld
: sudo firewall-cmd --add-port=<start_port>-<end_port>/tcp --permanent && sudo firewall-cmd --reload
iptables
: sudo iptables -A INPUT -p tcp --dport <start_port>:<end_port> -j ACCEPT
Replace <start_port>
and <end_port>
with the actual port range you want to open.
Opening ports on your Linux system can be safe if done correctly and with caution. However, it also increases the attack surface of your system, making it more vulnerable to security threats. Here are some best practices to follow:
In this tutorial, you learned how to open a new port on Linux and set it up for incoming connections. You also used netstat
, ss
, telnet
, nc
, and nmap
to check if a port is open, open a range of ports, and test the newly opened port for TCP connections. Additionally, you explored how to persistently open ports using different firewall tools such as ufw
, firewalld
, and iptables
.
To further expand your knowledge on network connections and security, follow these tutorials:
These tutorials will help you master network connections, port scanning, and firewall setup on Linux systems.
Continue building with DigitalOcean Gen AI Platform.