在本文中,我们将分析如何在 Linux 中检查端口状态和打开端口。本文是基于 CentOS 8 系统编写的,因此它适用于 CentOS/RHEL 7/8、Fedora、Oracle Enterprise Linux 以及整个 Red Hat 系列操作系统。
检查 Linux 端口状态
要查看已打开的端口列表,可以使用 nmap
来检查端口状态:
[root@centos-8 ~]# nmap localhost
Starting Nmap 7.70 ( https://nmap.org ) at 2020-03-22 12:08 IST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000024s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind
Nmap done: 1 IP address (1 host up) scanned in 1.71 seconds
可以看到上图中的 CentOS 8 只打开了两个端口。
检查监听端口列表
可以使用 netstat 列出处于监听状态的 TCP 端口。
[root@centos-8 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1627/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 26893/sshd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 26893/sshd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
为某些服务打开端口
当我们打开某项服务时,该服务将打开对应端口。例如,当启动 SSHD 服务时,默认情况下它将启动 22 端口。
在之前的内容中,我们知道在示例 CENTOS 8 上已经开启了 22 端口。如果我们停止 sshd 服务:
[root@centos-8 ~]# systemctl stop sshd
当再次检查端口运行状态时,22 端口已经关闭:
[root@centos-8 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1627/dnsmasq
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
可以使用相应服务的配置文件来更改默认端口。完成后重新启动服务,便会自动打开 Linux 上相应的端口。如果要为服务使用自定义端口,那么还应该将其添加到/etc/services
。
防火墙开放端口
您的端口也可能在防火墙中被禁用。如果您的端口未在其中列出,nmap
则很可能已被防火墙阻止。
我们可以使用 firewalld 命令设置防火墙打开端口。先确定系统的网络接口位于哪个区域。在以下示例中,eth0 和 eth1 接口位于“公共”区:
[root@centos-8 ~]# firewall-cmd --get-active-zones
libvirt
interfaces: virbr0
public
interfaces: eth0 eth1
要在防火墙中永久打开某个端口,请使用 --add-port
选项。下面的示例在“公共”区域中永久打开 TCP 端口 1234。请注意,更改后要重新加载 firewalld 服务,否则更改不会生效。
[root@centos-8 ~]# firewall-cmd --zone=public --add-port=1234/tcp --permanent
success
[root@centos-8 ~]# firewall-cmd --reload
success
如果不想永久开放,需把 --permanent
去掉。暂时性开放更改将立即生效,并将持续到重新加载防火墙。
一旦通过 firewalld 打开端口,接下来可以使用 netstat 检查端口状态:
[root@centos-8 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1627/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 28188/sshd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 28188/sshd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
我们在这里看不到端口 1234。这是因为当前端口 1234 未绑定到任何服务。该端口是处于 OPEN 状态,但是 NOT LISTENING 的。一旦某项请求或服务尝试使用 1234 端口,就会将其置于 LISTEN 状态。
使用 nc 或 ncat 打开一个端口
让我们验证一下,使用 nc
或 ncat
在 Linux 中打开一个端口,可以使用 yum 或 dnf 安装它们。使用 nc 命令打开 1234 端口。
[root@centos-8 ~]# nc --listen --source-port 1234
打开另一个终端检查该端口状态:
[root@centos-8 ~]# netstat -ntlp | grep 1234
tcp 0 0 0.0.0.0: 1234 0.0.0.0:* LISTEN 28983/nc
tcp6 0 0 ::: 1234 :::* LISTEN 28983/nc
如上所示,端口 1234 正在侦听 IPv4 和 IPv6。要仅使用 IPv4 ,请在上述命令中使用 -4:
[root@centos-8 ~]# nc --listen --source-port 1234 -4
然后在另一个终端上,检查端口 1234 的状态:
[root@centos-8 ~]# netstat -ntlp | grep 1234
tcp 0 0 0.0.0.0:1234 0.0.0.0:* LISTEN 29329/nc
使用 nc 或 ncat 打开端口并传输文件
我们还可以使用 nc
将文件从一台主机传输到另一台主机。在这里,我将把“ inputfile
”从 centos-8
转移到 rhel-8
客户端上,我们将打开一个随机端口,这里我们使用 9899。
[root@rhel-8 ~]# ncat --verbose --listen 9899 > outputfile
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Listening on :::9899
Ncat: Listening on 0.0.0.0:9899
Ncat: Connection from 192.168.43.250.
Ncat: Connection from 192.168.43.250:40242.
接下来开始传输,使用以下命令:
[root@centos-8 ~]# ncat --verbose 192.168.43.157 9899 < inputfile
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.43.157:9899.
Ncat: 19 bytes sent, 0 bytes received in 0.01 seconds.
如果遇到任何问题,可以检查服务器和客户端之间的防火墙。可能是相应的端口被阻止了,必须使用 firewalld 命令开放端口。
扩展阅读:
作者:牛奇网,本站文章均为辛苦原创,在此严正声明,本站内容严禁采集转载,面斥不雅请好自为之,本文网址:https://www.niuqi360.com/linux/open-a-port-in-linux-centos/