Linux系统:如何安全高效地开放端口(防火墙配置详解)

简介

端口是通信的端点。在操作系统中,端口可以对特定进程或网络服务的数据包进行开放或关闭。

通常,端口用于识别特定的网络服务。虽然可以通过手动配置服务来使用不同的端口,但通常情况下,会使用默认设置。

最初的1024个端口(端口号从0到1023)被称为“众所周知端口号”,它们被保留用于最常用的服务,例如SSH(端口22)、HTTP(端口80)和HTTPS(端口443)。

超过1024的端口号被称为“临时端口”。

  • 端口号1024到49151被称为“注册/用户端口”。
  • 端口号49152到65535被称为“动态/私有端口”。

在本教程中,您将在Linux上打开一个临时端口,因为最常见的服务使用众所周知的端口。

信息:

使用Silicon Cloud应用平台从GitHub部署您的应用程序,让Silicon Cloud专注于扩展您的应用。

先决条件

完成本教程,您需要准备以下工具:

  • 熟悉终端的使用。

列出所有开放端口

在Linux上打开一个端口之前,您必须检查所有已打开的端口列表,并选择一个不在该列表中的临时端口来打开。

使用netstat命令列出所有打开的端口,包括TCP和UDP,它们是网络层中用于数据包传输的最常见协议。

  1. netstat -lntu

这将打印出:

  • 所有监听套接字 (-l)
  • 端口号 (-n)
  • TCP端口 (-t)
  • UDP端口 (-u)
输出
Active 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

注意:

如果您的发行版没有netstat命令,您可以使用ss命令来检查监听套接字,显示开放端口。使用ss命令列出具有开放端口的监听套接字,以验证您是否正在接收一致的输出。
  1. ss -lntu

这将打印出:

输出
Netid  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:*

这几乎提供了与netstat相同的开放端口信息。

在Linux上打开一个端口以允许TCP连接

现在,打开一个关闭的端口,并使其监听TCP连接。

为了本教程的目的,您将打开4000端口。然而,如果该端口在您的系统中已被占用,可以选择另一个未被占用的端口。只需确保其数值大于1023即可。

使用netstat命令确保端口4000未被使用。

  1. netstat -na | grep :4000

或者是ss命令:

  1. ss -na | grep :4000

输出必须保持空白,以证明当前未被使用,这样您就可以手动将端口规则添加到系统的iptables防火墙中。

对于Ubuntu用户和基于ufw的系统

使用ufw,它是Uncomplicated Firewall的命令行客户端。

您的指令将会类似:

  1. sudo ufw allow 4000

请查阅您所使用的系统发行版的《如何设置 ufw 防火墙设置》。

注意:

Ubuntu 14.0.4:“允许特定端口范围”

Ubuntu 16.0.4/18.0.4/20.0.4/22.0.4:“允许其他连接/特定端口范围”

Debian 9/10/11:“允许其他连接/特定端口范围”

对于基于CentOS和firewalld的系统

使用firewall-cmd命令行客户端控制firewalld服务。

您的命令将类似于:

  1. firewall-cmd –add-port=4000/tcp

请参考您的发行版本的防火墙设置指南。

注意:

CentOS 7/8:“为您的应用程序设置规则/为您的区域打开端口”

Rocky Linux 8/9:“为您的应用程序设置规则/为您的区域打开端口”

对于其他Linux发行版

使用iptables来更改系统的IPv4数据包过滤规则。

  1. iptables -A INPUT -p tcp –dport 4000 -j ACCEPT

 

请参考适用于您所使用的发行版的《如何使用iptables设置防火墙》。

注意:

Ubuntu 12.04:「一种基本的防火墙」
Ubuntu 14.04:「接受其他必要的连接」

测试新打开的端口是否能进行TCP连接。

现在你成功打开了一个新的TCP端口,是时候对其进行测试了。

首先,在端口(-p)4000上启动netcat(nc)并监听(-l),同时将ls的输出发送给任何已连接的客户端。

  1. ls | nc -l -p 4000

 

现在,当客户端在4000端口上打开了TCP连接后,他们将收到ls命令的输出。现在暂不要关闭此会话。

在同一台机器上打开另一个终端会话。

由于您开放了一个TCP端口,请使用telnet检查TCP连接性。如果该命令不存在,请使用您的软件包管理器进行安装。

输入服务器的IP地址和端口号(以本例中的4000为例),然后运行此命令。

  1. telnet localhost 4000

 

这个指令尝试在本地主机的4000端口上打开一个TCP连接。

你将会得到类似于这样的输出,表明已与监听程序(nc)建立了连接。

输出

Trying ::1… Trying 127.0.0.1… Connected to localhost. Escape character is ‘^]’. while.sh

ls的输出(在这个例子中是while.sh)也已被发送给客户端,表明TCP连接成功。

在中国,使用nmap来检查端口是否开放:

  1. nmap localhost -p 4000

 

这个命令会检查开放的端口。

输出

Starting 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

端口已经打开。您已成功在您的Linux系统上打开了一个新的端口。

注意:

nmap只列出当前正在侦听的应用程序的已打开端口。如果您不使用任何侦听应用程序(例如netcat),这将显示端口4000为关闭,因为目前没有任何应用程序在该端口上侦听。同样,telnet也无法工作,因为它也需要一个侦听应用程序进行绑定。这就是为什么nc是如此有用的工具的原因。它可以在一个简单的命令中模拟这样的环境。但这只是暂时的,因为每次重新启动系统时,这些更改都会被重置。

持久化规则

本文介绍的方法只会在系统关机或重启之前暂时更新防火墙规则。因此,在重新启动后需要重复类似的步骤才能再次打开相同的端口。

对于ufw防火墙

防火墙规则在重新启动后不会重置。这是因为它被整合到启动过程中,内核通过应用适当的配置文件,使用ufw保存防火墙规则。

关于firewalld

你需要使用--permanent标志。

请参考您所使用的发行版的《如何设置firewalld》来进行操作。

注意:

CentOS 7/8:为您的应用程序设置规则。
Rocky Linux 8/9:为您的应用程序设置规则。

关于iptables

你需要保存配置规则。这些教程推荐使用iptables-persistent来实现。

请参考您所使用发行版的《如何使用iptables设置防火墙》来设置防火墙。

注意:

Ubuntu 12.04: “保存Iptables规则”
Ubuntu 14.04: “保存您的Iptables配置”

结论

在这个教程中,你学习了如何在Linux上打开一个新的端口,并设置它用于传入连接。你还使用了netstat、ss、telnet、nc和nmap。

继续学习,深入研究iptables防火墙工作原理,iptables和Netfilter架构,理解套接字,以及如何使用Top、Netstat、Du等工具监控服务器资源。

bannerAds