我正在准备服务器升级,但在升级之前,我想先在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 VM
ps -ef | grep sshd
中运行 - 已验证正在Rancher VM
netstat -nl | grep :22
中侦听SSH端口 - 检查了我在Host和Guest上的
iptables
规则,似乎没有阻止通信的规则
这是我第一次在嵌套虚拟机中处理网络问题,所以我不确定是否缺少一些简单的东西。我期待着社会各界的任何见解。
TL;DR,我不得不禁用FreeNAS虚拟机中的硬件卸载。对于持久性修复,在FreeNas的GUI中,我转到Init/Shutdown Scripts
并创建了一个运行的Post-Init
Command
脚本
ifconfig vtnet0 -rxcsum -txcsum -rxcsum6 -txcsum6 -vlanmtu -vlanhwtag -vlanhwfilter -vlanhwtso -tso -tso4 -tso6 -lro -vlanhwtso -vlanhwcsum
完整的故障排除步骤:
- 验证Host、FreeNAS和Rancher的MTU均相同(1500)
- 主机:
ifconfig | grep mtu
- FreeNAS:
ifconfig | grep mtu
- 牧场主:
ifconfig | grep MTU
- 主机:
- 已验证牧场主有外部访问权限:
ping google.com
- 验证主机、FreeNAS和Rancher是否可以通信
- 主机到FreeNAS:
ping <FREENAS_IP>
- 牧场主:
ping <RANCHER_IP>
- FreeNAS到主机:
ping <HOST_IP>
- FreeNAS到牧场主:
ping <RANCHER_IP>
- 牧场主:
ping <HOST_IP>
- 牧场主到自由NAS:
ping <FREENAS_IP>
- 主机到FreeNAS:
- 已验证的
sshd
正在Rancher VM中运行:ps -ef | grep sshd
- 还尝试重新启动
sshd
:sudo system-docker restart console
,以防出现某种竞争条件
- 还尝试重新启动
- 已验证Rancher VM中正在侦听SSH端口:
netstat -nl | grep :22
- 已验证路由表,并且所有路由表都有默认网关
- 主机:
route
- FreeNAS:
netstat -r
- 牧场主:
route
- 主机:
- 尝试为Rancher添加一个专用的SSH端口和侦听IP,并通过
netstat
验证该IP和端口正在被侦听。这是为了排除任何可能的端口冲突 - 检查了主机和Rancher上的
iptables
规则(FreeNAS没有防火墙),没有任何阻止通信的规则。- 关闭防火墙规则,然后重新启动Rancher的sshd(nadda),然后重新引导FreeNAS虚拟机(nad达)
- FreeNAS中有一个防火墙工具,但已验证未使用以下工具设置任何内容:
ipfw table all list
- 在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
,并最终从头开始重新创建了虚拟机,并重新启动了我的系统以重新设置
- 直播:
- 在谷歌搜索了
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,这对我来说有点违背直觉
- 因此,对于我的用例,我SSH进入FreeNAS,确保Rancher VM已停止,禁用卸载(用