我正在尝试使用将一些证书复制到我的服务器上scp
。
$ scp ./cert.* [email protected]:/tmp/
cert.crt 100% 2386 0.1KB/s 00:18
packet_write_wait: Connection to 192.168.0.42 port 22: Broken pipe
lost connection
第一个文件被写入服务器,但不完整,因为哈希和与原始文件不匹配。
每次我尝试使用scp
这些文件(crt
、key
和p12
)时都会发生这种情况。
使用 Ubuntu 16.10 ( OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016
) 和 Windows 10 ( WinSCP 5.9.4
) 进行测试。两者都无法复制文件。
可能值得一提的是,我已连接到 OpenVPN 服务器,以便到达目标服务器 (192.168.0.42) - 但这不应该是问题。
为什么管道会破裂以及如何成功将文件 scp 到服务器上?
编辑:正如评论中所建议的,这很可能与 MTU 有关 - 但是,我不太确定如何解决这个问题。
答案1
降低 OpenVPN 连接的 MTU 对我有用。
来自 OpenVPN 手册:
--mssfix max 向在隧道上运行的 TCP 会话宣告它们应该限制其发送数据包大小,以便 OpenVPN 封装它们后,OpenVPN 发送到其对等方的结果 UDP 数据包大小不会超过最大字节。默认值为 1450。
max参数的解释方式与--link-mtu参数相同,即添加封装开销后的UDP数据包大小,但不包括UDP标头本身。生成的数据包对于 IPv4 最多增加 28 字节,对于 IPv6 最多增加 48 字节(IP 标头最多增加 20/40 字节,UDP 标头最多增加 8 字节)。默认值 1450 允许 IPv4 数据包通过 MTU 1473 或更高的链路传输,而不会出现 IP 级别分段。
仅当您使用 UDP 协议进行 OpenVPN 对等通信(即 --proto udp)时,--mssfix 选项才有意义。
--mssfix 和 --fragment 可以理想地一起使用,其中 --mssfix 将首先尝试阻止 TCP 需要数据包分段,并且如果大数据包无论如何通过(来自 TCP 以外的协议), --fragment 将他们内部分裂。
--fragment 和 --mssfix 都旨在解决 OpenVPN 对等点之间的网络路径上的路径 MTU 发现中断的情况。
此类故障的常见症状是 OpenVPN 连接成功启动,但在活跃使用期间停止。
如果 --fragment 和 --mssfix 一起使用,--mssfix 将从 --fragment max 选项中获取默认 max 参数。
因此,可以使用以下选项将最大 UDP 数据包大小降低到 1300(这是解决 MTU 相关连接问题的良好第一次尝试):
--tun-mtu 1500 --fragment 1300 --mssfix
我将以下内容添加到 OpenVPN 配置中:
mssfix 1200
我还假设可以调整该值以获得更好的性能。