telnet
只需打开一个套接字或连接到另一个 IP:Port。没有办法专门阻止 telnet 到端口,同时也阻止应用程序运行。
如果在端口上运行的应用程序希望请求以准确的格式出现,则您可以针对端口限制 telnet 的功能。但是一个足够聪明的用户也可以以正确的方式格式化他的请求。如果您的应用程序需要二进制格式的请求(SSL、OCSP 等),那么 telnet 几乎毫无用处,因为 telnet 以 ASCII 格式发送字符。
无论哪种方式,打开连接都有四种可能的响应(也就是对 的四种可能的响应telnet
)。他们都启动之后telnet
将第一SYN
的的三方握手。如果您试图控制对 Telnet 的响应,您必须了解这四个选项中的每一个
- 客户端发送
SYN
,服务器用 TCP 响应SYN ACK
这是正在接受的连接。这是表明连接已被接受的唯一响应。
- 客户端发送
SYN
,服务器用 ICMP 消息响应:Destination Unreachable - Port Unreachable
ICMP 将其不同的消息组织成不同的“类型”。Destination Unreachable 消息是 ICMP 类型 3 消息。
ICMP 还可以将不同的类型进一步划分为各种“代码”。Port Unreachable 消息是ICMP 类型 3 代码 3 消息。
这种回应是理想主义的,“互联网的早期”暗示回应。当互联网是一个值得信赖的地方时,这非常有帮助。它告诉您“嘿,您尝试连接的 IP 是可访问的,但您使用的特定端口未处于活动状态。”
- 客户端发送
SYN
,服务器用 TCP 响应RST
遇到 ICMP 被阻止的防火墙策略并不少见。在这些情况下,如果服务器用上述 ICMP 类型 3 代码 3 响应,它将被丢弃并且客户端将什么也没有收到(我们将在 #4 中讨论)。或者有时由于 NAT 的复杂性,从服务器到客户端的 ICMP 消息将无法“通过”单向 NAT。
因此,服务器必须指示端口不接受连接的另一种方式是使用 RST 响应 SYN——这会立即终止客户端上的连接。
这与上述第二个选项的效果类似,但它不依赖于 ICMP 是否被允许从服务器返回到客户端。
- 客户端发送
SYN
,客户端没有收到任何响应
telnet 的最终结果是 Client 什么也没收到。它可能什么也没有收到,因为 ICMP Type3 Code3 消息被阻止或从未发送过。或者 TCP RST 消息被阻止或从未发送。或者它也可能没有收到任何信息,因为 IP 地址不存在。从发起连接的客户端的角度来看,所有这三种情况都是相同的——没有收到响应。
此选项有时也称为静默丢弃或静默拒绝连接。服务器(或防火墙)丢弃初始 SYN 并且不发送任何内容。
从安全角度和“不信任 Internet”的角度来看,这通常是首选响应。因为它不向客户端提供任何信息。
- 服务器是否存在?没办法说。
- 端口是否开放?没办法说。
- 我的数据包到达服务器了吗?没办法说。
- 响应数据包是否返回到客户端?没办法说。
- 是否在传输中阻止了我的连接尝试?没办法说。
- 传输中是否有什么东西阻塞了服务器的响应?没办法说。
- 是否有许多其他原因阻止了它的工作?对。
客户对上述#2 和#3 的响应是(几乎)即时的。一旦收到 RST 或 ICMP Type3 Code3 消息,客户端就可以显示错误消息。
但是,使用选项 4,客户端只能坐下来等待特定的超时时间,并且当该时间到期时向客户端显示“连接超时”。
大多数防火墙 ACL(等)在拒绝连接时实现此方法。
回到您的问题,了解上述四种可能的结果,您需要确定您想要的结果。我相信您正在寻找第四个,这意味着您必须:
- 停止应用程序在该端口上运行 - 不理想
- 阻止
ICMP Type 3 Code 3
到达客户端的结果 - 不是特别困难,但可能会比您预期的更多。并非所有阻止 ICMP 响应的方法都能够阻止作为特定 TCP SYN 的结果的 ICMP 响应,因此您很难准确确定您希望防火墙阻止什么
- 停止
TCP RST
到达客户端的结果 - 有点困难,除非您的服务器(或防火墙,如果正在执行丢弃)可以配置为简单地不发送 RST。