跳到主要内容

软路由实践

阅读量

0

阅读人次

0

前言

2024/06/29

经过将近一年的使用体验,发现 All In One 模式的软路由,存在很多不足。

  • 使用的猫棒,发热量非常大,手放上去感觉会起水泡。这肯定会给稳定性带来影响。
  • 在折腾 软路由/NAS 的过程中,经常需要断网、重启等操作,这无疑会影响其他使用网络的人。
  • 软路由/NAS 基本就是代表着不稳定,所以网络体验给人带来的感觉就是不好。

这些不足,网上都有人描述。不过自己折腾了一遍,才深有体会。所以后续还是使用光猫 + 2.5G路由器的组合,顶多在 NAS 上根据实际需求,使用 iStroreOS 搭建旁路由。

2023/11/11

经常折腾PC,所以对软路由了解甚久,这次就来折腾一下吧。

经过大约一周的折腾,最后敲定为 爱快(主路由)+ iStoreOS(旁路由)的双路由模式。主要是因为iStoreOS一直拨号不成功,实在没办法才这样,个人意愿还是能少部署一个则少一个。

硬件:

  • 国伟R86S-305的迷你x86主机(这次是下血本了,忍住了这款机型贵,性价比不高的诟病)。

    • CPU:N305,4核4线程,3.40GHz
  • HSGQ SFP千兆猫棒。

系统:

  • Proxmox Virtual Environment,虚拟化平台,后续想着还可以在上面折腾Mac OS。
  • iKuaiOS,试了很久,只有它拨号成功了,且其路由能力很强大,设置DHCP规则很灵活。
  • iStoreOS,基于OpenWRT深度定制的软路由系统。

软件:

  • OpenClash,安装在iStoreOS下,负责科学上网。

IP分配:

设备IP作用详释
猫棒/光猫192.168.1.1桥接光电信号转换
爱快192.168.2.1主路由PPPoe拨号,内网管理
iStoreOS192.168.2.2盘路由安装各种插件
PVE192.168.2.3底层平台管理虚拟底层平台
MediaServer192.168.2.4NAS服务器用于存储文件,Jllyfin
Ubuntu24.04192.168.2.5LXC / VMLinux虚拟机
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

/etc/resolv.conf
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 即可。修改完成后需要重启。

/etc/network/interfaces
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):

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

加载相应的内核模块:

/etc/modules
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输出,即也无法正常通过显示器查看控制台):

/etc/modprobe.d/vfio.conf
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为旁路由,问题得到解决。应该有几种解决方式:

  1. 主路由DHCP/DHCPv6支持设置网关,这样就可以将IPv4/IPv6网关设置成旁路由
  2. 直接在Windows以太网属性中,禁用IPv6协议(目前感觉IPv6用的还不多)
  3. 手动配置IPv6地址,将网关和DNS指向旁路由
  4. 想办法弄清Windows为什么先访问IPv6的DNS,而不是IPv4的DNS

在这段折腾的过程中,感觉到了iKuaiOS配置的强大,一般家用路由器,DHCP都不会提供设置选项,都是默认指向自己,而iKuaiOS则提供了很多选项,且大多都是界面操作,感觉比OpenWRT更成熟稳定易用,单在这一方面来说。

直通网卡

/etc/pve/qemu-server/<iKuaiOS ID>.conf
hostpci0: 0000:05:00 # SFP+ 网卡
hostpci1: 0000:02:00 # 1G网卡,用于连接硬路由

iStoreOS

在PVE创建虚拟机,暂时不选中系统盘,直接删掉。

下载最新固件,以及img2kvm工具。unRaid 创建 iStoreOS 虚拟机需要下载 EFI版本 的固件。

将固件和工具拷贝至 /root 目录下,然后在终端输入:

# 例如: ./img2kvm ./istoreos-22.03.5-2023102711-x86-64-squashfs-combined.img.gz 101 local
./img2kvm 固件完整名 虚拟机ID local

然后看 iStoreOS 虚拟机的硬件界面,会出现一个未添加的硬盘,双击添加,且不用修改任何设置。最后面修改引导顺序即可。

启动虚拟机后,在控制台输入 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服务的设备不需要再手动配置。

MediaServer

创建CT时,取消勾选 无特权的容器。创建完成后(如果取消勾选 无特权的容器,此时立即运行会失败,打开控制台出现假死现象),在容器的 选项→功能 页面,勾选 嵌套、NFS、SMB/CIFS选项。

在PVE下编辑配置文件,挂载emmc作为文件存储盘

/etc/pve/lxc/<自己安装时的CT ID>.conf
	......
mp0: /dev/mmcblk0,mp=/mnt/emmc,backup=0
mp1: /opt/Movies,mp=/mnt/Movies,backup=0
......

增加中文支持:

/etc/locale.gen
# zh_CN GB2312
# zh_CN.GB18030 GB18030
# zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8 # 找到这一行,取消注释

然后运行命令:

locale-gen

再编辑文件:

/etc/profile
# 在文件末尾加入
export LC_ALL=zh_CN.UTF-8

替换国内源并更新:

sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/sources.list
sed -i 's|security.debian.org|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list.d/security.sources.list
apt update && apt upgrade
apt install fonts-noto-cjk-extra

可以通过WebAdmin配置挂载选项,也可以通过修改配置文件。

/etc/samba/smb.conf
[emmc]
path = /mnt/emmc
valid users = root ; 仅 root 账号能访问
access based share enum = Yes ; 仅可访问该目录的账号可见

Docker

创建 Ubuntu22.04 LXC,。创建成功之后,安装Docker:

sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
apt-get update && apt upgrade
apt-get install ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] 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

最后在LXC配置文件加入:

/etc/pve/lxc/<自己安装时的CT ID>.conf
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:

在功能选项卡中使能嵌套,重启LXC,验证是否成功安装好Docker:

docker run hello-world

修改sshd配置文件,找到PermitRootLogin这一行,修改如下以允许root ssh登录:

/etc/ssh/sshd_config
PermitRootLogin yes

然后执行:

systemctl restart sshd

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 文件中):

/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.imgOpenCore-v20.iso上传至PVE的镜像中。

OSK身份验证密钥

ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc

Frp外网访问

使用FRP做内网穿透,让我们能够在外网访问内网的PVE或者其他虚拟机,下载 frp_x.xx.x_linux_amd64.tar.gz 最新二进制包。

frps 部署在云服务器上。

/root/HttpServer/frps.toml
bindPort = 7000
vhostHTTPPort = 8084

webServer.addr = "0.0.0.0"
webServer.port = 8085
# webServer.user = "amass" # 也可以使用账号密码验证
# webServer.password = "xxxxxxxx"
/etc/systemd/system/frps.service
[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上。

/etc/frpc.toml
serverAddr = "amass.fun"
serverPort = 7000

[[proxies]]
name = "pve"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8006
remotePort = 8085
/etc/systemd/system/frpc.service
[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。

frpc.toml
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文件同名即可),再创建配置文件:

C:\Users\Amass\frp_0.52.3_windows_amd64\frpc-service.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密码

遇到的名词