无法通过SSH连接到RancherOS,该操作系统安装在虚拟机中的FreeNAS中的iohyve中



我正在准备服务器升级,但在升级之前,我想先在VM中进行一次试运行。

我在笔记本电脑上运行Linux Mint。目前,我在QEMU中安装了FreeNAS v9.10.2-U6,并通过iohyve将RancherOS v1.5.6安装到虚拟机中。

[laptop]
|_ [QEMU]
|_ [FreeNAS]
|_ [iohyve]
|_ [RancherOS]

我可以毫无问题地SSH到FreeNAS,但我不能SSH到Rancher。当尝试连接到Rancher时,它最终会超时。当我用-vvv运行ssh命令时,在最终超时之前,它似乎挂在了debug1: Connecting to <RANCHER_IP> [<RANCHER_IP>] port 22.上。

这就是我迄今为止所尝试的:

  • 验证Rancher虚拟机可通过ping <RANCHER_IP>从主机访问
  • 已验证sshd正在Rancher VMps -ef | grep sshd中运行
  • 已验证正在Rancher VMnetstat -nl | grep :22中侦听SSH端口
  • 检查了我在Host和Guest上的iptables规则,似乎没有阻止通信的规则

这是我第一次在嵌套虚拟机中处理网络问题,所以我不确定是否缺少一些简单的东西。我期待着社会各界的任何见解。

TL;DR,我不得不禁用FreeNAS虚拟机中的硬件卸载。对于持久性修复,在FreeNas的GUI中,我转到Init/Shutdown Scripts并创建了一个运行的Post-InitCommand脚本

ifconfig vtnet0 -rxcsum -txcsum -rxcsum6 -txcsum6 -vlanmtu -vlanhwtag -vlanhwfilter -vlanhwtso -tso -tso4 -tso6 -lro -vlanhwtso -vlanhwcsum

完整的故障排除步骤

  1. 验证Host、FreeNAS和Rancher的MTU均相同(1500)
    • 主机:ifconfig | grep mtu
    • FreeNAS:ifconfig | grep mtu
    • 牧场主:ifconfig | grep MTU
  2. 已验证牧场主有外部访问权限:ping google.com
  3. 验证主机、FreeNAS和Rancher是否可以通信
    • 主机到FreeNAS:ping <FREENAS_IP>
    • 牧场主:ping <RANCHER_IP>
    • FreeNAS到主机:ping <HOST_IP>
    • FreeNAS到牧场主:ping <RANCHER_IP>
    • 牧场主:ping <HOST_IP>
    • 牧场主到自由NAS:ping <FREENAS_IP>
  4. 已验证的sshd正在Rancher VM中运行:ps -ef | grep sshd
    • 还尝试重新启动sshd:sudo system-docker restart console,以防出现某种竞争条件
  5. 已验证Rancher VM中正在侦听SSH端口:netstat -nl | grep :22
  6. 已验证路由表,并且所有路由表都有默认网关
    • 主机:route
    • FreeNAS:netstat -r
    • 牧场主:route
  7. 尝试为Rancher添加一个专用的SSH端口和侦听IP,并通过netstat验证该IP和端口正在被侦听。这是为了排除任何可能的端口冲突
  8. 检查了主机和Rancher上的iptables规则(FreeNAS没有防火墙),没有任何阻止通信的规则。
    • 关闭防火墙规则,然后重新启动Rancher的sshd(nadda),然后重新引导FreeNAS虚拟机(nad达)
    • FreeNAS中有一个防火墙工具,但已验证未使用以下工具设置任何内容:ipfw table all list
  9. 在FreeNAS中,我检查了网络流量,看看我的SSH请求是否到达了那里。对于每种情况,我都打开了两个终端,一个连接到FreeNAS,另一个是连接到Rancher。由于Live env中的输出太长(因为SSH连接已经完成),我只为每个案例添加一个日志项,因为相关信息在第一个日志中。
    • 直播:sudo tcpdump -nnvvS '(src <HOST_IP> and dst <RANCHER_IP>) or (src <RANCHER_IP> and dst <HOST_IP>)'
      tcpdump: listening on ix0, link-type EN10MB (Ethernet), capture size 65535 bytes
      15:01:53.957264 IP (tos 0x0, ttl 64, id 56881, offset 0, flags [DF], proto TCP (6), length 60)
      <HOST_IP>.60648 > <RANCHER_IP>.22: Flags [S], cksum 0xfae8 (correct), seq 468317589, win 64240, options [mss 1460,sackOK,TS val 2321761697 ecr 0,nop,wscale 7], length 0
      
    • 在VM上:sudo tcpdump -nnvvS '(src <HOST_IP> and dst <RANCHER_IP>) or (src <RANCHER_IP> and dst <HOST_IP>)'
      tcpdump: listening on vtnet0, link-type EN10MB (Ethernet), capture size 65535 bytes
      14:59:03.029922 IP (tos 0x0, ttl 64, id 25421, offset 0, flags [DF], proto TCP (6), length 60)
      <HOST_IP>.45688 > <RANCHER_IP>.22: Flags [S], cksum 0x8403 (incorrect -> 0x69a6), seq 3645881181, win 64240, options [mss 1460,sackOK,TS val 1007017042 ecr 0,nop,wscale 7], length 0
      
    • 注意到cksum有很多incorrect,所以我在主机ethtool --show-offload <ETHERNET_INTERFACE_NAME> | grep tx-checksumming上运行了这个,它告诉我它已经打开了。运行sudo ethtool -K <ETHERNET_INTERFACE_NAME> tx off禁用它,重新运行tcpdump和ssh命令,cksum仍然得到incorrect,所以我重命名了校验和sudo ethtool -K <ETHERNET_INTERFACE_NAME> tx on。至少我认为最后一个命令重置了东西,在FreeNAS重新启动后,网络不再可用。我最终运行了sudo ethtool --reset <ETHERNET_INTERFACE_NAME> all,并最终从头开始重新创建了虚拟机,并重新启动了我的系统以重新设置
  10. 在谷歌搜索了iohyve tap0 or epair之后,终于在这篇文章中找到了解决方案。引用相关信息,以防帖子在某个时候消失。

    我最近也遇到了类似的情况。我可以把监狱调到&来自比维的客人,但我无法通过任何实际的交通。从其他物理设备来看,我通过流量没有问题。问题最终是硬件卸载程序(TSO、HWSUM等)导致了这个问题,考虑到在我的情况下流量没有到达硬件,我觉得这有点讽刺。我使用了tcpdump,可以看到流量有校验和错误。我关闭了硬件卸载程序,一切都开始工作,我花了两周时间才弄清楚。事后看来,我应该在第一天就跑tcpdump

    尝试关闭硬件卸载,然后重新运行ifconfig -v(如果它生效),然后测试是否可以通过实际流量。

    禁用硬件卸载:

    ifconfig igb0 -rxcsum -txcsum -rxcsum6 -txcsum6 -vlanmtu -vlanhwtag -vlanhwfilter -vlanhwtso -tso -tso4 -tso6 -lro -vlanhwtso -vlanhwcsum
    
    • 因此,对于我的用例,我SSH进入FreeNAS,确保Rancher VM已停止,禁用卸载(用vtnet0替换igb0),启动Rancher VM备份,并最终尝试SSH进入Rancher。。。并取得了成功。基本上,我之前尝试禁用卸载是正确的,但我需要在FreeNAS中进行,而不是在主机中。。。考虑到这是一个桥接的网络,并且我正在将我的确切硬件资源传递给VM,这对我来说有点违背直觉

最新更新