![当我的第二个接口启动时,几秒钟后 SSH 连接超时](https://linux22.com/image/116106/%E5%BD%93%E6%88%91%E7%9A%84%E7%AC%AC%E4%BA%8C%E4%B8%AA%E6%8E%A5%E5%8F%A3%E5%90%AF%E5%8A%A8%E6%97%B6%EF%BC%8C%E5%87%A0%E7%A7%92%E9%92%9F%E5%90%8E%20SSH%20%E8%BF%9E%E6%8E%A5%E8%B6%85%E6%97%B6%20.png)
所以我现在不知道要做什么来调试。我在这个问题上花了几周时间,但不明白发生了什么。
我试图让 ssh 服务器仅处理来自管理子网的连接,但这不应阻止从任何子网到管理子网的路由流量。
这是设置。我有一个 debian 9 下的虚拟机。该虚拟机有两个接口,eth0 在用户子网上,eth1 在管理子网上。两个子网都有一个 DHCP/DNS 服务器,即 pfsense。主机名会自动添加到 DNS。
我的 sshd 配置文件默认打开,禁用 root 登录并ListenAddress
设置为 eth1 IP。
到目前为止,这是我所看到的行为:
两个接口均已启动,ListenAddress
启用:
- 通过 pfsense 路由器从用户网络进行 ssh:连接已建立,可以运行很短的时间,然后终端冻结并超时。在wireshark上我此时有一些TCP重传
- 直接从管理网络 ssh:一切正常
- 从具有两个网络的计算机进行 ssh:一切正常
- 来自第三个网络的 ssh(规则禁止访问用户网络):一切正常
两个接口均已启动,ListenAddress
已禁用:
- 一切正常,但当然可以通过用户网络接口使用 ssh
接口 eth0 关闭,ListenAddress
已启用:
- 一切正常
服务器上故意没有任何防火墙。我使用 IP 地址而不是主机名进行 ssh,但无论两个接口具有相同或不同的主机名,两者都会得到相同的结果。
我实在不知道问题从何而来。对我来说,它不可能是 pfsense,因为现在它只是允许来自用户网络的所有网络流量进入管理网络。但也许我错了。 sshd 日志中也没有错误。
答案1
您的问题是,服务器发送的 TCP 数据包使用与您发送给它的 TCP 数据包不同的路径,然后您的 pfsense 认为连接尚未建立,并将其从已建立的连接表中删除,随后拒绝任何传入的数据包。
从用户网络上的计算机发送到服务器的 TCP 数据包将发送到 pfsense 路由器,后者将它们转发到 ssh 服务器。由于您的 ssh 服务器在您的用户网络上有一个接口,因此返回数据包将通过其在用户网络上的接口直接发送到您的计算机。因此,pfsense 只能看到从您的计算机到服务器的数据包,并且由于第一个 TCP SYN 帧尚未得到确认,因此它会在一段时间后确定连接已断开并丢弃后续数据包。
pfsense 上的一个快速解决方法是对从用户网络到管理网络的 ssh 数据包进行 SNAT。因此,ssh 服务器将使用 pfsense 作为其返回路径。当然,ssh 服务器将无法知道实际的源地址。
更好的方法是使用基于源的路由。看这个问题例如。