expecting SSH2_MSG_KEX_ECDH_REPLY
就上下文而言,我最初的问题是,当我通过 VPN(在本例中,在 pfSense 中运行的 OpenVPN)连接到服务器时,我与服务器的 ssh 连接挂起。
互联网表明这可能与 MTU 问题有关。
尝试调试此问题时,发生了以下情况:
ping -s 297 -M do $HOST
工作正常,但是
ping -s 298 -M do $HOST
只是挂了。
我的机器、主机和 pfSense 接口上的 MTU 都设置为 1500(尽管该接口在 pfSense 的 UI 中被禁用,但我不确定是否应该这样)。
为什么会发生这种情况?是不是有什么东西阻止了过大的数据包?我在哪里可以找到更多线索?
mtr $HOST
表示两跳:到 pfSense,然后到服务器本身
答案1
事实上,您在控制的主机上设置了 MTU 并不意味着什么,因为它们之间的数据包 - 理论上 - 可以通过任何具有任何 MTU 的介质传输。
为了解决这个问题(除了 IP 分片机制),所谓的“路径 MTU 发现”机制是存在的。
请注意,它依赖于 ICMP 协议才能正常工作。除了其他事项之外,这意味着如果您的防火墙设置严格,则必须具有类似
iptables -t nat -A $CHAIN -m state --state RELATED -j ACCEPT
在您的INPUT
链规则中(FORWARD
如果您的防火墙也为其客户端执行 SNAT,则在链中)。
“相关”状态意味着,当收到类型 3、代码 4(目标不可达/需要分片)的 ICMP 数据包时,conntrack 子系统将决定它与哪个连接与...有关然后将其进一步传递到 netfilter 堆栈。此类数据包的状态为“RELATED”,这是已知的
iptables
¹,因此如果您拒绝传递此类数据包(当人们全面禁用所有内容然后打出最小的漏洞时经常发生这种情况),P-MTU 发现将无法正常工作。
还要注意,即使您“取消”对 P-MTU 的正确支持,它仍然可能在某处被破坏。
为了解决这个问题,至少有两个方法:
- 将 MSS 限制为 MTU在 IP 堆栈中。
tun-mtu
通过其、tun-mtu-extra
和旋钮在 OpenVPN 级别限制这些内容mssfix
。
请注意,这些设置确实会影响性能,因此请作为最后的手段使用。
¹ 因为虽然它不是 IP 交换的一部分,但显然与之相关。
答案2
我遇到了完全相同的问题:使用大小 297 执行 ping 操作有效,但使用大小 298 执行 ping 操作无效。
我们的客户端配置为不使用压缩:
comp-lzo no
将其更改为使用压缩解决了该问题:
comp-lzo yes
我不明白为什么这有效,但事实确实如此。
答案3
我在家里也遇到过类似的问题,SSH 连接挂在(我记得)连接设置的完全相同的位置。对我来说,调整本地 MTU 设置有助于在一定程度上减少问题,但要使问题消失,我必须打开 TCP MTU 探测。这样做之后,我再也没有遇到类似的问题。仅允许RELATED
数据包通过 iptables,如kostix 的回答,沒有幫助。
对于 Linux,尝试
sudo sysctl net.ipv4.tcp_mtu_probing=1
可能的值包括:
0
= 已禁用1
= 默认情况下禁用,当检测到 ICMP 黑洞时启用2
= 始终启用,使用 tcp_base_mss 的初始 MSS
其他操作系统将会类似又有所不同。
请注意,这需要在客户端系统上完成,而不是防火墙(因此不在 pfSense 框上)——除非您从防火墙启动 SSH 连接。