分类: 网络

  • 移动光猫超级密码获取教程:诺基亚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的方法查看硬盘分区大小是否改变,若改变,可重启保存更改。若未改变,请先排查错误原因,避免配置错误后重启导致的系统奔溃。

  • 树莓派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 服务器的方案

    实时监控和自动扩展

    • 监控工具的使用
    • 自动扩展的配置和管理