我有一个问题scp
:
scp -pr xyz.zip [email protected]:/home/myuser/tmp/
不起作用,而
scp -4 -pr xyz.zip [email protected]:/home/myuser/tmp/
有效,这里可能出现什么问题?
我的假设是 scp 尝试使用 IPv6,但路由不可用?如何在不使用 -4 选项的情况下调试并使其正常工作?
答案1
我的假设是 scp 尝试使用 IPv6,但路由不可用?如何在不使用 -4 选项的情况下调试并使其正常工作?
由于 scp 通过 SSH 运行,我会检查ssh
(或者可能ssh -6
)是否能够连接到服务器。通常我预计它会以同样的方式中断。但是,如果交互式 SSH shell 工作正常,而 SCP 文件传输在传输过程中冻结,则可能是 MTU 问题。
确保 DNS 中找到的 IPv6 地址确实正确。运行 时ssh -6 -v server.com
,它会显示它所连接的地址 - 检查它是否与服务器的 中看到的地址匹配ip -6 addr
。人们通常会更新他们的 A 记录(用于 IPv4),但忽略更新 IPv6 的 AAAA 记录。
也尝试访问ping -6
服务器。如果您还托管一个网站,请尝试使用 访问它curl -6
,等等。这可能是防火墙问题,即可能存在允许通过 IPv4 进行 SSH 访问但不允许通过 IPv6 进行 SSH 访问的防火墙规则。(例如,iptables
仅支持 IPv4,而必须使用 添加 IPv6 规则ip6tables
- 人们经常忘记在两个地方都添加规则。)
用于tcpdump
查看服务器是否接收到了您的 IPv6 数据包。(例如,tcpdump -n -i eth0 ip6
当然,在客户端和服务器上均以 root 身份接收。)如果您的计算机发送了数据包,但服务器未接收到,则可能是路由问题或网络级防火墙问题。
(例如,我刚刚在 Oracle Cloud 上设置了一台服务器,该服务器最近获得了 IPv6 支持,尽管他们的系统为该服务器颁发了 IPv6地址默认情况下,我仍然需要手动为 VPC 添加 IPv6 默认路由,以及添加 IPv6 安全组规则。)
如果您使用 进行传输scp -6 -v
,并且成功连接,但在传输过程中冻结,请再次查看 tcpdump 输出。如果您看到大的数据包被发送、重新发送、重新发送多次,但从未到达目的地 - 这是 MTU 问题(某些东西阻止了“数据包太大”ICMP 错误)。