长期以来都是小透明和资深潜水党在社区里吸取大佬们的营养和指导, 近日折腾了一下小主机和 aio, 并且将过程整理成教程在社区里发表出来, 不求能够指导别人, 但求别人能有个参考, 并且一起交流学习.
各位说话好听 头发多 精力旺盛 过年涨薪的 佬们 觉得可以的话 就给我点个赞吧.
另外本人热爱分享, 热爱搞机, 馒头 pt 上传100T+,发种100+,做种500+, 做种时间一年(数据准备另开一贴贴出), 希望基于此能得到大佬的厚爱发个邀请:(btschool,聆音, 红叶,emp峨眉派/P0 rNbay都行,), 丰富下自己的下载中心, 再过几周我就可以回来发馒头药了
系列文章目录:
人类当年是靠 语言交流于合作 打败尼安德特人的,现在也同样需要 高效、便捷 、无障碍的 信息传输方式 通过交流、开放和合作 来发展、战胜共同的难题。——无名氏说的
在软件与信息服务日益发达的今天,在大家工作、科研、学习、外贸、生活等各种需求下,市场上涌现出诸多的网络解决方案。其中有个需求是网络流量的分流。这是什么,请看如下工作生活中遇到的场景:
- 小李 今天新购置了一个智能音箱、电视盒子或者 VR设备,需要装一些 google play 商店才有的应用,它该如何配置网络呢。
- 外贸从业者 小红 有多台设备管理多个账号,来做营销活动,但是每个设备都要配置其网络实在太麻烦。
- 程序员等技术人员 小张 需要在 linux 上更新软件源,拉取 github 上的库来安装 包,拉取 容器镜像,安装 python 依赖,安装硬件驱动,会遇到各种各样的网络问题,如果逐个手动去更换软件源或设置代理会是一个极其繁杂无语的事情。而且令人沮丧。
- 小金 是个金融从业人员,经常需要关注多个媒体发布的新闻,而不同媒体对网络配置要求不一致。
- 小TOP 是个B站 著名影视解说 up, 需要经常关注国内外影视的发展,新剧新电影的上映,并且购买流媒体服务刷剧来写稿发布新内容,同时将解说内容发布到国内外不同社交媒体平台,它该如何配置自己的网络环境呢。
上述这些问题都不是我们简单购买网络服务解决方案能解决。
本文从该场景而带来的需求入手,简单阐述解决上述需求的网络流量分流方案的实验过程。 软路由和其他设备的网络拓扑简介解决上述需求的是软路由,区别于硬路由,简单来讲,硬路由是 通用计算机 阉割掉 个人电脑的大部分功能,只剩下 流量转发、网络管理等功能,以达到 专用化、低功耗的目的,但是即使不阉割这些功能,安装专用的路由系统,只要 CPU 是低功耗的也能达到相同的效果,而且在使用上和功能可以更人性化、强大和多样性。
选定路由系统后 安装之前,先来简单说说 在我们的物理小主机中,网络硬件如何分配,网络拓扑如何。如下图,小主机的 ETH0 接口连接上级路由后,PVE 在此前安装的时候会获得一个 IP 地址,如我将修改为 192.168.2.2, 此网络接口 ETH0 作为管理接口在日后不能另作他用,同样接入 192.168.2.0/24 网段的 个人电脑通过 网址 http://192.168.2.2:8006 便可访问 PVE 进行管理。

假设我们现在已经成功安装了虚拟机 软路由,此时的网络拓扑需要发生一些小变化(网线连接和PVE配置),以使得我们 物理主机中所有的 VM 都作为 软路由的下游设备接入网络,网络流量受 软路由管理,包括PVE这个操作系统,这样我们所有的设备的 IP 都在同一个网段下面,不需要网络地址转换。从逻辑上讲,修改以后的网络拓扑如下图,软路由 在网络上如同一个独立的机器,WAN 口 (直通的 ETH1 接口) 接入上级路由接入互联网,LAN 口开启一个新网段 192.168.100.0/24, 直通剩下的 ETH2-3 网口连接其他需要联网的物理设备,该软路由虚拟机在创建之初的虚拟网络接口 ETH0(这里不是PVE 节点的物理网口 ETH0,我们没有直通过来,是虚拟的), 也 作为 LAN 口 连接 PVE 节点的虚拟网卡 vmbr0 ,使得 PVE 节点连接上子网192.168.100.0/24,而 PVE 中其他的虚拟机则 桥接到该 PVE 节点的 vmbr0 来连接到 子网 192.168.100.0/24。 这里看不懂无所谓,接下来实操一番可能就懂了。

