如何判断端口是开放还是关闭

3

我如何判断端口是开放还是关闭的?“开放端口”和“关闭端口”的确切含义是什么。

2个回答

1
一个已打开的端口是可以连接(TCP)/发送数据(UDP)的端口。它是开放的,因为有一个进程打开了它。
有许多不同类型的端口。在互联网上使用的是TCP和UDP端口。
要查看现有连接列表,您可以使用netstat(在Unix和MS-Windows下可用)。在Linux下,我们有-l(--listen)命令行选项来限制列表只显示已打开的端口(即监听端口)。
> netstat -n64l
...
tcp   0   0 0.0.0.0:6000         0.0.0.0:*            LISTEN
...
udp   0   0 0.0.0.0:53           0.0.0.0:*
...
raw   0   0 0.0.0.0:1            0.0.0.0:*            7
...

在我的例子中,我展示了一个TCP端口6000被打开。一般来说,这是为了X11访问(所以您可以在计算机之间打开窗口)。
另一个端口,53,是DNS系统使用的UDP端口。请注意,UDP端口是“刚刚打开”的。您始终可以向它们发送数据包。您不能像使用TCP/IP那样创建客户端/服务器连接。因此,在这种情况下,您看不到LISTEN状态。
这里的最后一个条目是“原始”。这是一种本地类型的端口,仅在同一台计算机内的进程之间起作用。进程可能会使用它来发送RPC事件等。

更新:

从那时起,netstat 已经有些被弃用了,您可能想要学习 ss

ss -l4n
  -- or --
ss -l6n

很遗憾,目前你必须为相应的堆栈(IPv4或IPv6)选择-4或-6。

如果您有兴趣编写C/C++代码或类似代码,可以从/proc/net/...中读取这些信息。例如,TCP连接可以在此处找到:

/proc/net/tcp   (IPv4)
/proc/net/tcp6  (IPv6)

同样地,您会看到UDP文件和Unix文件。
如果您只检查一个端口,可以通过编程方式尝试连接。如果端口开放,则会连接。然后可以立即关闭连接。
最后,有内核直接套接字连接可用于套接字诊断,如下所示:
int s = socket(
              AF_NETLINK
            , SOCK_RAW | SOCK_CLOEXEC | SOCK_NONBLOCK
            , NETLINK_SOCK_DIAG);

我对这个问题的主要困扰在于它实际上没有在某些东西改变时发送事件给你。但是你可以通过结构体读取当前状态,这比尝试解析 /proc/... 文件更安全。
我的eventdispatcher 库中有一些处理此类套接字的代码。只是因为内核不会自动生成事件(即推送仅需要在实际事件发生时发生一次更好),所以它仍然必须进行轮询以获取数据。

1

我最喜欢使用的检查特定端口是否打开或关闭的工具是telnet。在所有操作系统上都可以找到这个工具。

语法是:telnet <主机名/IP> <端口>

如果端口打开,它看起来像这样:

telnet localhost 3306

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

如果端口关闭,它看起来像这样:

telnet localhost 9999

Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host

根据您的使用情况,您可能需要从另一台机器执行此操作,以排除防火墙规则的问题。例如,仅因为我能够在本地 telnet 到端口 3306,并不意味着其他机器能够访问端口 3306。由于防火墙规则,它们可能会将其视为关闭状态。
至于开放/关闭端口的含义,开放的端口允许数据发送到监听该端口的程序。在上面的示例中,端口 3306 是开放的。MySQL 服务器正在监听该端口。这使得 MySQL 客户端可以连接到 MySQL 数据库并发出查询等操作。
其他工具可用于检查多个端口的状态。您可以在 Google 上搜索带有您所使用操作系统的 Port Scanner 以获取其他选项。

感谢你的回答。我这样理解它。如果我错了,请纠正我。端口是应用程序正在侦听并准备接收数据包的位置。关闭的端口是没有应用程序正在监听的位置,但数据包将到达该端口并被操作系统丢弃。 - user2378083
@user2378083 操作系统肯定会接收到关闭端口的连接尝试。这就是“端口敲门”的工作原理。http://en.wikipedia.org/wiki/Port_knocking - jglouie
请解释一下,封闭端口和开放端口之间的区别。 - user2378083
@user2378083 暂时忽略防火墙问题...开放端口被配置为接受数据包,关闭端口则拒绝或忽略所有数据包。维基百科对此解释得很清楚。http://en.wikipedia.org/wiki/Open_port。如果这不够帮助,请澄清您的问题并说明您要解决的确切问题。 - jglouie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接