软路由实践
前言
2024/06/29
经过将近一年的使用体验,发现 All In One 模式的软路由,存在很多不足。
- 使用的猫棒,发热量非常大,手放上去感觉会起水泡。这肯定会给稳定性带来影响。
- 在折腾 软路由/NAS 的过程中,经常需要断网、重启等操作,这无疑会影响其他使用网络的人。
- 软路由/NAS 基本就是代表着不稳定,所以网络体验给人带来的感觉就是不好。
这些不足,网上都有人描述。不过自己折腾了一遍,才深有体会。所以后续还是使用光猫 + 2.5G路由器的组合,顶多在 NAS 上根据实际需求,使用 iStroreOS 搭建旁路由。
2023/11/11
经常折腾PC,所以对软路由了解甚久,这次就来折腾一下吧。
经过大约一周的折腾,最后敲定为 爱快(主路由)+ iStoreOS(旁路由)的双路由模式。主要是因为iStoreOS一直拨号不成功,实在没办法才这样,个人意愿还是能少部署一个则少一个。
硬件:
系统:
- Proxmox Virtual Environment,虚拟化平台,后续想着还可以在上面折腾Mac OS。
- iKuaiOS,试了很久,只有它拨号成功了,且其路由能力很强大,设置DHCP规则很灵活。
- iStoreOS,基于OpenWRT深度定制的软路由系统。
软件:
- OpenClash,安装在iStoreOS下,负责科学上网。
IP分配:
设备 | IP | 作用 | 详释 |
---|---|---|---|
猫棒/光猫 | 192.168.1.1 | 桥接 | 光电信号转换 |
爱快 | 192.168.2.1 | 主路由 | PPPoe拨号,内网管理 |
iStoreOS | 192.168.2.2 | 盘路由 | 安装各种插件 |
PVE | 192.168.2.3 | 底层平台 | 管理虚拟底层平台 |
MediaServer | 192.168.2.4 | NAS服务器 | 用于存储文件,Jllyfin |
Ubuntu24.04 | 192.168.2.5 | LXC / VM | Linux虚拟机 |
Windows11(虚拟机) | 192.168.2.6 | 直通核显,HDMI输出 | 挂迅雷? |
Windows7(虚拟机) | 192.168.2.7 | 兼容软件测试 |
Proxmox Virtual Environment
下载最新固件,使用Rufus烧录至U盘。上电R86S后立即按 F7 进入 BIOS 设置,选中U盘作为引导启动项,后续的按照提示操作即可。
在系统安装引导界面,可以设置磁盘分配空间,我们可以预留一部分空间给Windows使用,如果有多系统需求的话。
如果此时需要 iKuaiOS 拨号才能上网,可先配置 iKuaiOS 拨号成功后再继续后续PVE配置。
安装完系统之后,需要修改DNS,默认的DNS只有 127.0.0.1
。
nameserver 192.168.1.1
nameserver 8.8.8.8
nameserver 127.0.0.1
替换国内镜像源:
# 基础系统(Debian)
sed -i 's|^deb http://ftp.debian.org|deb https://mirrors.ustc.edu.cn|g' /etc/apt/sources.list
sed -i 's|^deb http://security.debian.org|deb https://mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
# Proxmox
source /etc/os-release
echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve $VERSION_CODENAME pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
# ceph 仓库
if [ -f /etc/apt/sources.list.d/ceph.list ]; then CEPH_CODENAME=`ceph -v | grep ceph | awk '{print $(NF-1)}'`; source /etc/os-release; echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/ceph-$CEPH_CODENAME $VERSION_CODENAME no-subscription" > /etc/apt/sources.list.d/ceph.list; fi
mv /etc/apt/sources.list.d/pve-enterprise.list /etc/apt/sources.list.d/pve-enterprise.list.bak # 不使用enterprise仓库
# CT Templates
cp /usr/share/perl5/PVE/APLInfo.pm /usr/share/perl5/PVE/APLInfo.pm_back
sed -i 's|http://download.proxmox.com|https://mirrors.ustc.edu.cn/proxmox|g' /usr/share/perl5/PVE/APLInfo.pm
systemctl restart pvedaemon
apt update && apt upgrade
pveam update
如果在安装完系统后,想要重新修改IP,可以打开/etc/network/interfaces
文件,更改 vmbr0 的 address 即可。修改完成后需要重启。
auto lo
iface lo inet loopback
iface enp1s0 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.1.100/24
gateway 192.168.1.1
bridge-ports enp1s0
bridge-stp off
bridge-fd 0
iface enp2s0 inet manual
# ......
硬件直通
在kernel中启用I/O Memory Management Unit(直通PCI设置之前必须要启用IOMMU):
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
加载相应的内核模块:
vfio
vfio_iommu_type1
vfio_pci
确认核显的供应商(Vendor)和设备(Device) ID:
lspci -nn
......
00:02.0 VGA compatible controller [0300]: Intel Corporation Alder Lake-N [UHD Graphics] [8086:46d0]
......
在PVE上屏蔽系统中的开源显卡驱动避免开启显卡被系统加载,以及关掉核显使用(后面Windows直通显卡需要用到,屏蔽后,PVE将无法使用HDMI输出,即也无法正常通过显示器查看控制台):
blacklist snd_hda_intel
blacklist snd_hda_codec_hdmi
blacklist i915
options vfio-pci ids=8086:46d0
options kvm ignore_msrs=Y
更新grub及initramfs,然后重启:
update-grub
update-initramfs -u -k all
reboot
重启完成后,验证 IOMMU 是否已启用,运行:
dmesg | grep -e DMAR -e IOMMU
......
[ 0.062560] DMAR: IOMMU enabled
......
应该能在输出中看到上述一行。
验证 IOMMU 中断重映射已启用,运行:
dmesg | grep 'remapping'
[ 0.153403] DMAR-IR: Enabled IRQ remapping in x2apic mode
应该能在输出中看到上述一行。
存储策略和分区调整
默认情况下,pve安装时会在硬盘上自动创建如下两个区域:
- 区域local:类别为Directory,支持文件目录结构,我们可以看到具体的文件夹和文件。
- 区域local-lvm:类别为LVM-Thin,不支持文件目录结构,即我们看不到文件路径。
网络上大多都是建议把 local-lvm 删除合并至 local。这里我也产生了这样的需求,R86s目前只有一个nvme硬盘,后续还需要其作为NAS存储共享文件。
lvremove /dev/pve/data
lvextend -rl +100%FREE /dev/pve/root
然后在 数据中心→存储→删除 local-lvm
。双击编辑 local
,内容里添加 磁盘映像
和容器
。这样做了,我们就可以进入目录/var/lib/vz
查看所有的内容了。
root@pve:/var/lib/vz# tree /var/lib/vz
/var/lib/vz
├── dump
├── images
├── private
├── snippets
└── template
├── cache
└── iso
8 directories, 0 files
使用df -h查看,根目录已经扩大了。
root@pve:~# df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 16G 0 16G 0% /dev
tmpfs tmpfs 3.2G 1.6M 3.2G 1% /run
/dev/mapper/pve-root ext4 908G 3.3G 867G 1% /
tmpfs tmpfs 16G 43M 16G 1% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
efivarfs efivarfs 192K 86K 102K 46% /sys/firmware/efi/efivars
/dev/nvme0n1p2 vfat 1022M 12M 1011M 2% /boot/efi
/dev/fuse fuse 128M 16K 128M 1% /etc/pve
tmpfs tmpfs 3.2G 0 3.2G 0% /run/user/0
另外,PVE是不支持安装至eMMC的,在其Forum上找到这么一段话:
Proxmox VE is not made for install on USB/eMMC/CFCard or equal.
Proxmox VE have to be installed on a SSD/HDD. The OS will write some GB logs per day.
A USB/eMMC/CFCard or equal will not last long with this many writing.
但是我们可以将R86s的128GB eMMC在装上PVE之后,挂载至系统中,作为存储使用。例如挂载至其默认的ISO存储位置:/var/lib/vz/template/iso/
。
查看emmc的设备符:
root@pve:~# fdisk -l
Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: HP SSD EX900 1TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 85BDD2FE-0974-4DAE-AA8D-DA5E7EF96B7A
Device Start End Sectors Size Type
/dev/nvme0n1p1 34 2047 2014 1007K BIOS boot
/dev/nvme0n1p2 2048 2099199 2097152 1G EFI System
/dev/nvme0n1p3 2099200 1953525134 1951425935 930.5G Linux LVM
Disk /dev/mmcblk0: 116.5 GiB, 125090922496 bytes, 244318208 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
......
格式化emmc:
mkfs -t ext4 /dev/mmcblk0
将硬盘分区挂载到/var/lib/vz/template/iso/
目录:
mkdir /mnt/emmc
mount -t ext4 /dev/mmcblk0 /mnt/emmc
将目录挂载到系统启动项:
echo /dev/mmcblk0 /mnt/emmc ext4 defaults 1 2 >> /etc/fstab
使用df -h查看,emmc以及挂载到/mnt/emmc
了。
root@pve:~# df -h
Filesystem Size Used Avail Use% Mounted on
udev 16G 0 16G 0% /dev
tmpfs 3.2G 1.6M 3.2G 1% /run
/dev/mapper/pve-root 908G 3.3G 867G 1% /
tmpfs 16G 43M 16G 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
efivarfs 192K 86K 102K 46% /sys/firmware/efi/efivars
/dev/nvme0n1p2 1022M 12M 1011M 2% /boot/efi
/dev/fuse 128M 16K 128M 1% /etc/pve
tmpfs 3.2G 0 3.2G 0% /run/user/0
/dev/mmcblk0 115G 24K 109G 1% /mnt/emmc
iKuaiOS
在配置好OpenClash时,开开心心的准备上网,在访问 raw.githubusercontent.com 时,发现访问不了,当时第一时间想到的是DNS被污染了,然后就在 iStoreOS 上各种设置瞎折腾,还是不行。最后还是决定查查DNS的获取途径。
在Windows终端键入:nslookup raw.githubusercontent.com
,输出如下:
服务器: UnKnown
Address: fe80::1
名称: raw.githubusercontent.com
Addresses: ::
0.0.0.0
服务器的地址一度是我困惑,在折腾了许久,才知道Windows是使能了IPv6的协议栈的,且默认是使用的DHCP模式,所以这时分配的网关和DNS都是主路由,主路由上的DNS受到了域名污染,所以无法正确的解析 raw.githubusercontent.com 的真实IP地址。在Windows上设置获取IPv6地址方式为手动,设置网关和DNS为旁路由,问题得到解决。应该有几种解决方式:
- 主路由DHCP/DHCPv6支持设置网关,这样就可以将IPv4/IPv6网关设置成旁路由
- 直接在Windows以太网属性中,禁用IPv6协议(目前感觉IPv6用的还不多)
- 手动配置IPv6地址,将网关和DNS指向旁路由
- 想办法弄清Windows为什么先访问IPv6的DNS,而不是IPv4的DNS
在这段折腾的过程中,感觉到了iKuaiOS配置的强大,一般家用路由器,DHCP都不会提供设置选项,都是默认指向自己,而iKuaiOS则提供了很多选项,且大多都是界面操作,感觉比OpenWRT更成熟稳定易用,单在这一方面来说。
直通网卡
hostpci0: 0000:05:00 # SFP+ 网卡
hostpci1: 0000:02:00 # 1G网卡,用于连接硬路由
iStoreOS
PVE
在PVE创建虚拟机,暂时不选中系统盘,直接删掉。
将固件和工具拷贝至 /root
目录下,然后在终端输入:
# 例如: ./img2kvm ./istoreos-22.03.5-2023102711-x86-64-squashfs-combined.img.gz 101 local
./img2kvm 固件完整名 虚拟机ID local
然后看 iStoreOS 虚拟机的硬件界面,会出现一个未添加的硬盘,双击添加,且不用修改任何设置。最后面修改引导顺序即可。
Unraid
unRaid 创建 iStoreOS 虚拟机需要下载 EFI版本 的固件,直接将 istoreos-22.03.7-2024120615-x86-64-squashfs-combined-efi.img
作为虚拟磁盘,另外也可以使用 dd
命令对其进行扩容。
dd if=/dev/zero bs=1G count=64 >> istoreos-22.03.7-2024120615-x86-64-squashfs-combined-efi.img
启动虚拟机后,在控制台输入 quickstart
修改LAN地址,使得能够访问。
搭建内网
在之前一般都是使用 iStoreOS 作为旁路由使用,有时我们也想将其作为主路由,例如我们想新增一个内网。
那么将能够访问外网的接口设为 WAN 口,将待接入到内网的接口设为 LAN 口。并使能其接口上的DHCP服务。
在设置 LAN 接口时,我们可以将其协议改为 静态地址
,IPv4 地址改为类似于 192.168.8.1
。
最后在 quickstart
命令中,设置 iStoreOS 能够通过 WAN 地址访问,这样我们就能在搭建的局域网上一级网络中访问到 iStoreOS。
做为旁路由,应关闭 提供 DHCPv4 服务
。
使用frpc
我们可以在 iStrore 中安装 Frpc,使得可以远程访问 iStoreOS。有时使用 OpenClash 时,经常遇到无法访问外网,需要更新配置订阅的情况。另外使用前一定要记得更改 iStoreOS 的密码。
局域网DNS解析
有时我们在内网使用DNS解析。
一般方法可以在 例如Windows的 C:\Windows\System32\drivers\etc\hosts
文件直接新增如下:
172.16.0.50 gerrit.reconova.com
172.16.2.4 oaapp.reconova.com
这样的话每台设备都需要添加。
我们也可以直接在 iStoreOS 中添加,利用 Dnsmasq 进行域名解析。在 网络
➡DHCP/DNS
➡常规设置
➡地址
下,添加如下两条:
/gerrit.reconova.com/172.16.0.50
/oaapp.reconova.com/172.16.2.4
即可达到内网下 iStoreOS 为网关的机器能够成功解析以上两个局域网域名。
Windows出现默认网关 0.0.0.0
在使用软路由时,Windows下执行 ipconfig
经常会发现出现如下情况而不能正常上网:
以太网适配器 以太网 2:
连接特定的 DNS 后缀 . . . . . . . : lan
本地链接 IPv6 地址. . . . . . . . : fe80::8369:60c4:f2d0:2cc6%8
IPv4 地址 . . . . . . . . . . . . : 192.168.3.208
子网掩码 . . . . . . . . . . . . : 255.255.255.0
默认网关. . . . . . . . . . . . . : 0.0.0.0
192.168.3.1
这是以管理器权限执行:
route delete 0.0.0.0
即可,然后再通过插拔网线或者先禁用后使能的方法使网口重新获取一次IP即可解决问题。
网络配置次数过多(例如多次安装iStoreOS)Windows 电脑会显示 网络 2
、 ... 、网络 7
等显示,将注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles
的子项删除即可。
DNS污染问题
直至今日(2024/11/04)我才注意到DNS被污染的严重问题。
如果DNS受到污染,有时可能连 www.baidu.com
这类的网址都无法解析到 IP 地址。
当使用浏览器访问某个网页,出现 DNS_PROBE_FINISHED_NXDOMAIN
错误时,就应该警惕:是不是我的DNS域名解析服务出现问题了。
PS C:\Users\amass> nslookup.exe baijiahao.baidu.com
DNS request timed out.
timeout was 2 seconds.
服务器: UnKnown
Address: fe80::1
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** 请求 UnKnown 超时
一般家里局域网最上级的路由器会将DNS指向它的上级路由器地址,这个时候DNS很容器实现问题(如上就是一直让我懵逼且难受的问题,然后我还一直以为是电脑的问题,希望靠重装电脑系统解决问题......)。
这里我们选用 阿里公共DNS:
IPv4:
- 223.5.5.5
- 223.6.6.6
IPv6:
- 2400:3200::1
- 2400:3200:baba::1
以上我们可以直接在路由器设置,让使用DHCP服务的设备不需要再手动配置。
Ubuntu Docker
Proxmox Virtual Environment (PVE) 官方不提供 Docker 支持,但我们可以在 PVE 上的虚拟机或 LXC 容器中自行安装和运行 Docker,从而实现应用容器化。
为了 PVE 的安全和稳定性,我们不在 PVE 主机环境下安装 Docker。
创建 Ubuntu24.04 LXC。
创建CT时,取消勾选 无特权的容器。创建完成后(如果不取消勾选 无特权的容器,运行容器时会失败,打开控制台出现假死现象),创建完成后不要立即启动容器,在容器的 选项→功能 页面,勾选 嵌套、NFS、SMB/CIFS、FUSE 选项。
创建CT时,填入的主机名
会忽略 .
后的内容,我填的 Ubuntu24.04
,启动CT后,主机名显示的是 Ubuntu24
,且无法通过 /etc/hostname
修改。
在LXC配置文件加入如下配置以映射 PVE 主机目录至容器内部,用来存储文件:
mp0: /mnt/user,mp=/mnt/user,backup=0
# mp1, ...依次往后递增
# 也支持直接挂载存储设备符,例如:
# mp0: /dev/mmcblk0,mp=/mnt/emmc,backup=0
加入如下配置以支持 Docker 的完整功能:
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
更换软件源,安装 Docker:
sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
apt-get update && apt upgrade -y
apt-get install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker 安装完成后,验证是否成功安装:
docker run hello-world
中文
编辑配置文件,增加中文支持:
# 找到这一行,取消注释
zh_CN.UTF-8 UTF-8
export LC_ALL=zh_CN.UTF-8
然后运行命令,生成对应配置,安装中文字体:
locale-gen
apt install fonts-noto-cjk-extra
SSH
修改sshd配置文件,找到PermitRootLogin
这一行,修改如下以允许root ssh登录:
PermitRootLogin yes
然后执行:
systemctl restart sshd
SMB
安装 Samba 服务:
apt install -y samba
设置 Samba 用户:
# 如果用户不存在,则需要先创建
adduser amass
smbpasswd -a amass
创建文件夹:
apt install acl # 用于文件夹权限控制
mkdir /mnt/user/Downloads
# 为用户设置 ACL
setfacl -m u:amass:rwx /mnt/user/Downloads
配置 Samba:
[Downloads]
path = /mnt/user/Downloads
available = yes
valid users = amass,other_username ;仅 root 和 other_username 账号能访问
access based share enum = Yes ;仅可访问该目录的账号可见
read only = no
browsable = yes
public = yes
writable = yes
重启 Samba 服务:
systemctl restart smbd
v2raya-openwrt
v2raya-openwrt 支持在 OpenWRT 上使用 V2Ray。
wget https://downloads.sourceforge.net/project/v2raya/openwrt/v2raya.pub -O /etc/opkg/keys/94cc2a834fb0aa03
echo "src/gz v2raya https://downloads.sourceforge.net/project/v2raya/openwrt/$(. /etc/openwrt_release && echo "$DISTRIB_ARCH")" | tee -a "/etc/opkg/customfeeds.conf"
opkg update
opkg install v2raya
opkg install kmod-nft-tproxy
opkg install v2ray-core
opkg install luci-app-v2raya
提示:downloading missing geoip.dat and geosite.dat; refresh the page later.
去 v2ray-rules-dat 下载 geoip.dat 和 geosite.dat 文件并复制到以下目录,如果使用的 v2ray 内核,则应复制文件到
/usr/share/v2ray/
。
透明代理/系统代理实现方式
设置为 tproxy
。tproxy 是透明代理的意思。
OpenClash
在Releases页面下载安装包,安装:
#nftables
opkg update
opkg install coreutils-nohup bash dnsmasq-full curl libcurl4 ca-certificates ipset ip-full libcap libcap-bin ruby ruby-yaml kmod-tun kmod-inet-diag unzip kmod-nft-tproxy luci-compat luci luci-base
opkg install ./luci-app-openclash_0.46.014-beta_all.ipk
在 Plugin Settings → 版本更新下,可以将内核版本下载好。
在 Config Subscrible → 编辑配置文件订阅信息 → 新增 添加我们的机场订阅,勾选在线订阅转换、添加Emoji、启动UDP支持。设置完之后,点击 更新配置。
最后在 Overviews 下面点击 启动 OPENCLASH
即可。
策略组和规则
OpenClash最核心的作用就是分流。分流就是哪些域名通过哪个节点代理访问,或者不通过代理直接直连。而这个决定的方法就叫分流策略,OpenClash有很复杂完善的分流策略配置方式。在Youtube看到一个不错的视频:添加自定义规则和策略组。
有时想实现一些自定义的分流规则,无法通过现成的规则文件实现需求,那么就需要前往 OpenClash 的 “覆写设置”-“规则设置” 中添加自定义规则(内容保存在 /etc/openclash/custom/openclash_custom_rules.list 文件中):
script:
rules:
- DOMAIN-SUFFIX,oray.com,DIRECT
- DOMAIN-SUFFIX,amass.fun,DIRECT #匹配域名后缀,不走代理
- DOMAIN-KEYWORD,google,♻️ 自动选择 #匹配域名关键字(交由♻️ 自动选择代理服务器组)
- DOMAIN-SUFFIX,typora.io,♻️ 自动选择
有时我们不知道一个网址到底是走的哪个策略,哪个代理节点。可以通过查看Clash控制面板的日志确定,例如
[2023-12-07 00:03:05][INFO] [TCP] connected lAddr=192.168.1.11:50505 rAddr=www.google.com.hk:443 mode=rule rule=DomainKeyword(google) proxy=🔰 节点选择[🇺🇸 美国 03 | 专线]
可知www.google.com.hk应用的是🔰 节点选择 策略,使用的是 [🇺🇸 美国 03 | 专线] 这一节点。
待学习的知识点
ProxyChains
我们可以使能 OpenClash 的 SOCKS5 代理端口,这样能够使其它的主机能够通过 SOCKS5 代理访问,例如 ProxyChains。首先确保 Clash 如下配置:
socks-port: 7891
allow-lan: true
bind-address: "*"
注意在 覆写设置
➡ 常规设置
➡ 设置 SOCKS5/HTTP(S) 认证信息
里有填入认证信息,这里我们选择去除。
可以手动使用 SOCKS5 代理:
ALL_PROXY=socks5://172.16.103.116:7891 git clone https://github.com/user/repository.git
也可以使用使用 proxychains
,安装:
apt install proxychains
修改配置文件:
# proxy_dns # 这里我们注释
socks5 172.16.103.116 7891
然后就可以如下使用:
proxychains npx create-next-app@latest
Windows11
下载 Windows VirtIO Drivers,在系统选项卡中,勾选 Qemu代理。
在安装系统完成后,还要继续在Windows VirtIO Drivers上安装网卡等驱动。
直通显卡
参考文档:
MacOS
参考文档:
下载OSX-KVM源码,编译生成对应 img 文件:
apt install qemu-utils make
git clone https://github.com/kholia/OSX-KVM.git
cd OSX-KVM/scripts/ventura
make Ventura-recovery.img
编译完成之后,会看到当前目录已经生成好了Ventura-recovery.img
文件。
下载最新版的KVM-Opencore,将Ventura-recovery.img
和OpenCore-v20.iso
上传至PVE的镜像中。
OSK身份验证密钥
ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc
Frp外网访问
使用FRP做内网穿透,让我们能够在外网访问内网的PVE或者其他虚拟机,下载 frp_x.xx.x_linux_amd64.tar.gz 最新二进制包。
frps 部署在云服务器上。
bindPort = 7000
vhostHTTPPort = 8084
webServer.addr = "0.0.0.0"
webServer.port = 8085
# webServer.user = "amass" # 也可以使用账号密码验证
# webServer.password = "xxxxxxxx"
[Unit]
Description=FRP Server Daemon
After = network.target syslog.target
Wants = network.target
[Service]
Type=simple
ExecStart=/root/HttpServer/frps -c /root/HttpServer/frps.toml
Restart=always
RestartSec=2s
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
在服务上启动frps:
systemctl enable frps # 开机自启动
systemctl start frps
访问PVE
frpc 部署于PVE上。
serverAddr = "amass.fun"
serverPort = 7000
[[proxies]]
name = "pve"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8006
remotePort = 8085
[Unit]
Description=FRP Client Daemon
After = network.target syslog.target
Wants = network.target
[Service]
Type=simple
ExecStart=/etc/frpc -c /etc/frpc.toml
Restart=always
RestartSec=2s
LimitNOFILE=infinity
[Install]
WantedBy=multi-user.target
在PVE上启动frpc:
systemctl enable frpc # 开机自启动
systemctl start frpc
最后,想直接能够以 https://pve.amass.fun 访问,则需要在nginx上做frps转发出来的 8085 反向代理:
upstream frp_pve {
server 127.0.0.1:8085;
}
server {
listen 443 ssl;
server_name pve.amass.fun;
client_header_timeout 120s;
client_body_timeout 120s;
client_max_body_size 512m;
ssl_certificate cert/pve.amass.fun.pem;
ssl_certificate_key cert/pve.amass.fun.key;
ssl_session_timeout 5m; #缓存有效期
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #加密算法
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #安全链接可选的加密协议
ssl_prefer_server_ciphers on; #使用服务器端的首选算法
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header x-wiz-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://frp_pve;
}
}
在 阿里 域名解析→解析设置,添加pve.amass.fun
记录,然后在 数字证书管理服务 → SSL证书 添加免费证书。
访问RDP Windows
远程桌面服务所使用的通信协议是Microsoft定义RDP(Remote Desktop Protocol)协议,RDP协议的TCP通信端口号是3389。
serverAddr = "amass.fun"
serverPort = 7000
[[proxies]]
name = "windows11_pve_rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 3389
然后我们使用WinSW创建frpc的Windows服务,下载WinSW的可执行程序WinSW-x64.exe
,拷贝到frpc所在的目录下。注意目录路径不能有空格和非ASCII字符。
将WinSW-x64.exe
命名成frpc-service.exe
(事实上名字任意,只要和后面的xml文件同名即可),再创建配置文件:
<!-- frpc-service.xml -->
<service>
<id>frpc</id>
<name>Frpc Service</name>
<description>A fast reverse proxy to help you expose a local server to the internet.</description>
<executable>C:\Users\Amass\frp_0.52.3_windows_amd64\frpc.exe</executable>
<onfailure action="restart" delay="5 sec" />
<resetfailure>1 day</resetfailure>
<arguments>-c C:\Users\Amass\frp_0.52.3_windows_amd64\frpc.toml</arguments>
<workingdirectory>C:\Users\Amass\frp_0.52.3_windows_amd64</workingdirectory>
<priority>AboveNormal</priority>
<stoptimeout>15 sec</stoptimeout>
<stopparentprocessfirst>false</stopparentprocessfirst>
<startmode>Automatic</startmode>
<waithint>15 sec</waithint>
<sleeptime>1 sec</sleeptime>
<logpath>C:\Users\Amass\frp_0.52.3_windows_amd64\logs</logpath>
<log mode="roll-by-time">
<pattern>yyyyMMdd</pattern>
</log>
</service>
然后执行:
.\frpc-service.exe install # 安装这个service
.\frpc-service.exe start # 启动这个service
更多配置说明,可查看WinSW Github主页。
代理内网http
这里直接通过tcp转发内网http服务。
# frpc.toml
serverAddr = "amass.fun"
serverPort = 7000
[[proxies]]
name = "chatgpt_rw"
type = "http"
localIP = "chatgpt.custom.com"
localPort = 3000
customDomains = ["chatgpt.amass.fun"]
[[proxies]] # 同时再代理rdp
name = "windows11_rw_rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 3390
获取光猫管理员账号
电信
在光猫上插入U盘,访问 http://192.168.1.1:8080 ,以光猫后面写着的普通账号密码先登录进去,登录成功之后,查看网页 main.html
源码,找到 sessionKey
:
var sessionKey='1903488609';
然后进行备份页面:http://192.168.1.1:8080/usbbackup.cmd?action=backupeble&enabled=0&sessionKey=1903488609
,将 sessionKey
替换为实际值。
进去之后通过 USB备份设置
,点击 备份配置
,就可以将配置文件备份到U盘中。在U盘中根目录能看到e8_Config_Backup/ctce8_TGCT-526G.cfg
文件,使用 RouterPassView 打开该文件,找到:
<X_CT-COM_TeleComAccount>
<Password>6?G3Qw$U</Password>
</X_CT-COM_TeleComAccount>
6?G3Qw$U
即为超级管理员账号的密码,超级管理员为:telecomadmin
(每次光猫恢复出厂设置,该密码都会变动)。
猫棒
在折腾猫棒时,过程很不畅,因为其中还是涉及了很多网络相关的知识,例如 EPON、GPON、PPPoE拨号、VLAN、LOGID等名词。
此前一直使用的移动光猫都肩负着拨号和路由的任务。但是在使用猫棒的时候,需要猫棒只做桥接作用,也就是把光信号转化为电信号,路由交给软路由做。一个原因是猫棒也做路由的话会增加功耗,发热,综合性能下降。另一个原因是多加了一层局域网网络需要做访问转发,理论上网络时延会增加。
在调试猫棒时,需要使用到 telnet:
telnet 192.168.1.1 # 访问猫棒,账号/密码 admin/admin
omcicli mib get 84 # 查看vlan相关信息
flash default cs # 恢复出厂设置
reboot # 重启
在输入omcicli mib get 84
后,如果出现如下类似信息,则意味着猫棒已经设置好
BusyBox v1.12.4 (2023-10-21 16:47:13 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
# omcicli mib get 84
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
VlanTagFilterData
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
=================================
EntityID: 0x101
FilterTbl[0]: PRI 0,CFI 0, VID 46
FwdOp: 0x10
NumOfEntries: 1
=================================
=================================
EntityID: 0x102
FilterTbl[0]: PRI 0,CFI 0, VID 41
FwdOp: 0x10
NumOfEntries: 1
=================================
=================================
EntityID: 0xa101
FilterTbl[0]: PRI 0,CFI 0, VID 46
FilterTbl[2]: PRI 0,CFI 0, VID 41
FwdOp: 0x03
NumOfEntries: 2
=================================
如果为空,那么需要还需要在光猫上找参数然后在猫棒上设置。在这段时间的调试过程中,发现移动宽带只需要提供 PLOAM 密码
即可。电信宽带只需要提供 LOID 设定
以及LOID 密码即可
。等这些参数全部设置完成,在猫棒的GPON状态页面就能看到如下数据
GPON状态 | |
---|---|
ONU状态 | O5 |
ONU编号 | 0 |
LOID状态 | 认证成功(或者 Initial state) |
那么基本上可以正常拨号了。
移动光猫超级管理员账号: CMCCAdmin 密码:aDm8H%MdA
如果LOID 密码
这类在超级管理员页面输入框是密码模式,此时我们一定不要修改密码等参数。只需点击保存按钮,然后在浏览器的 检查→网络 处,查看请求即可,例如电信光猫会请求如下url:
http://192.168.1.1:8080/ctloid.cmd?ctLoid=宽带的loid&ctLoidUfxxbtwi=宽带的loid&sessionKey=宽带的loid密码