PVE 及其虚拟机网络拓扑图PVE 开启硬件直通
我们的物理主机有四个网口,留一个用作 PVE 管理接口/桥接绑定物理网卡,其余三个直通给软路由,但是将网络接口硬件添加到 iStoreOS 虚拟机之前,需要开启 PVE 的硬件直通功能。
过程步骤为: 1. 在 /etc/default/grub 文件中的 GRUB_CMDLINE_LINUX_DEFAULT= 一行中的引号内追加 intel_iommu=on iommu=pt, 如果是 AMD CPU 则追加 amd_iommu=on iommu=pt 2. 使PT模式起作用 。 在/etc/modules末尾追加 如下内容。不过实测我没有添加也能用。 vfio vfio_iommu_type1 vfio_pci vfio_virqfd
3. 使配置生效 和 重启 update-initramfs -u -k allupdate-grubreboot
4. 检查效果 dmesg | grep -e DMAR -e IOMMU| \grep -i 'iommu enable' 看到 有 输出 DMAR: IOMMU enabled 即证明成功。
也可以执行以下代码,一键添加,重复执行不会添加重复内容,只追加一次。
PARAM_IOMMU_ON_INTEL="intel_iommu=on"
PARAM_IOMMU_PT="iommu=pt"
# the kernel commandline needs to be adjusted: nano /etc/default/grub and change GRUB_CMDLINE_LINUX_DEFAULT to intel_iommu=on i915.enable_guc=3 i915.max_vfs=7, or add to it if you have other arguments there already.
if ! \grep -qEi "^GRUB_CMDLINE_LINUX_DEFAULT.*${PARAM_IOMMU_ON_INTEL}" /etc/default/grub; then
\sed -rin "s~(^GRUB_CMDLINE_LINUX_DEFAULT=\"[^\"]*)\"~\1 ${PARAM_IOMMU_ON_INTEL}\"~g;" /etc/default/grub
fi
if ! \grep -qEi "^GRUB_CMDLINE_LINUX_DEFAULT.*${PARAM_IOMMU_PT}" /etc/default/grub; then
\sed -rin "s~(^GRUB_CMDLINE_LINUX_DEFAULT=\"[^\"]*)\"~\1 ${PARAM_IOMMU_PT}\"~g;" /etc/default/grub
fi
VFIO_PATTERN="vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd"
# 定义文件路径
MODULE_FILE="/etc/modules"
(awk 'BEGIN{RS=""; FS="\n"} /vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd/ {found=1} END{if (found) print "yes"; else print "no"}' $MODULE_FILE | \grep -q yes) || echo "$VFIO_PATTERN" >> $MODULE_FILE
安装 iStoreOS 创建虚拟机, 安装也比较简单,官网的介绍十分详细,这里说说不同的地方。
1. 在按照教程创建虚拟机后,还需要添加要直通的几个物理网口。带 Ethernet Controller 字样的PCI设备。
 2. 写入固件的时候不用像官方那么麻烦。
- ssh 登录到 pve, 或者在 web 界面的 shell 控制台。使用如下的命令,替代你的虚拟机 ID到 VMID,并执行,这里会自动寻找最新的镜像文件并写入虚拟机,作为硬盘。
- # 填写你的 VMID
- VMID=100
- URL="https://fw.koolcenter.com/iStoreOS/x86_64/"
- # 获取网页内容并提取最新的镜像文件链接
- LATEST_IMG=$(wget -qO- "$URL" | \grep -oEi 'istoreos-[0-9.]+-[0-9]+-x86-64-squashfs-combined.img.gz' | sort -V | tail -n 1)
- # 检查是否找到最新的镜像文件
- if [ -z "$LATEST_IMG" ]; then
- echo "未找到最新的镜像文件。"
- fi
- DOWNLOAD_URL="https://fw0.koolcenter.com/iStoreOS/x86_64/$LATEST_IMG"
- # 下载最新的镜像文件
- cd /var/lib/vz/template/iso
- wget -q --show-progress --max-redirect=5 "$DOWNLOAD_URL"
-
- # 解压镜像文件
- gzip -d "$LATEST_IMG"
- IMG_NAME=$(echo "$LATEST_IMG"|\sed -rn 's~.gz~~g;/.*/p')
- # 将镜像文件制作成一个硬盘并导入给虚拟机中
- qm importdisk $VMID "/var/lib/vz/template/iso/$IMG_NAME" local-lvm
复制代码
参考文献: iStoreOS 网络拓扑配置一般来讲 iStoreOS 默认新开的 网段是 192.168.100.0/24 也就是所有其他设备通过 LAN 口连接 iStoreOS 都会得到192.168.100.xxx/24 这样的地址,而 iStoreOS 自己的 LAN口IP 则是192.168.100.1/24 。此时我们将 网线一头插入电脑,一头插入 直通的 ETH2-4 中的一个,就能连上 192.168.100.0/24 的子网,并且在浏览器访问 192.168.100.1 去修改一些配置。 但是在此之前,我们先完善好 pve 和 软路由的 网络拓扑结构。目标是将 PVE 节点,PVE 以后所有的虚拟机都置于 iStoreOS 新起的 LAN 口网段 里 192.168.100.0/24, 不需要通过网络地址转换来通讯从而降低性能。在修改所有事情之前,我们当前的网络拓扑如下,不多说了。 
即将要修改的内容也十分简单,有三步: - 修改 PVE 的网关和DNS server, 指向 软路由 iStoreOS;
- 将物理网线从 管理接口拔出,插到 直通给 iStoreOS 的第一个物理网口(Eth1, 是 PVE 的管理网口和桥接网口,不能用,选 Eth2 是为了好记 方便管理),如下图所示;
- 用一根网线一头连接我们的电脑,一头连接 直通给 iStoreOS 的 第二个(Eth3), 登录到 192.168.100.1 软路由界面,更改网口配置,如下图所示。

