SSH 客户端是否使用临时端口?

SSH 客户端是否使用临时端口?

帮我简化一下,我还在学习。

SSH 会话是在监听端通过端口 22(假设配置众所周知)创建的,但客户端是否使用相同的端口?还是使用临时端口?

我只需打开多个终端并连接,即可从同一客户端创建到不同服务器的多个 SSH 会话。这使我相信 SSH 发生在客户端的临时端口上。

但是,在远程端配置安全组时,我可以将临时端口留在出口配置中关闭,并且只允许通过端口 22 的入站和出站流量,并且我的 SSH 会话仍按预期工作 - 这告诉我 SSH 在两个方向上均通过端口 22 专门处理。

那么到底是哪一个呢?我开始认为我对临时端口、安全组和知名端口的整个理解是完全错误的。

答案1

任何 TCP 客户端(包括 SSH 客户端)都将在“客户端”端使用临时端口。这是 TCP 套接字的默认行为,除非程序明确绑定到某个本地端口。

您可以亲自使用ss -tn/netstat -tn列出活动套接字(在客户端或服务器上),或使用数据包捕获工具(,,wireshark)查看实际的 TCP 数据包 - 及其端口和其他参数。termsharktcpdump -n

您的防火墙规则允许 SSH,因为它们只检查一个端口,而不是两个。在几乎所有情况下,如果您看到一个仅标记为“端口”的字段,它实际上意味着“目标端口”——很少(如果有的话)检查源端口是否有新连接,因此“端口 22”实际上意味着“任何→22”而不是“22→22”。

(这同样适用于“入站”和“出站”规则 - 例如“出站 TCP 端口 22”表示从服务器的临时端口发送的数据包另一个主机的端口 22,因此它永远不会匹配您的服务器发送到入站连接的回复。)

通常你不需要明确允许出站数据包到临时端口,因为许多防火墙有状态的– 它们会跟踪活动 TCP 连接使用的源/目标端口,并自动允许看似属于“已建立”连接的数据包。它们还会对 UDP 执行相同操作(跟踪“最近”数据包使用的临时端口)。

(例如,对于使用 iptables 或 ufw 作为防火墙的 Linux 服务器,您可以使用 查看其自己的状态表conntrack -L。)

总体而言,这意味着,例如,如果您正在查看 AWS 安全组中的“入站”和“出站”选项卡,则可以从整个连接的角度来思考,而不是单个数据包。允许“入站端口 22”将允许连接你的服务器,同时允许“出站端口 22”将允许连接您的服务器,并且在两种情况下,状态防火墙都会隐式地允许响应朝相反的方向进行。

相关内容