You've successfully subscribed to 完美的胖达
Great! Next, complete checkout for full access to 完美的胖达
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.
Linux 虚拟机网络中断问题

Linux 虚拟机网络中断问题

. 约 5 分钟读完

折腾了若干台笔记本和系统之后,为了减少工作量和工作需要,我觉得选择LoL(Linux on Linux)方式应该是个不错的决定,估计也挺好玩。
也正因为此,我把E480的8+256的配置升级到了32+2T,当然其实一分钱没花,用的是闲置ZX8游戏本上的配件。

其实本来我是考虑使用ZX8的,但是因为ZX8是独显,所以闲时功耗光显卡就占掉了9w+,而且是台式机主板和CPU,和节能不能说没关系,只能说一点边都沾不上,空闲时我看到的最低功耗为23w,典型功耗30-40w,72wh的电池也就能用两小时左右,不是说我用不起电,关键是功耗大它吵啊。
平时玩游戏就算了,现在玩系统啥也没干风扇呼呼的,算了,还是E480任劳任怨,毕竟商务本底子,哪怕不怎么调省电模式,闲时功耗也不超过4w,风扇基本不转,40wh(原配45wh,已损耗)电池可以支持8小时以上。


Anyway,反正E480上面我装了三系统,一个Debian兜底,一个NixOs玩配置即代码,一个CachyOS做底层玩QEMU。2T SSD,我的Linux从来没打过这么富裕的仗!

Debian和NixOs基本上都没啥幺蛾子搞定了,哦还是有的,就是我上一篇说的Debian无线省电要关掉否则死机。奇怪的是NixOs啥都不用配一点问题都没有,NixOs比Debian还稳定你敢信

说回正题,Cachy装好其实还是发生了点插曲的,那就是NixOs的启动项丢失了。
其实两者都是Systemd启动,按道理应该没问题才对,检查安装过程才发现EFI分区在CachyOS中被挂载为/boot,而在NixOs中被挂载为/boot/EFI,造成NixOs的启动项放在了自己分区的@子卷中,无法被CachyOS发现。

最后在Cachy中挂载NixOs的分区,然后手动修复了启动项,再重启进入NixOs修改default.nix中的EFI的挂载点(之前没写,用的默认挂载)为/boot,解决了启动项消失的问题,并且此后不管是Cachy还是NixOs的更新都不会影响启动项正常功能
再为Debian增加了一个链式启动项调用Debian的Grub启动,于是Debian的update-grub也没问题了。


又跑题了,再说回正题。
话说QEMU配好之后我开始安装虚拟机,一下就选中了Vanilla OS 2
为啥选这个呢?你猜?
哈哈哈,就是之前物理机上装了几次都失败了,不知道是不是硬件和软件配合问题,反正这次虚拟机安装总不会有问题了吧。

天真,没问题的话就不会有这篇文章了

总之林林总总出了一大堆事情,排错排了六七个小时,主要表现就是宿主机可以上网,v2raya服务正常,可以上外网。虚拟机走virtio NAT模式,可以拿到内网地址,可以ping宿主机,甚至可以ping 1.1.1.1和8.8.8.8,但是DNS解析有问题,死活上不了外网
总之各种排错,各种检查,最后你猜怎么着,原因简直了。

答案是Vanilla OS 2这种不可变系统,初始组件就是基于docker的,于是安装完成后第一件事就是疯狂多线程极速拉取docker镜像,于是把宿主机的网络服务撑暴了,真是打死我都想不到是这个原因。
由于表现上是DNS失败,于是我不断的在排查DNS劫持、NAT、防火墙等等各种原因,真是被坑得要命。来来回回在这些功能和服务上各种折腾。
最后发现问题原因后五分钟就搞定了。
所以我这几个小时到底是在干啥……


解决起来其实很简单:
首先打开NAT和IP转发功能

# 1. 开启IP转发 (临时生效)
sudo sysctl -w net.ipv4.ip_forward=1
# 2. 启用IP转发 (永久生效,写入配置文件)[citation:1]
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 3. 检查并手动添加NAT规则(如果缺失)
sudo iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE

然后sudo systemctl edit v2raya.service增加v2raya最大连接数

[Service]
LimitNPROC=500000 #默认是500连接你敢信
LimitNOFILE=500000
MemoryHigh=infinity
MemoryMax=infinity

修改配置后重启服务

sudo systemctl daemon-reload
sudo systemctl restart v2raya

扩容内核连接追踪表(默认是256k,其实不改可能也可以)

# 临时生效
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
# 永久生效
echo "net.netfilter.nf_conntrack_max=1048576" | sudo tee /etc/sysctl.d/99-conntrack.conf

然后就好了,就这么简单。
记录一下,下次遇到就知道怎么回事了。


最搞的是出问题的根本原因是我家的宽带带宽以及我家到服务器以及服务器到docker的带宽都太大了,于是把宿主机的并发数和内核追踪表撑爆了,但凡这一路上有哪个环节网速慢点都没这破事……

本篇已被阅读