左图为虚拟图,右图为物理设备连接图
第一步:修改 PVE 的网关和DNS server, 指向 软路由 iStoreOS。如下图导航到的位置,将 修改好后,点 ”OK“,并且应用配置。此时刷新界面,发现无法连通了。别慌,我们还有重装大法(bushi)。不需要重装,后面解释为什么,我们继续进行第二步。

第二步:将物理网线的一头从管理接口换到直通给软路由的第一个网口(Eth2-4 中的 Eth2), 再进行第三步,即将我们的电脑连上 软路由的一个网口(Eth2-4的第3个), 打开网址 192.168.100.1 , 用户名是 root, 密码是 password,如下图,导航到 “网口配置”,并勾选途中的接口。下图中的 eth0 是创建虚拟机时的虚拟网络接口,其他则是直通的物理网口. 再进行本小节的网络拓扑修改前,eth0虚拟接口是 WAN 口,通过 PVE 的管理接口 桥接到 外部网络,但是 PVE 通过这个 网络接口反过来挂在软路由上,所以它就应该蛇者为 LAN 口,另外我们已经将物理网线改接到 直通给软路由的物理接口也就是这里的 eht1, 所以它从 LAN 变成 WAN 口连接上游网络。,保存并应用,OK. 新网络搞定。

看看这张图,来温习梳理一下。第一步改了 PVE 的网关后,但是 istoreOS 的 WAN 口是 虚拟网卡,也就是形成死循环了,无法于外界连通,所以只要将网线插到 软路由直通到的网口,并且修改它为 WAN 口,软路由就像一个独立的机器运作了。此时我们的 PVE节点,也就能够成功通过新网段里的 IP 访问(192.168.100.x),因为PVE 的虚拟网卡已经是新地址,其他虚拟机的虚拟网卡是桥接到 PVE 的虚拟网卡上,因此也就有了相同网段的 IP 地址,至此所有 VM, 连接到 软路由的物理设备和PVE 节点都在同一个网段下,通信不需要网络地址转换,避免性能损失。
- 我曾经想过能否将 管理接口 物理网口ETH0 也直通给 软路由,答案是不行的。因为 PVE 的 vmbr0 虚拟网口 需要一个物理网口去桥接绑定。
 iStoreOS 应用
到这一步,恭喜你,成功装好 iStoreOS! 接下来是一些优化、配置和安装应用。 将 iStoreOS 设置为自启动。

安装 qemu-guest-agent 以使得 PVE 能直接对 VM 进行开关机操作并读取其 网络 IP 等信息。 iStoreOS 默认已经修改好软件源为国内的大学的镜像源,直接执行如下命令即可。
- # 安装
- opkg update
- opkg install qemu-ga
- # 设置脚本权限
- chmod +x /etc/init.d/qemu-ga
- # 启用服务
- /etc/init.d/qemu-ga enable
- # 重启
- reboot
复制代码
修改密码和ssh配置

安装网络流量管理应用。可以采用两种方法:
- cd /tmp
- base_url="https://github.com/bcseputetto/Are-u-ok/releases/latest"
- download_page=$(wget -qO- $base_url)
- passwall_pkg=$(echo "$download_page" | \grep -Eio '>passwall[^0-9][^<]+x86_64[^<]+run' | sed -rn 's~>~~p' | sort | uniq)
- passwall2_pkg=$(echo "$download_page" | \grep -Eio '>passwall2[^<]+x86_64[^<]+run' | sed -rn 's~>~~p' | sort | uniq)
- # 下载软件包
- dlink_base="https://github.com/bcseputetto/Are-u-ok/releases/download/iStoreOS/"
- wget "${dlink_base}${passwall2_pkg}"
- wget "${dlink_base}${passwall_pkg}"
- opkg update
- sh "$passwall2_pkg"
- sh "$passwall_pkg"
- rm "$passwall2_pkg"
- rm "$passwall_pkg"
复制代码
至此已经完成了最基本的功能了。该应用还需要进一步配置如添加网络连通解决方案提供商的节点,其余保持默认即可体验和满足基本需求,更进一步地,该应用采用 Github 社区的一个开源项目 `Xray-Core` 作为分流组件,和自带的一些分流组件。
这里回到前言中提到的一些场景如何解决。
- 多设备不同网络采用不同的网络分流方案。如下图,通过采用访问控制功能,可以为不同 IP 指定不同的分流方案。
- 为 VR、电视盒子等不好设置网络的设备设置一个全局默认配置。如图选择网络连通服务提供商提供的 TCP节点,并且按需配置 规则列表即可。同理,由于是全局配置和规则列表定制化,也可以解决 程序员小白、金融从业人员小金、B站影视 UP 小TOP 的需求
 - 配置更为复杂的分流规则,如同防火墙的规则一样,按顺序匹配,命中则走某条规则
|