Linux 开放端口:管理防火墙端口的分步指南
Linux 中的临时客户端端口默认为 32768 至 60999(在 /proc/sys/net/ipv4/ip_local_port_range 中配置),不必与 49152 至 65535 端口匹配。但是,如果您的系统上已使用此端口,请选择任何其他关闭的端口 - 最主要的是其编号大于 1023。在 Linux 中打开端口之前,列出监听端口并选择不在此列表中的空闲端口 >1023(例如,从注册范
大家好!我是大聪明-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
这些命令将显示当前防火墙配置,包括允许和阻止的规则和服务。
常见错误和调试
解决配置后端口保持关闭的问题
如果配置后端口仍然关闭,则可能有多种原因,包括:
-
防火墙服务未运行或配置不正确。
-
该端口已被其他服务或进程使用。
-
配置更改未应用或被其他设置覆盖。
要诊断问题,请执行以下操作:
-
检查防火墙服务的状态并确保其正在运行。
-
使用
netstat或ss检查端口是否繁忙。 -
检查您的防火墙配置文件并确保更改已正确应用。
如果端口仍未打开,请尝试以下操作:
-
检查系统日志中是否存在与防火墙相关的错误。
-
暂时禁用防火墙,并检查端口是否打开。如果打开,则可能是有规则阻止了该端口。
-
确保防火墙管理工具(例如 ufw、firewalld、iptables)之间没有冲突。
确保防火墙服务的运行和正确配置
要确保防火墙服务处于活动状态并正确配置,请按照以下步骤操作:
-
使用命令
systemctl status ufw或检查防火墙服务的状态systemctl status firewalld。 -
确保该服务已启用,可在启动时自动启动:
systemctl enable ufw或systemctl enable firewalld。 -
检查您的防火墙配置文件以确保设置正确且是最新的。
如果防火墙服务未运行或配置不正确,请按照以下步骤操作:
-
重新启动防火墙服务。
-
检查配置文件中的错误。
-
确保防火墙规则中所需的端口已打开。
检查防火墙管理工具之间的冲突
要检查防火墙管理工具之间的冲突,请按照以下步骤操作:
-
识别所有已安装的防火墙管理工具(例如 iptables、ufw、firewalld)。
-
确保只有一个工具处于活动状态并管理规则。
-
禁用或删除冲突的工具,以便规则由单个选定的工具控制。
如果问题仍然存在,请尝试以下操作:
-
检查是否有其他服务或进程正在使用该端口。
-
查看系统日志中与此端口相关的错误。
-
如果该端口正在被其他服务使用,请考虑将其重新配置为使用其他端口。
防火墙工具比较:iptables、ufw 和 firewalld 在开放端口方面的优缺点
|
工具 |
描述 |
优点 |
缺点 |
命令示例 |
|
iptables |
用于配置网络数据包过滤规则的命令行实用程序。 |
高度可定制、强大且灵活。 |
学习曲线陡峭,语法复杂。 |
|
|
ufw |
用于管理基于 netfilter 的防火墙的简单命令行实用程序。 |
易于使用,语法清晰,用户友好。 |
自定义选项有限,不如 iptables 强大。 |
|
|
防火墙 |
用于管理防火墙规则的动态守护进程。 |
易于使用,支持动态配置和区域。 |
对于高级用户来说可能难以管理。 |
|
上面的示例命令打开端口 4000(用于给定命令中的 TCP)。
常见问题 (FAQ)
-
如何在 Linux 中打开端口?
要在 Linux 中打开端口,您需要配置防火墙以允许该端口上的传入流量。具体步骤取决于您使用的防火墙软件。ufw、firewalld和 的示例iptables:
-
对于
ufw(简单防火墙):sudo ufw allow <port_number>/tcp -
为了
firewalld:sudo firewall-cmd --add-port=<port_number>/tcp --permanent && sudo firewall-cmd --reload -
为了
iptables:sudo 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或进行检查ss:nc
-
使用 netstat:
netstat -lntu | grep 22 -
使用 ss:
ss -lntu | grep 22 -
使用 nc:
nc -z -v -n localhost22
如果端口 22 已打开,您将在输出中看到它。
4. 如何检查随机端口是否开放?
使用netstat或ss:
-
使用 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.是否可以打开一系列端口而不是只打开一个端口?
是的,您可以开放一系列端口。具体步骤取决于您使用的防火墙软件。例如ufw、firewalld和iptables:
-
对于 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 中打开新端口并将其配置为接受传入连接。我们还使用了netstat、ss、telnet和nc来nmap检查端口状态并测试连接。我们使用ufw/ firewalld/打开了端口范围iptables。
更多推荐
所有评论(0)