大家好!我是大聪明-PLUS

端口是数据交换的逻辑端点。当存在监听套接字(进程绑定到地址/端口)时,端口被视为“打开”。防火墙仅允许或阻止流量,而不会自行“打开”或“关闭”端口。

“端口 ↔ 服务” 的关系并非一成不变:任何服务都可以配置为监听任何端口。/etc/services 和 IANA 注册表中的条目只是约定俗成的惯例,而非操作系统规则。

0 至 1023 端口是众所周知的。绑定到 1024 以下的端口需要 root/CAP_NET_BIND_SERVICE。1024 至 49151 端口是注册/用户端口,49152 至 65535 端口是 IANA 动态/私有端口。Linux 中的临时客户端端口默认为 32768 至 60999(在 /proc/sys/net/ipv4/ip_local_port_range 中配置),不必与 49152 至 65535 端口匹配。

在本指南中,您将打开端口 >1023,以便绑定不需要权限,并且不会与知名端口上的标准服务冲突。

监听端口列表

在 Linux 中打开端口之前,列出监听端口并选择不在此列表中的空闲端口 >1023(例如,从注册范围中)。

使用该命令netstat列出正在监听的 TCP/UDP 套接字 - 这些是传输层最常见的数据包传输协议。

netstat -lntu

输出将是:

  • 所有监听套接字(-l

  • 数字地址和端口(-n

  • TCP 端口(-t

  • UDP 端口(-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

 注意:如果您的发行版没有netstat,请使用ss列出监听套接字。

ss使用以下命令列出监听套接字,验证输出是否一致:

ss -lntu

输出将是:

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:*

这给出了与 netstat 大致相同的监听端口列表。

在 Linux 中打开端口以允许 TCP 连接

现在打开关闭的端口并接受传入的 TCP 连接。

在本指南中,您将打开端口 4000。但是,如果您的系统上已使用此端口,请选择任何其他关闭的端口 - 最主要的是其编号大于 1023。

使用以下命令检查端口 4000 是否未被使用netstat

netstat -na | grep :4000

或者通过命令ss

ss -na | grep :4000

输出为空表示当前无人在监听 4000 端口——这对于 nc 测试很有用。这不会影响添加防火墙规则。 

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

使用ufw- 简单防火墙的命令行客户端。

您的命令将类似于以下内容:

sudo ufw allow 4000/tcp

对于 CentOS 和基于防火墙的系统

使用firewall-cmd- firewalld 守护进程的命令行客户端。

您的命令将类似于以下内容:

sudo firewall-cmd --add-port=4000/tcp

对于其他 Linux 发行版

现代发行版默认使用 [ipv6] nftables/iptables-nft。最好通过 [ipv6]firewalld/ufw或原生 [ ipv6] 来管理它nft。如果您确实使用 [ipv6] iptables,请将该规则插入任何可能的 DROP 规则之上,并且不要忘记 IPv6:

sudo iptables  -I INPUT 1 -p tcp --dport 4000 -j ACCEPT

sudo ip6tables -I INPUT 1 -p tcp --dport 4000 -j ACCEPT

请注意可能与 发生冲突firewalld/ufw;为了保持一致性,请使用iptables-save/iptables-persistent

检查新打开的 TCP 连接端口

现在您已经成功打开了一个新的 TCP 端口,您需要对其进行测试。

首先,启动 netcat ( ) 并开始在端口 ( ) 4000 上nc监听 ( ) ,同时将命令输出发送到任何连接的客户端:-l-pls

  • 对于 OpenBSD nc:ls | nc -l 4000

  • 对于 ncat (nmap):ls | ncat -l 4000

  • 对于 netcat-traditional:ls | nc -l -p 4000

现在,当客户端打开到端口 4000 的 TCP 连接时,它将收到输出ls。保持此会话不变。

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

由于您已打开 TCP 端口,请使用 telnet 测试 TCP 的可用性。如果该命令不可用,请通过您的软件包管理器进行安装。

输入您的服务器的 IP 和端口号(示例中为 4000)并运行命令:

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检查端口是否开放(-p):

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

nmap 中的服务名称取自端口映射数据库,并不保证该特定服务确实正在运行;它是基于端口号的启发式方法。

端口已打开。您已成功在 Linux 系统上打开新端口。

注意:nmap显示端口状态。如果端口无人监听,通常会处于关闭状态;如果流量被防火墙过滤,则会被过滤。因此,如果没有监听器,telnet它将无法工作;nc它很方便,因为它可以快速设置监听器进行测试。

除非您使用持久配置,否则更改将是暂时的。对于 UFW,规则会自动保存;对于 firewalld,您需要--permanent--reload;对于 iptables,您需要单独保存规则。

保存规则

持久性取决于工具:ufw - 保存默认规则;在firewalld中使用--permanent && --reload;iptables - 通过保存iptables-save/iptables-persistent

对于 ufw 防火墙

ufw 规则在重启时不会重置。这是因为 ufw 集成在启动过程中:它的服务会读取配置文件并将规则写入 netfilter (iptables/nftables)。

对于firewalld

如果要将端口添加到永久防火墙配置并立即应用更改,请使用--permanent和标志--reload

sudo firewall-cmd --permanent --add-port=4000/tcp
sudo firewall-cmd --reload
对于 iptables

您将需要保存规则配置并使用包/实用程序iptables-persistent

使用不同的工具打开端口

使用 iptables 打开特定端口

要使用 iptables 打开特定端口,请使用以下命令:

sudo iptables -I INPUT 1 -p tcp --dport <port_number> -j ACCEPT

替换<port_number>为您需要打开的实际端口号。例如,要打开端口 4000:

sudo iptables -I INPUT 1 -p tcp --dport 4000 -j ACCEPT

此命令向 INPUT 链添加一条新规则,允许传入 TCP 流量到指定端口。

在 Debian/Ubuntu 系统上使用 ufw(简单防火墙)管理端口

要使用 打开端口ufw,请运行:

sudo ufw allow <port_number>/tcp

替换<port_number>为所需的数字。例如,要打开端口 4000:

sudo ufw allow 4000/tcp

此命令添加一条新规则,允许传入流量到指定端口。

使用 firewalld 管理 RHEL/CentOS 系统上的端口

要使用 firewalld 打开端口,请运行:

sudo firewall-cmd --get-active-zones

sudo firewall-cmd --zone=public --add-port=4000/tcp --permanent

sudo firewall-cmd --reload

(用 替换所需区域public,或使用--zone=$(firewall-cmd --get-default-zone))。

请替换<port_number>为实际数字。例如,要打开端口 4000:

sudo firewall-cmd --add-port=4000/tcp --permanent

sudo firewall-cmd --reload

 第一个命令添加一条新规则,允许传入 TCP 流量到指定的端口,第二个命令重新加载防火墙配置以应用更改。

监听端口列表

列出监听端口的命令

要列出监听端口,请使用以下命令:

  • 网络状态:

netstat -lntu

ss -lntu

netstat -tlnp

此命令将显示所有监听套接字,包括协议、本地地址、外部地址、状态以及正在监听套接字的进程的 PID/程序名称。

  • nc(Netcat):

nc -z -v -n localhost 1-1024

该命令将检查localhost上哪些端口是打开/关闭的。filtered它正确识别了标志nmap(当流量被防火墙/ACL阻止时),但nc不会显示此状态。

检查防火墙规则和活动服务

要检查防火墙规则和活动服务,请使用:

  • iptables:

sudo iptables -L

  • ufw:

sudo ufw status

sudo firewall-cmd --list-all

这些命令将显示当前防火墙配置,包括允许和阻止的规则和服务。

常见错误和调试

解决配置后端口保持关闭的问题

如果配置后端口仍然关闭,则可能有多种原因,包括:

  • 防火墙服务未运行或配置不正确。

  • 该端口已被其他服务或进程使用。

  • 配置更改未应用或被其他设置覆盖。

要诊断问题,请执行以下操作:

  • 检查防火墙服务的状态并确保其正在运行。

  • 使用netstatss检查端口是否繁忙。

  • 检查您的防火墙配置文件并确保更改已正确应用。

如果端口仍未打开,请尝试以下操作:

  • 检查系统日志中是否存在与防火墙相关的错误。

  • 暂时禁用防火墙,并检查端口是否打开。如果打开,则可能是有规则阻止了该端口。

  • 确保防火墙管理工具(例如 ufw、firewalld、iptables)之间没有冲突。

确保防火墙服务的运行和正确配置

要确保防火墙服务处于活动状态并正确配置,请按照以下步骤操作:

  • 使用命令systemctl status ufw或检查防火墙服务的状态systemctl status firewalld

  • 确保该服务已启用,可在启动时自动启动:systemctl enable ufwsystemctl enable firewalld

  • 检查您的防火墙配置文件以确保设置正确且是最新的。

如果防火墙服务未运行或配置不正确,请按照以下步骤操作:

  • 重新启动防火墙服务。

  • 检查配置文件中的错误。

  • 确保防火墙规则中所需的端口已打开。

检查防火墙管理工具之间的冲突

要检查防火墙管理工具之间的冲突,请按照以下步骤操作:

  • 识别所有已安装的防火墙管理工具(例如 iptables、ufw、firewalld)。

  • 确保只有一个工具处于活动状态并管理规则。

  • 禁用或删除冲突的工具,以便规则由单个选定的工具控制。

如果问题仍然存在,请尝试以下操作:

  • 检查是否有其他服务或进程正在使用该端口。

  • 查看系统日志中与此端口相关的错误。

  • 如果该端口正在被其他服务使用,请考虑将其重新配置为使用其他端口。

防火墙工具比较:iptables、ufw 和 firewalld 在开放端口方面的优缺点

工具

描述

优点

缺点

命令示例

iptables

用于配置网络数据包过滤规则的命令行实用程序。

高度可定制、强大且灵活。

学习曲线陡峭,语法复杂。

sudo iptables -I INPUT 1 -p tcp --dport 4000 -j ACCEPT

ufw

用于管理基于 netfilter 的防火墙的简单命令行实用程序。

易于使用,语法清晰,用户友好。

自定义选项有限,不如 iptables 强大。

sudo ufw allow 4000

防火墙

用于管理防火墙规则的动态守护进程。

易于使用,支持动态配置和区域。

对于高级用户来说可能难以管理。

sudo firewall-cmd --add-port=4000/tcp --permanent

上面的示例命令打开端口 4000(用于给定命令中的 TCP)。


常见问题 (FAQ)

  1. 如何在 Linux 中打开端口?

要在 Linux 中打开端口,您需要配置防火墙以允许该端口上的传入流量。具体步骤取决于您使用的防火墙软件。ufwfirewalld和 的示例iptables

  • 对于ufw(简单防火墙):sudo ufw allow <port_number>/tcp

  • 为了firewalldsudo firewall-cmd --add-port=<port_number>/tcp --permanent && sudo firewall-cmd --reload

  • 为了iptablessudo iptables -I INPUT 1 -p tcp --dport <port_number> -j ACCEPT

替换<port_number>为您要打开的实际端口号。

2. 如何检查Linux中的443端口是否打开?

要列出监听端口,请使用: netstat -lntu ss -lntu

  • 使用 netstat:netstat -lntu | grep 443

  • 使用 ss:ss -lntu | grep 443

如果端口 443 已打开,您将在输出中看到它。

3. 如何检查Linux中的22端口是否打开?

使用netstat或进行检查ssnc

  • 使用 netstat:netstat -lntu | grep 22

  • 使用 ss:ss -lntu | grep 22

  • 使用 nc:nc -z -v -n localhost 22

如果端口 22 已打开,您将在输出中看到它。

4. 如何检查随机端口是否开放?

使用netstatss

  • 使用 netstat:netstat -lntu | grep <port_number>

  • 使用 ss:ss -lntu | grep <port_number>

替换<port_number>为实际数字。如果端口上有监听器,则会显示该端口。为了确保网络可用性,请使用nc -z/nmap并遵守已过滤的状态。

5.如何在Linux中打开22端口?

端口 22 通常默认对 SSH 开放。如果端口 22 处于关闭状态,请按照步骤 1 中的步骤操作,并将端口 22 替换为:

  • 对于 ufw:sudo ufw allow 22/tcp

  • 对于防火墙:sudo firewall-cmd --add-port=22/tcp --permanent && sudo firewall-cmd --reload

  • 对于 iptables:sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

6.是否可以打开一系列端口而不是只打开一个端口?

是的,您可以开放一系列端口。具体步骤取决于您使用的防火墙软件。例如ufwfirewalldiptables

  • 对于 ufw(简单防火墙):sudo ufw allow <start_port>:<end_port>/tcp

  • 对于防火墙: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

<start_port>和替换<end_port>为您要打开的实际端口范围。

7. 在 Linux 中打开端口安全吗?

谨慎开放端口是安全的。然而,每个开放的端口都会增加攻击面和潜在风险。建议:

  • 仅打开应用程序或服务实际需要的端口。

  • 对监听开放端口的服务使用强密码和身份验证机制。

  • 定期更新您的系统和防火墙软件,以确保您拥有最新的安全补丁。

  • 监控系统日志以发现开放端口上的可疑活动。

  • 考虑“默认拒绝”防火墙策略,只允许明确需要的传入连接。

结论

在本指南中,我们学习了如何在 Linux 中打开新端口并将其配置为接受传入连接。我们还使用了netstatsstelnetncnmap检查端口状态并测试连接。我们使用ufwfirewalld/打开了端口范围iptables。 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