我在尝试连接安装在 Arch Linux 客户虚拟机(使用堆栈设置:KVM、libvirt 和 QEMU)中的 mosh-server 时遇到了麻烦。
我有一个配置为:的端口转发virsh qemu-monitor-command --hmp arch_test 'hostfwd_add ::2222-:22'
,因此我可以连接ssh -p 2222 arch@localhost
,没有任何问题。
发出命令:mosh --server="LANG=de_DE.UTF-8 mosh-server" --ssh="ssh -p 2222" -p 60001:60001 arch@localhost
在客户端(主机)上,打开连接,但我留下一条消息说:
mosh:未从 UDP 端口 60001 上的服务器收到任何信息。[退出:Ctrl-^ 。]
当然,我去了常问问题尝试理解问题:
问:“未从 UDP 端口 60003 上的服务器收到任何内容”消息是什么意思?
这意味着 mosh 能够在远程计算机上成功启动 mosh-server,但客户端无法与服务器通信。这通常意味着某种类型的防火墙阻止了客户端和服务器之间的 UDP 数据包。如果您必须在 NAT 上转发 TCP 端口 22 以进行 SSH,那么您也必须转发 UDP 端口。Mosh 将使用第一个可用的 UDP 端口,从 60001 开始到 60999 结束。如果您只打算在服务器上进行少量并发会话,那么您可以转发较小范围的端口(例如,60000 到 60010)。
netstat、netcat、socat 和 tcpdump 等工具可用于调试网络和防火墙问题。
此问题也可能是 glibc 2.22 中的一个错误造成的,该错误会影响与 protobuf 和 utempter 链接并使用激进编译器强化标志的程序。(glibc 错误跟踪器条目以及 Mosh 错误跟踪器条目。)此问题导致 mosh-server 在启动时立即出现段错误。我们相信我们已经在 Mosh 1.2.6 中解决了这个问题,但如果您发现其他问题,请报告错误。
之后,我尝试了以下操作:
- 确保我有一个 UDP 端口转发,例如:
virsh qemu-monitor-command --hmp arch_test 'hostfwd_add udp::60001-:60001'
; - 确保防火墙(如果有)打开了此端口:(
firewall-cmd --zone=public --add-port=60000-60010/udp
检查哪个区域处于活动状态之后); - 尝试
nc
在服务器(客户机)中使用 进行监听nc -l -u 60001
,然后尝试在客户端(主机)中使用 连接到它,nc -u localhost 60001
并在服务器中输入任何期望“回声”的内容,但没有回声,但按回车键发送后连接并没有断开; - 尝试用 扫描开放的 UDP 端口
nc -v -z -u -w 5 localhost 60000-60010
,但无所获,只扫描了 2222 端口的 TCP;
我不确定还能尝试什么。也许我缺少一些配置或命令,如果能得到任何指导我将不胜感激。
答案1
我在使用 Mosh 时也遇到了类似的问题。我通过将 Mosh 从我的 VPN 连接中排除来解决这个问题。就我而言,我在 VPN 客户端中添加了一条规则,以直接路由我的服务器的 IP。
答案2
由于某种我此刻尚不清楚的原因,该命令virsh qemu-monitor-command --hmp archlinux 'hostfwd_add udp::60001-:60001'
按预期工作。
我将回顾一下我的步骤:
- 使用 Arch Linux 云镜像,导入 qcow2 镜像,
❯ virt-install \
--name archlinux \
--memory 4096 \
--vcpus=2,maxvcpus=4 \
--cpu host \
--disk $HOME/VMs/$(ls | grep 'Arch-Linux'),bus=virtio,format=qcow2 \
--network user \
--virt-type kvm \
--os-variant archlinux \
--import
- 然后,将端口从 2222(主机)转发到 22(客户机,SSH 默认端口),使用
virsh qemu-monitor-command --hmp archlinux 'hostfwd_add ::2222-:22'
; - 进一步,登录会话并安装
mosh
;sudo pacman -S mosh
mosh
然后,以同样的方式在主机上安装;- 确保客人和主人有相同的语言环境,你可以查看他们的常问问题关于这个,例如,在我的情况下,主机是德语的,所以我需要在客户机中生成德语语言环境;
- 端口转发需要连接客户端的 UPD 端口
mosh
,在本文撰写之时60001
,您可以通过发出命令来实现这一点❯ virsh qemu-monitor-command --hmp archlinux 'hostfwd_add udp::60001-:60001'
,其中“archlinux”是您的客户端的名称; - 最后,通过发出与客人联系
mosh --ssh="ssh -p 2222" arch@localhost
,如果您在语言环境方面遇到问题,就像我一样,您可以像这样明确添加语言环境:mosh --server="LANG=de_DE.UTF-8 mosh-server" --ssh="ssh -p 2222" arch@localhost
。
就这样吧。