分类: 网络

  • 移动光猫超级密码获取教程:诺基亚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. 记录SuPassword中v属性的值(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 服务器的方案

    实时监控和自动扩展

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