把这个给我说清楚,我还在学习。
SSH 会话在侦听端通过端口 22(假设已知配置)创建,但客户端使用的端口是否相同?还是使用了临时端口?
我可以通过简单地打开几个终端并连接,从同一个客户端创建到不同服务器的多个 SSH 会话。这让我相信 SSH 发生在客户端的临时端口上。
但是,在远程端配置安全组时,我可以在出口配置中关闭临时端口,只允许通过端口 22 的入站和出站流量,并且我的 SSH 会话仍然按预期工作 - 这告诉我 SSH 仅通过端口 22 处理在两个方向。
那么它是哪一个?开始认为我对临时端口、安全组和知名端口的全部理解是完全错误的。
任何 TCP 客户端,包括 SSH 客户端,都将在“客户端”端使用临时端口。这是 TCP 套接字的默认行为,除非程序显式绑定到某个本地端口。
您可以使用
ss -tn
/netstat -tn
列出活动套接字(在客户端或服务器上),或使用数据包捕获工具(wireshark
、termshark
、tcpdump -n
)查看实际的 TCP 数据包 - 以及它们的端口和其他参数。您的防火墙规则允许 SSH,因为它们只检查一个端口,而不是同时检查两个端口。在几乎所有情况下,如果您看到一个仅标记为“端口”的字段,它实际上意味着“目标端口”——源端口很少(如果有的话)检查新连接,因此“端口 22”实际上意味着“任何→ 22”而不是“22→22”。
(这同样适用于“入站”和“出站”规则——例如,“出站 TCP 端口 22”是指从您服务器的临时端口发送到另一个主机的端口 22 的数据包,因此它永远不会匹配您的服务器发送到入站连接的回复。 )
通常你不需要明确允许出站数据包到临时端口,因为许多防火墙是有状态的——它们跟踪活动 TCP 连接使用的 src/dst 端口,并且会自动允许看起来属于“已建立”连接的数据包。他们也对 UDP 做同样的事情(跟踪“最近”数据包使用的临时端口)。
(例如,使用 iptables 或 ufw 作为防火墙的 Linux 服务器,您可以使用 . 查看它自己的状态表
conntrack -L
。)总的来说,这意味着例如,如果您查看 AWS 安全组中的“入站”和“出站”选项卡,您可以考虑整个连接,而不是单个数据包。允许“入站端口 22”将允许连接到您的服务器,而允许“出站端口 22”将允许来自您的服务器的连接,并且在这两种情况下,状态防火墙将隐式允许响应以相反的方向进行。