分类: 技术

  • 移动光猫超级密码获取教程:诺基亚XG-04G-MF桥接模式设置详解

    前言

    随着千兆宽带的普及,越来越多用户希望充分发挥网络性能,而运营商提供的光猫往往在路由功能和管理界面上存在限制。本文将详细介绍如何获取移动光猫的超级用户权限,并将其配置为桥接模式,以便使用性能更强的第三方路由器来管理网络。

    免责声明:本文仅供技术学习和个人网络优化使用,请在合法合规的前提下操作。

    设备信息与背景

    测试环境

    • 光猫型号:XG-04G-MF
    • 制造商:诺基亚贝尔股份公司
    • 设备类型:10Gbit无源光网络用户端设备(XG-PON ONE)
    • 运营商:中国移动
    • 宽带套餐:1000M(10元宽带包+10元提速包)
    • 下游路由器:基于J4125的OpenWrt软路由

    技术背景

    什么是光猫?

    光猫(Optical Network Unit,ONU)是光纤接入网络的用户端设备,主要功能是将光信号转换为电信号,实现光纤到户(FTTH)。现代光猫通常集成了路由器功能,但性能和管理灵活性往往不如专业路由设备。

    为什么需要桥接模式?

    1. 性能优化:专业路由器通常具有更强的处理能力和更丰富的功能
    2. 网络管理:避免双重NAT问题,简化网络拓扑
    3. 个性化配置:获得更多的网络控制权和配置选项
    4. 避免干扰:减少运营商远程配置对个人网络设置的影响

    操作前的重要说明

    权限层级说明

    移动光猫通常有三个权限级别:

    • user:普通用户权限(光猫背面标注),功能有限
    • user_ftp:系统管理员权限,但是是user密码
    • CMCCAdmin:超级管理员权限,可以进行高级配置
    • root:系统管理员权限,具有完全控制能力

    风险提示

    1. 操作过程中可能导致设备无法正常工作
    2. 修改配置可能影响运营商的技术支持
    3. 请确保具备基本的网络知识和故障排除能力
    4. 建议在操作前备份重要配置信息

    详细操作步骤

    第一步:准备工作

    1.1 断开光纤连接

    目的:防止运营商远程干预和配置下发
    操作:拔掉光猫上的光纤接头
    注意:确保只有本地网络连接

    1.2 重置光猫

    操作:按住光猫背面的Reset键,保持10-15秒
    等待:观察指示灯,等待设备完全重启
    结果:光猫恢复出厂设置,可以使用默认超级密码

    1.3 网络连接

    • 使用网线将电脑直接连接到光猫的LAN口
    • 确保电脑获取到192.168.1.x网段的IP地址
    • 可以通过浏览器访问192.168.1.1

    第二步:获取超级用户权限

    2.1 使用默认超级密码登录

    用户名:CMCCAdmin
    密码:aDm8H%MdA
    登录地址:http://192.168.1.1

    技术说明:这是移动光猫的出厂默认超级密码,除了诺基亚版本的光猫,其他版本同样是这个。在正常注册流程中,运营商会通过TR069协议远程修改此密码。

    2.2 开启Telnet服务

    访问以下URL开启Telnet:

    http://192.168.1.1/system.cgi?telnet

    注意:此URL仅适用于诺基亚制造的光猫型号。其他品牌可能有不同的开启方式。

    第三步:获取root密码

    我们提供两种方法获取root权限,推荐使用方法一:

    方法一:密码解密法(推荐)

    3.1 获取加密密码

    1. 在已登录的CMCCAdmin界面访问: http://192.168.1.1/dumpdatamodel.cgi
    2. 在页面中搜索SuPassword,找到类似以下的代码块:
    <CLIPrompt rw="RW" v="\\\\$"></CLIPrompt>
    <SuPassword rw="RW" v="**************" ealgo="ab"></SuPassword>
    <SSHEnable rw="RW" v="False"></SSHEnable>
    1. 记录SuPasswordv属性的值(24个字符的加密字符串)

    3.2 密码解密

    诺基亚光猫使用AES-CBC加密,密钥和向量固定:

    • 密钥3D A3 73 D7 DC 82 2E 2A 47 0D EC 37 89 6E 80 D7 2C 49 B3 16 29 DD C9 97 35 4B 84 03 91 77 9E A4
    • 初始向量D0 E6 DC CD A7 4A 00 DF 76 0F C0 85 11 CB 05 EA

    使用以下Python脚本解密:

    import base64  
    from typing import Optional  
    from Crypto.Cipher import AES  
    
    class RouterCrypto:  
        """路由器加密解密工具类"""  
        DEFAULT_KEY = '3D A3 73 D7 DC 82 2E 2A 47 0D EC 37 89 6E 80 D7 2C 49 B3 16 29 DD C9 97 35 4B 84 03 91 77 9E A4'  
        DEFAULT_IV = 'D0 E6 DC CD A7 4A 00 DF 76 0F C0 85 11 CB 05 EA'  
    
        def __init__(self, key: Optional[str] = None, iv: Optional[str] = None):  
            self.key = key or self.DEFAULT_KEY  
            self.iv = iv or self.DEFAULT_IV  
            self._cipher = None  
            self._init_cipher()  
    
        def _init_cipher(self) -> None:  
            """初始化AES密码器"""  
            try:  
                key_bytes = self._hex_string_to_bytes(self.key)  
                iv_bytes = self._hex_string_to_bytes(self.iv)  
                self._cipher = AES.new(key_bytes, AES.MODE_CBC, iv_bytes)  
            except Exception as e:  
                raise ValueError(f"初始化密码器失败: {e}")  
    
        @staticmethod  
        def _hex_string_to_bytes(hex_string: str) -> bytes:  
            """将十六进制字符串转换为字节"""  
            hex_clean = hex_string.replace(' ', '')  
            return bytes.fromhex(hex_clean)  
    
        @staticmethod  
        def _remove_pkcs7_padding(data: bytes) -> bytes:  
            """移除PKCS7填充"""  
            if not data:  
                return data  
            padding_length = data[-1]  
            if padding_length > len(data) or padding_length == 0:  
                raise ValueError("无效的填充")  
            for i in range(padding_length):  
                if data[-(i + 1)] != padding_length:  
                    raise ValueError("填充验证失败")  
            return data[:-padding_length]  
    
        def decrypt(self, encrypted_data: bytes) -> bytes:  
            """解密数据"""  
            try:  
                self._init_cipher()  
                decrypted = self._cipher.decrypt(encrypted_data)  
                return self._remove_pkcs7_padding(decrypted)  
            except Exception as e:  
                raise ValueError(f"解密失败: {e}")  
    
        def decrypt_base64(self, base64_data: str, encoding: str = 'utf-8') -> str:  
            """解密Base64编码的数据并返回字符串"""  
            try:  
                encrypted_bytes = base64.b64decode(base64_data)  
                decrypted_bytes = self.decrypt(encrypted_bytes)  
                return decrypted_bytes.decode(encoding)  
            except Exception as e:  
                raise ValueError(f"Base64解密失败: {e}")  
    
    def main():  
        # 将获取到的加密密码填入这里
        encrypted_base64 = '这里填入SuPassword的v值'  
    
        try:  
            crypto = RouterCrypto()  
            decrypted_text = crypto.decrypt_base64(encrypted_base64)  
            print(f"解密结果: {decrypted_text}")  
        except Exception as e:  
            print(f"解密失败: {e}")  
    
    if __name__ == "__main__":  
        main()

    方法二:FTP用户提权法

    1. 在CMCCAdmin界面启用FTP和Samba服务:
      • 进入应用 -> 家庭存储 -> FTP,勾选启用FTP
      • 进入应用 -> 家庭存储 -> SAMBA共享,勾选启用Samba
    2. 使用普通用户账户Telnet登录光猫
    3. 切换到FTP用户:
    su user_ftp
    # 密码与user用户相同
    1. 获取root权限:
    su  # 切换到root用户
    passwd  # 重置root密码

    第四步:宽带账号配置

    4.1 获取宽带账号密码

    方法一:移动APP查询

    • 登录中国移动手机APP
    • 在宽带服务中查看或重置宽带密码

    方法二:从光猫配置中提取

    1. 访问配置导出页面: http://192.168.1.1/dumpdatamodel.cgi
    2. 搜索你的宽带账户名(通常是手机号),找到Username段:
    <Username rw="RW" v="你的宽带账号"></Username>
    <Password rw="RW" v="加密的密码" ealgo="ab"></Password>
    1. 使用nokia-router-cfg-tool.py脚本解密密码:
    python nokia-router-cfg-tool.py -d 加密的密码字符串

    4.2 注册光猫

    1. 重新连接光纤
    2. 配置宽带连接
      • 登录CMCCAdmin账户
      • 进入网络 -> 宽带设置 -> Internet连接
      • 找到2_INTERNET_B_VID_41连接,确保使用路由模式而不是桥接
      • 填入宽带账号和密码(默认密码通常是6个8)
      • 保存并启用配置
    3. 等待注册完成
      • 观察光猫指示灯
      • 注册灯熄灭,上网灯亮起表示注册成功

    第五步:重置超级密码

    由于运营商会在注册成功后自动修改CMCCAdmin密码,需要通过Telnet重新设置:

    # 使用root或user_ftp用户登录Telnet
    telnet 192.168.1.1
    
    # 重置超级密码为原始密码
    cfgcli -s InternetGatewayDevice.DeviceInfo.X_CT-COM_TeleComAccount.Password aDm8H%MdA

    注意:根据测试,只有设置为aDm8H%MdA才能成功,其他密码可能会失败。

    第六步:配置桥接模式

    重新获得CMCCAdmin权限后,可以进行桥接模式配置:

    1. 登录管理界面:使用CMCCAdmin和重置后的密码
    2. 修改连接模式
      • 进入网络 -> 宽带设置 -> Internet连接
      • 将主要连接的模式从”路由”改为”桥接”
      • 保存配置
    3. 配置下游路由器
      • 在你的OpenWrt或其他路由器中配置PPPoE拨号
      • 使用宽带账号和密码进行连接

    高级配置:禁用TR069

    如果你希望阻止运营商远程下发配置,可以删除TR069连接:

    操作步骤

    1. 登录CMCCAdmin账户
    2. 进入网络 -> 宽带设置 -> Internet连接
    3. 找到连接名称为tr069的项目
    4. 如果删除按钮被禁用,使用开发者工具:
      • 按F12打开开发者工具
      • 找到删除按钮的HTML元素:
    <input class="buttonX" type="submit" id="do_del" value="删除" disabled>
    - 删除`disabled`属性
    - 点击删除按钮

    TR069协议说明

    TR069(Technical Report 069)是一种应用层协议,用于远程管理CPE(Customer Premises Equipment)设备。运营商通过此协议可以:

    • 远程配置设备参数
    • 监控设备状态
    • 推送固件更新
    • 重置设备配置

    删除TR069连接可以阻止这些远程操作,但也可能影响运营商的技术支持服务。

    网络拓扑优化建议

    推荐网络架构

    光纤 -> 光猫(桥接模式) -> 主路由器 -> 交换机/AP

    配置要点

    1. 光猫设置
      • 启用桥接模式
      • 关闭DHCP服务
      • 关闭Wi-Fi功能(如果不需要)
    2. 主路由器设置
      • 配置PPPoE拨号
      • 设置合适的DNS服务器
      • 配置防火墙和端口转发
    3. 性能优化
      • 启用硬件NAT加速(如果支持)
      • 优化QoS设置
      • 合理分配带宽

    故障排除

    常见问题

    问题1:无法访问192.168.1.1

    • 检查网线连接
    • 确认IP地址获取正确
    • 尝试使用静态IP配置

    问题2:默认超级密码无法登录

    • 确认光猫已完全重置
    • 检查光纤是否已断开
    • 尝试多次重置操作

    问题3:Telnet连接失败

    • 确认Telnet服务已开启
    • 检查Windows Telnet客户端是否已启用
    • 尝试使用PuTTY等第三方工具

    问题4:密码解密失败

    • 检查加密字符串是否完整
    • 确认使用正确的密钥和向量
    • 验证Python环境和依赖库

    恢复措施

    如果操作过程中出现问题:

    1. 重新执行重置操作
    2. 联系运营商技术支持
    3. 考虑更换光猫设备

    总结

    通过本文的详细步骤,你应该能够成功获取移动光猫的超级用户权限,并将其配置为桥接模式。这样可以充分发挥高性能路由器的优势,获得更好的网络体验和管理灵活性。

    请记住:

    • 操作前做好充分准备和风险评估
    • 保存重要配置信息以备恢复
    • 在合法合规的前提下进行操作
    • 如有疑问,及时寻求专业技术支持

    注意事项:本文内容基于特定型号设备的测试结果,不同型号的光猫可能存在差异。请根据实际情况调整操作步骤,并承担相应的操作风险。

    参考资料与延伸阅读


    本文于2025年编写,如有技术更新或设备型号变化,请参考最新的官方文档和社区资源。

  • 在Mac上使用UTM虚拟机搭建OpenWrt软路由

    前言

    本文介绍如何在macOS系统上使用UTM虚拟机软件搭建OpenWrt软路由,实现网络共享和管理。这种方案特别适合需要在Mac设备上创建独立网络环境的场景,例如校园网环境下的网络共享。

    环境准备

    1. 安装UTM虚拟机

    UTM是一款基于QEMU的macOS虚拟机软件,支持ARM架构的Mac设备(M1/M2/M3等)。

    2. 下载OpenWrt固件

    本文推荐使用ImmortalWrt(OpenWrt的中国分支),它对国内网络环境和常用软件包支持更好。

    • 固件下载地址:ImmortalWrt ARM64版本
    • 选择文件:immortalwrt-24.10.0-armsr-armv8-generic-ext4-combined-efi.img.gz

    下载后使用以下命令解压:

    gunzip immortalwrt-24.10.0-armsr-armv8-generic-ext4-combined-efi.img.gz

    创建虚拟机

    1. 新建虚拟机

    1. 打开UTM,点击”添加虚拟机”
    2. 选择”虚拟化” → “其他”
    3. 启动设备选择”无”
    4. 内存和CPU根据需求配置(建议至少1GB内存,2核CPU)
    5. 存储先不配置,稍后手动添加

    2. 配置虚拟机

    右键点击创建的虚拟机,选择”编辑”,进行以下配置:

    2.1 添加串行设备

    在”设备”中添加一个串行设备,用于控制台访问。

    2.2 查看主机网络接口

    在Mac系统中查看网络接口信息:

    • 打开”关于本机” → “更多信息” → “系统报告” → “网络”
    • 记录各网络接口的BSD设备名称(如en0、en1等)

    2.3 添加网络接口

    添加两个网络接口,分别用于WAN和LAN:

    1. WAN接口(连接上游网络)
      • 桥接模式:选择Mac的WiFi接口(通常是en1)
      • 模拟网卡:virtio-net-pci
      • 记录MAC地址(例如:AA:10:CE:BC:8C:BC)
    2. LAN接口(连接下游设备)
      • 桥接模式:选择Mac的以太网接口(通常是en0)
      • 模拟网卡:virtio-net-pci
      • 记录MAC地址(例如:CE:15:05:F8:E9:89)

    2.4 添加存储驱动器

    1. 新建驱动器,类型选择VirtIO
    2. 导入之前解压的OpenWrt镜像文件

    3. 启动虚拟机

    配置完成后启动虚拟机,OpenWrt将自动启动。

    配置OpenWrt网络

    1. 识别网络接口

    首次启动后,通过串行控制台登录OpenWrt(默认无密码),使用以下命令查看网络接口:

    ip addr

    根据MAC地址对应关系识别接口:

    • eth0: AA:10:CE:BC:8C:BC(对应WAN)
    • eth1: CE:15:05:F8:E9:89(对应LAN)

    2. 配置网络接口

    使用UCI命令配置网络:

    # 配置WAN接口(eth0)- 从上游网络获取IP
    uci set network.wan=interface
    uci set network.wan.device='eth0'
    uci set network.wan.proto='dhcp'
    
    # 配置LAN接口(eth1)- 为下游设备提供服务
    uci set network.lan=interface
    uci set network.lan.device='eth1'
    uci set network.lan.proto='static'
    uci set network.lan.ipaddr='192.168.31.1'
    uci set network.lan.netmask='255.255.255.0'
    
    # 提交配置并重启网络
    uci commit network
    /etc/init.d/network restart

    3. 验证配置

    再次运行ip addr,确认接口配置正确:

    • eth0应该获取到上游网络分配的IP地址
    • eth1应该显示配置的静态IP地址(192.168.31.1)

    配置Mac主机路由

    为了让Mac能够访问OpenWrt的管理界面,需要配置路由:

    # 1. 清理可能存在的旧路由
    sudo route delete 192.168.31.0/24 2>/dev/null
    sudo route delete -net 192.168.31.0/24 2>/dev/null  
    sudo route delete 192.168.31.1 2>/dev/null
    
    # 2. 配置en0接口IP地址
    sudo ifconfig en0 down
    sudo ifconfig en0 192.168.31.100 netmask 255.255.255.0 up
    
    # 3. 添加路由
    sudo route add -net 192.168.31.0/24 -interface en0
    
    # 4. 验证连接
    ping 192.168.31.1

    成功后,可以通过浏览器访问 http://192.168.31.1 进入OpenWrt管理界面。

    IPv6配置(校园网环境)

    对于支持IPv6的校园网环境,需要进行额外配置以支持IPv6:

    1. WAN6接口配置

    在LuCI界面中,进入”网络” → “接口” → “WAN6″:

    常规设置:

    • 勾选”拓展前缀”(获取IPv6-PD)
    • 设备选择eth0

    DHCP服务器 → IPv6设置:

    • RA服务:中继模式
    • DHCPv6服务:中继模式
    • NDP代理:中继模式

    2. LAN接口IPv6配置

    在”网络” → “接口” → “LAN”:

    高级设置:

    • IPv6前缀分配:::156(根据实际情况调整)
    • 勾选”强制链路”

    DHCP服务器:

    • 高级设置:勾选”强制”
    • IPv6设置:
      • RA服务:服务器模式
      • DHCPv6服务:服务器模式
      • NDP代理:混合模式

    总结

    通过UTM虚拟机在Mac上搭建OpenWrt软路由,可以实现灵活的网络管理和共享。这种方案特别适合:

    • 需要在Mac上创建独立网络环境
    • 校园网多设备共享
    • 学习和测试网络配置

    本文介绍的配置方法经过实际测试,能够稳定运行。根据具体网络环境,可能需要调整部分配置参数。

  • OpenWrt ext4系统下的根分区扩容指南

    以下为本篇文章测试环境,因此仅对部分环境有借鉴意义

    型号Raspberry Pi 4 Model B Rev 1.4
    架构ARMv8 Processor rev 3 (v8l) x 4 (1800Mhz, 48.2°C)
    目标平台bcm27xx/bcm2711
    固件版本ImmortalWrt 24.10.0 r32824-6a73dae98c9c / LuCI openwrt-24.10 branch 25.017.24510~d42ec55
    使用的固件为openwrt-24.10.0-bcm27xx-bcm2711-rpi-4-ext4-factory。非overlay系统

    原理

    首先扩展根分区,然后扩展文件系统
    Expanding root partition(扩展根分区)

    • 这指的是在物理或虚拟存储设备上增加分区的大小
    • 涉及到修改分区表,调整分区的物理边界
    • 使用类似 fdisk、parted 等工具来完成
    • 这是底层的存储空间调整

    Expanding root filesystem(扩展根文件系统)

    • 这指的是调整文件系统本身的大小以使用更大的分区空间
    • 在分区已经扩展后,需要执行此操作才能实际使用新增的空间
    • 使用类似 resize2fs(ext4)、xfs_growfs(XFS)等工具来完成
    • 这是文件系统层面的操作

    简单来说:

    1. 扩展根分区是在存储设备层面增加可用空间
    2. 扩展根文件系统是让文件系统知道并能够使用这些新增的空间

    在 OpenWRT 中,如果要完整地扩展根目录的可用空间,通常需要依次执行这两个步骤。先扩展分区,再扩展文件系统,这样才能真正利用到新增的存储空间。

    准备

    安装对应工具

    首先,需要安装parted resize2fs losetup

    opkg update
    opkg install parted resize2fs lostup

    检查OpenWrt系统固件

    由于我的OpenWrt系统是ext4,因此并没有使用overlay,从命令输出也可以看出来

    root@ImmortalWrt:~# block info
    /dev/mmcblk0p1: UUID="67A3-2229" LABEL="boot" VERSION="FAT16" MOUNT="/boot" TYPE="vfat"
    /dev/mmcblk0p2: UUID="ff313567-e9f1-5a5d-9895-3ba130b4a864" LABEL="rootfs" VERSION="1.0" MOUNT="/" TYPE="ext4"
    
    root@ImmortalWrt:~# mount
    /dev/root on / type ext4 (rw,noatime)
    proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
    sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
    cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
    tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)
    /dev/mmcblk0p1 on /boot type vfat (rw,noatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
    tmpfs on /dev type tmpfs (rw,nosuid,noexec,noatime,size=512k,mode=755)
    devpts on /dev/pts type devpts (rw,nosuid,noexec,noatime,mode=600,ptmxmode=000)
    debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,noatime)
    bpffs on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,noatime,mode=700)

    这确实不是 overlay 文件系统。从输出可以看到: 当前有两个分区:

    • /dev/mmcblk0p1:FAT16格式,挂载在 /boot
    • /dev/mmcblk0p2:ext4格式,挂载在根目录 /

    目前的系统是直接运行在 ext4 分区上,而不是 overlay 文件系统

    调整分区表

    使用parted进行调整

    得知统是直接运行在 ext4 分区上,因此我们使用parted检查分区并扩容

    parted -l -s # 查看磁盘名和序号
    
    parted /dev/mmcblk0 resizepart 2 100% #

    此时运行命令,发现我们的分区表已成功调整

    root@ImmortalWrt:~# parted /dev/mmcblk0 print
    Model: SD ED2S5 (sd/mmc)
    Disk /dev/mmcblk0: 128GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    Disk Flags: 
    
    Number  Start   End     Size    Type     File system  Flags
     1      4194kB  71.3MB  67.1MB  primary  fat16        boot, lba
     2      75.5MB  128GB   128GB   primary  ext4

    使用fdisk进行调整

    如果你无法使用parted进行调整,请尝试使用fdisk调整。若上一步调整成功,则无需理会此步骤。

    opkg install parted

    首先查看分区表:

    fdisk -l
    
    Disk /dev/mmcblk0: 119.38 GiB, 128177930240 bytes, 250347520 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
    Disklabel type: dos
    Disk identifier: 0x3c92ff95
    
    Device         Boot  Start       End   Sectors   Size Id Type
    /dev/mmcblk0p1 *      8192    139263    131072    64M  6 FAT16
    /dev/mmcblk0p2      147456 250347519 250200064 119.3G 83 Linux

    发现我们需要修改的磁盘名为/dev/mmcblk0,因此执行:

    fdisk /dev/mmcblk0

    按照图示内容进行修改即可,建议mmcblk0p2按照原本的start位置开始分区,避免其他错误。

    root@ZhangOpenWrt:~# fdisk /dev/mmcblk0
    
    Welcome to fdisk (util-linux 2.40.2).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    This disk is currently in use - repartitioning is probably a bad idea.
    
    Command (m for help): p
    
    Disk /dev/mmcblk0: 119.38 GiB, 128177930240 bytes, 250347520 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
    Disklabel type: dos
    Disk identifier: 0x3c92ff95
    
    Device         Boot  Start    End Sectors  Size Id Type
    /dev/mmcblk0p1 *      8192 139263  131072   64M  6 FAT16
    /dev/mmcblk0p2      147456 761855  614400  300M 83 Linux
    
    Command (m for help): d
    Partition number (1,2, default 2): 2
    
    Partition 2 has been deleted.
    
    Command (m for help): n
    Partition type
       p   primary (1 primary, 0 extended, 3 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (2-4, default 2): 
    First sector (2048-250347519, default 2048): 147456
    Last sector, +/-sectors or +/-size{K,M,G,T,P} (147456-250347519, default 250347519): 
    
    Created a new partition 2 of type 'Linux' and of size 119.3 GiB.
    Partition #2 contains a ext4 signature.
    
    Do you want to remove the signature? [Y]es/[N]o: n
    
    Command (m for help): w
    
    The partition table has been altered.
    Syncing disks.

    最后使用fdisk -l可以查看分区表已经成功修改。

    拓展文件系统

    Loop Device 是一个虚拟块设备接口,它可以将文件或块设备映射为一个新的块设备,这种映射提供了一个中间层,允许以更安全的方式操作底层设备

    物理设备(如/dev/mmcblk0p2) -> Loop Device(/dev/loop0) -> resize2fs操作

    方法:

    # 1. 建立映射
    losetup /dev/loop0 /dev/mmcblk0p2
    # 此时创建了一个从 loop0 到实际分区的映射
    
    # 2. 文件系统操作
    resize2fs -f /dev/loop0
    # resize2fs 通过 loop device 接口修改文件系统
    
    # 3. 变更生效
    reboot
    # 重启使所有缓存的更改写入磁盘


    一般来说,在进行第二步之后,可以使用df -h的方法查看硬盘分区大小是否改变,若改变,可重启保存更改。若未改变,请先排查错误原因,避免配置错误后重启导致的系统奔溃。

  • 基于 WireGuard 的内网组网教程:实现多设备间的安全互联

    前言

    很久以前写了frp over wirguard这篇文章,里面主要讲述了如何通过wireguard打通通道,并通过frp将内部端口映射出去,主要作用为将无公网IP的服务器的服务通过有公网IP的服务器映射出去,达到网络可访问内网服务器服务的效果。本文主要讲解通过wireguard进行组网,达到所有设备内部访问的效果,与前文不同的是,前文将客户端置于该内网外部,本文将客户端置于内网内部。

    应用

    此方法搭建出来内网应当是面向个人使用,例如将自己的硬盘映射出来,自己在任何地方都可以访问;更方便地远程控制电脑等。

    详细工作

    准备

    由于wireguard采用了interface(本端)和peer(对端)的方式,本文不区分各个客户端和服务端,但是为了方便区分,将有公网IP的服务器成为服务端。

    首先,应当在各设备上安装wireguard,各设备应当参照wireguard官网安装,此处仅列举出一般设备:

    • Ubuntu:sudo apt install wireguard
    • Windows:下载安装软件并安装
    • IOS:使用美区icloud id登录app store,直接下载安装

    中心服务器基本配置搭建

    生成公私钥对

    在此处我使用了Ubuntu作为我的服务器系统,其他设备自行查找配置文件位置。

    首先,生成服务器端需要的公私钥

    sudo mkdir -p /etc/wireguard && sudo chmod 0777 /etc/wireguard && cd /etc/wireguard
    umask 077 
    wg genkey | tee private.key | wg pubkey > public.key

    创建公私钥后可以查看私钥内容,后面配置需要

    cat public.key
    cat private.ley

    配置文件讲解

    wireguard默认将配置文件放置于/etc/wireguard/中,可以使用wg0.conf/wg1.conf这样的方式进行命名,一个组网使用一个文件

    以下为一个示例:

    编辑一个配置文件/etc/wireguard/wg0.conf

    nano /etc/wireguard/wg0.conf

    由于服务器我们作为提供公共ip的服务器,同时还负责转发流量的服务,所以我们需要有PostUp和PostDown的设置,以及对于每个对端Peer(组网中其他设备),在每次添加设备的时候我们还需要额外添加,在后文也会有讲述。

    wireguard的配置文件格式大概为

    [Interface]
    本机配置
    
    [Peer]
    对端配置
    
    [Peer]
    对端配置
    
    ......

    因此我们分开配置两个部分进行讲解。

    配置文件Interface部分配置

    [Interface]
    PrivateKey = 此处填写密钥内容
    Address = 10.0.8.1/24
    PostUp   = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    ListenPort = 此处填写端口
    MTU = 1420

    其中密钥、端口以及内网地址可以更换为你所希望的配置,但是作为路由和网关的中心服务器,更简易使用/24地址,让中心服务器可以管理整个子网的流量和路由。

    配置文件Peer部分配置

    纵然在理论上,可以使用一个公钥文件和私钥文件添加多个对端,但是不推荐。因为 WireGuard 的设计要求每个peer都有其独立的公钥-私钥对,保持安全性和保证可用,中心服务器的配置文件需要根据每个Peer端来单独设置。

    因此在添加任何一个新设备的时候,都应该在中心服务器对应组网的配置文件中添加一个Peer部分,以下是一个Peer部分的配置文件示例:

    [Peer]
    PublicKey = Peer端的公钥内容
    AllowedIPs = 10.0.8.11/32

    请修改对应公钥和允许的IP端。

    组网各设备的配置

    生成各设备的公私钥对

    通过各设备自己的方式生成公私钥对,此处不再详细讲解。

    各设备Interface配置

    [Interface]
    PrivateKey = 各设备生成的私钥内容
    Address = 10.0.8.11/32
    MTU = 1420

    其中修改你希望该设备的内网地址

    各设备Peer部分配置

    [Peer]
    PublicKey = 中心服务器公钥内容
    AllowedIPs = 10.0.8.0/24
    Endpoint = 中心服务器ip:端口
    PersistentKeepalive = 30

    注意此处AllowedIP端修改为了/24端,这样做可以形成一个10.0.8.0-10.0.8.255之间组网的设备,可以根据需要修改。

    测试

    各设备与中心服务器的连接测试

    在首次搭建好中心服务器和组网中其他设备的wireguard后,应当先连接wireguard并进行测试

    ping 10.0.8.1

    替换为你的中心服务器地址,如果ping通,说明组网成功。

    如果ping不通,请使用端口扫描工具检查中心服务器端口是否开放,如果开放请检查对应配置。

    组网中各设备的连接测试

    如果有此需求,搭建好组网中两个设备后应当进行Ping测试,如果发现不通,但是各设备和中心服务器相通,请检查中心服务器转发服务是否正常。

  • 树莓派4B校园网连接和自动认证配置

    配置

    • Raspi 4B
    • Linux version 6.1.0-rpi7-rpi-v8 (gcc-12 (Debian 12.2.0-14) 12.2.0, GNU ld (GNU Binutils for Debian) 2.40) #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24)
      • systemd-networkd(这个版本默认安装此软件管理网络)。其他管理软件可以通过systemctl list-unit-files | grep network查询
      • wpa_supplicant
    • 校园网(BUAA-Mobile)
    • SSID:BUAA-Mobile
    • 安全类型:WPA2-企业(PEAP)
    • 频段:5 GHz
    • IPv4 DNS服务器:202.112.128.51, 202.112.128.50
    • 校园网(BUAA-WiFi)
    • SSID:BUAA-WiFi
    • 安全类型:开放
    • 频段:5 GHz
    • IPv4 DNS服务器:202.112.128.51, 202.112.128.50

    wpa supplicant配置

    编辑wpa supplicant配置nano /etc/wpa_supplicant/wpa_supplicant.conf

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=CN
    
    network={
        ssid="BUAA-WiFi"
        key_mgmt=NONE
        priority=11
    }
    network={
        ssid="BUAA-Mobile"
        key_mgmt=WPA-EAP
        eap=PEAP TTLS
        identity="*"
        password="*"
        phase1="PEAP"
        phase2="MSCHAPv2"
        priority=10
        proactive_key_caching=1
    }

    重新启动systemd-networkd服务

    重新启动systemd-networkd服务:

    sudo systemctl restart systemd-networkd

    检查wpa_supplicant服务状态:

    sudo systemctl status wpa_supplicant

    如果wpa_supplicant服务未运行,可以尝试启动它:

    sudo systemctl start wpa_supplicant

    重新加载网络配置:

    sudo systemctl restart networking

    通过以上设置,可以轻松连接到校园网。

    使用BeihangLogin自动认证

    https://github.com/buaahub/BeihangLogin

    git clone https://github.com/buaahub/BeihangLogin.git
    
    mv account.example account 
    
    //编辑登录文件
    nano account
    
    ./login-v2.sh login 

  • 优化服务器资源与网络线路的利用:通过负载均衡搭建多网站环境

    引言

    • 服务器资源不均衡和网络线路差异的常见问题

    现在大多数 vps 都是没办法同时将高性能和优秀线路结合在一起的。例如,在我本人手持服务器中,会有 GIA/9929 等优秀线路的服务器,然而这些服务器的性能普遍较弱,而性能较强,搭载 5950X 等 cpu 的服务器却在国际互联上表现较差。搭建网站时,我可能会更希望在接受高并发(优秀的硬件条件)的情况下访问速度更快,延迟更低(优秀的线路)。因此我通过负载均衡来有效利用两种服务器的优势。

    我的服务器列表
    • 高可用性和快速响应的重要性

    快速响应时间是用户体验的关键因素之一。当用户访问网站时,他们期望能够快速加载页面并进行交互,而不是等待很长时间。提高可用性和实现快速响应时间,有助于提高用户满意度,增加页面浏览量,并提升搜索引擎排名。

    第一部分:负载均衡的基本概念

    负载均衡的定义和作用

    负载均衡是一种用于分配工作负载到多个计算资源(如服务器、网络链接、CPU 等)的方法。其主要目的是提高资源的利用率、确保系统的高可用性和快速响应。通过将请求分散到多个服务器上,负载均衡可以避免单个服务器成为瓶颈,从而提高整个系统的吞吐量和可靠性。

    负载均衡示意图

    提高资源利用率

    负载均衡可以确保每个服务器的工作负载尽可能均匀地分布,从而避免某些服务器过载而其他服务器闲置的情况。这种均衡分配能够优化资源的使用,提升整体系统的性能。

    保证高可用性和快速响应

    负载均衡器可以实时监控服务器的运行状态,并将流量重定向到健康的服务器。如果某个服务器出现故障,负载均衡器会自动将请求分配给其他可用的服务器,确保服务的连续性和可靠性。此外,通过将请求分配给响应时间最快的服务器,负载均衡可以显著提高用户的访问速度和体验。

    常见的负载均衡算法

    负载均衡算法决定了如何将传入的请求分配到后端的服务器。以下是几种常见的负载均衡算法:

    轮询(Round Robin)

    轮询算法是最简单的一种负载均衡算法。它按顺序将每个新请求分配给后端服务器列表中的下一个服务器。每个服务器接收到的请求数量大致相同,适用于负载较为均匀的场景。

    加权轮询(Weighted Round Robin)

    加权轮询是在轮询算法的基础上增加了权重的概念。每个服务器根据其权重值分配到的请求数量不同,权重越高的服务器分配到的请求越多。这种算法适用于后端服务器性能不一致的情况,通过设置不同的权重,可以让性能更好的服务器承担更多的负载。

    最少连接(Least Connections)

    最少连接算法将新请求分配给当前连接数最少的服务器。这样可以确保每个服务器的负载尽可能均匀地分布,适用于长连接和负载不均匀的场景。通过实时监控每个服务器的连接数,可以动态调整负载分配,避免某些服务器过载。

    源地址哈希(IP Hash)

    源地址哈希算法根据请求源 IP 地址的哈希值分配服务器。每个请求的源 IP 地址经过哈希函数计算后得到一个值,并根据该值将请求分配给特定的服务器。这种算法保证了同一个 IP 地址的请求总是分配到同一台服务器上,适用于需要会话保持(如购物车等)的场景。

    负载均衡通过使用上述各种算法,可以根据实际需求和服务器性能,灵活地将工作负载分配到合适的服务器上,从而优化系统的性能和可靠性。

    第二部分:反向代理和负载均衡的技术实现

    反向代理的原理与作用

    反向代理是一种服务器架构,它的主要功能是代理内部服务器处理来自客户端的请求。反向代理服务器接收客户端的请求,然后将这些请求转发给后端的服务器进行处理。处理完成后,反向代理服务器将后端服务器的响应返回给客户端。

    请求转发与负载均衡

    • 请求转发: 反向代理服务器可以将来自客户端的请求转发到多个后端服务器。这不仅可以提高系统的安全性和隐私性,还可以简化内部服务器的配置和管理。
    • 负载均衡: 反向代理可以配合负载均衡算法,将请求分配到不同的后端服务器,从而平衡负载,避免某些服务器过载,提高系统的整体性能和可靠性。

    Nginx 的反向代理与负载均衡配置

    Nginx 是一个高性能的 HTTP 和反向代理服务器,它可以轻松配置反向代理和负载均衡。

    基本配置示例

    以下是 Nginx 的基本反向代理配置示例:

    server {
        listen 80;
        server_name your_domain.com;
    
        location / {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    upstream backend_servers {
        server 192.168.0.1;
        server 192.168.0.2;
    }

    负载均衡算法的应用

    Nginx 支持多种负载均衡算法,包括轮询(Round Robin)、加权轮询(Weighted Round Robin)、最少连接(Least Connections)和源地址哈希(IP Hash)。

    1. 轮询(Round Robin)
       upstream backend_servers {
           server 192.168.0.1;
           server 192.168.0.2;
       }
    1. 加权轮询(Weighted Round Robin)
       upstream backend_servers {
           server 192.168.0.1 weight=10;
           server 192.168.0.2 weight=5;
       }
    1. 最少连接(Least Connections)
       upstream backend_servers {
           least_conn;
           server 192.168.0.1;
           server 192.168.0.2;
       }
    1. 源地址哈希(IP Hash)
       upstream backend_servers {
           ip_hash;
           server 192.168.0.1;
           server 192.168.0.2;
       }

    HAProxy 的反向代理与负载均衡配置

    HAProxy 是一个开源的高可用性负载均衡和代理服务器,特别适用于高流量的 Web 站点。

    基本配置示例

    以下是 HAProxy 的基本反向代理配置示例:

    frontend http-in
        bind *:80
        default_backend backend_servers
    
    backend backend_servers
        server server1 192.168.0.1:80 check
        server server2 192.168.0.2:80 check

    负载均衡算法的应用

    HAProxy 同样支持多种负载均衡算法,包括轮询(Round Robin)、加权轮询(Weighted Round Robin)、最少连接(Least Connections)和源地址哈希(IP Hash)。

    1. 轮询(Round Robin)
       backend backend_servers
           balance roundrobin
           server server1 192.168.0.1:80 check
           server server2 192.168.0.2:80 check
    1. 加权轮询(Weighted Round Robin)
       backend backend_servers
           balance roundrobin
           server server1 192.168.0.1:80 weight 10 check
           server server2 192.168.0.2:80 weight 5 check
    1. 最少连接(Least Connections)
       backend backend_servers
           balance leastconn
           server server1 192.168.0.1:80 check
           server server2 192.168.0.2:80 check
    1. 源地址哈希(IP Hash)
       backend backend_servers
           balance source
           server server1 192.168.0.1:80 check
           server server2 192.168.0.2:80 check

    其中,HAProxy 可以完全代替 Nginx 作为反向代理和负载均衡器,而不需要同时使用 Nginx 和 HAProxy。HAProxy 是一款专为高可用性、负载均衡和代理服务设计的解决方案,特别适用于高流量网站。

    第三部分:利用 HAProxy 实际部署多网站环境

    示例场景介绍

    • 服务器 A(网络线路好)和服务器 DEFG(高性能服务器)

    部署方案:反向代理与负载均衡结合

    • 在 ABC 服务器上配置 Nginx 反向代理
    • 在 DEFG 服务器上部署完整的 LNMP 环境
    • 配置示例和优化措施

    第四部分:优化和扩展

    提升 Nginx 性能的配置建议

    • 增加 worker 进程和连接数限制
    • 缓存静态内容

    使用负载均衡集群

    • DNS 负载均衡的实现
    • 扩展 ABC 服务器的方案

    实时监控和自动扩展

    • 监控工具的使用
    • 自动扩展的配置和管理
  • 在校园网环境中配置OpenWrt以实现IPv6中继和IPv4转发

    环境

    问题概述

    • 校园网环境无法访问 OpenWrt 平台
    • OpenWrt Raspi 版本默认不开启 IPv6
    • 校园网 IPv6 无 pd,无法再划分子网,因此需要我们中继上一级网络的 IPv6
    • OpenWrt 下使用统一 IPv4 地址,IPv4 不进行中继(增加设备数量)

    前置准备

    步骤

    校园网环境下登录 OpenWrt 并设置基础的 WAN 口及 LAN 口

    连接 OpenWrt – Raspi

    由于 OpenWrt 安装好的系统默认将 WAN 口和 WiFi 设置进行桥接,所以新安装的 OpenWrt 若接入校园网,连接 OpenWrt WiFi 后,是无法通过 192.168.1.1 连接路由器的,因此此时我们不连接任何网络,直接插电进入 OpenWrt 后台进行配置

    连接 WiFi 后浏览器进入后台地址192.168.1.1,默认密码password。进入后修改密码以及 SSH 登录信息。

    基础 LAN 口设置

    • 进入网络 – 接口,修改 LAN 接口,物理设置 – 接口,仅设置为无线网络,提交并保存。LAN 接口设置

    基础 WAN 口设置

    添加新接口,命令为 WAN,此接口用于连接上级网络(校园网)。包括eth0 接口(网线接口)。在后面由于校园网特殊构造,我们需要设置成静态 IP 模式,但是由于此节讲述 OpenWrt 配置,因此按照一般设置,我们使用 DHCP。提交并保存。WAN 设置

    此时,你就可以将网线插入校园网,不影响后台登录了。

    开启流量转发以使用 IPv4

    进入网络 – 防火墙,添加从 LAN 到 WAN 的转发以及 WAN 到 LAN 的转发,打开后应该能正常访问校园网,但仅有 IPv4

    流量转发设置

    校园网环境下的 IPv6 中继

    下载并运行 ipv6-helper.sh 安装 v6 模组

    • 下载好 https://openwrt.cc/scripts/ipv6-helper.sh 并安装 IPv6 模组(由于 OpenWrt 此时无法正常上网,建议使用 SFTP 的方式上传 OpenWrt)
    • 本站下载地址:https://api.zty.ink/api/v2/objects/file/c3siwt84ar895u58zt.sh
    wget -O ipv6-helper.sh https://api.zty.ink/api/v2/objects/file/c3siwt84ar895u58zt.sh
    chmod +x ipv6-helper.sh && bash ipv6-helper install

    配置 WAN6,获取 IPv6 流量

    WAN6 和 WAN4 其实是同一个接口,都使用了 eth0,但是为了方便配置,分成了两个逻辑接口,这样也会更方便我们 IPv4 和 IPv6 的分别配置。

    • 添加一个新的接口 WAN6 将传输协议修改为 DHCPv6,接口添加到 eth0 中,保存并应用,过一段时间可以发现我们已经从上级路由处获得了一个/64 地址(如果你的了比这个跟小的地址,那么后面你就不需要继续看了,直接使用就好),但这个地址其实并不是我们路由器能分配的(非 dp 接口),仅仅只是 OpenWrt 获得的 v6 地址,因此我们在后面选择进行中继。这个 DHCPv6 客户端是为了获取 ipv6 流量。
    WAN6 配置

    配置 WAN 到静态地址

    由于 DHCP 协议中没有 ipv6 设置,所以我们需要将 WAN 修改为静态地址,当然这应该是图形化界面没有优化到的部分,当然这部分内容也可以在/etc/config/dhcp中进行配置,此处我们选择直接将 WAN 修改为静态地址后配置 dhcpv6 设置。

    • IPv4 地址填写你在 DHCP 服务器时获取到的 IP 地址,子网掩码和网关也填写对应内容即可。
    WAN 静态配置

    同时修改 WAN 的 DHCP 服务器 – IPv6 设置,将三个服务设置为中继模式

    LAN 的 IPv6 中继设置

    同上一步,由于 LAN 本身为静态 IP 地址,所以我们只需要修改其其 DHCPv6 即可,同样全部设置为中继模式即可。

    指定主接口

    nano /etc/config/dhcp

    在 WAN 行添加option master '1'

    config dhcp 'WAN'
            option start '100'
            option leasetime '12h'
            option limit '150'
            option interface 'WAN'
            option ra 'relay'
            option dhcpv6 'relay'
            option ndp 'relay'
            option master '1'

    配置option master '1'用于指定主接口的作用是启用 IPv6 中继(relay)功能。IPv6 中继功能允许路由器将上游(WAN)接口获取的 IPv6 前缀信息转发到下游(LAN)接口,从而使局域网中的设备能够获得 IPv6 地址并通过路由器访问互联网

    重启 Network

    /etc/init.d/network restart

    开启 IPv6 DNS 解析

    进入网络 – DHCP/DNS – 高级设置,关闭禁止解析 IPv6 DNS 记录即可。

    添加域名白名单

    于2025年2月18日更新

    进入DHCP and DNSfilter,添加需要修改的域名进入到Domain whitelist即可(通常是认证网址)

    总结

    说白了,就是使用 OpenWrt 的 DHCPv4,使用上游路由器的 DHCPv6。