作者: zhangtianyi

  • 移动光猫超级密码获取教程:诺基亚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测试,如果发现不通,但是各设备和中心服务器相通,请检查中心服务器转发服务是否正常。

  • 搭建Minecraft空岛服务器:基于docker和CarpetSkyAdditions

    引言

    前几天无聊的时候,偶然在视频平台刷到了我小时候,可能上至小学五六年级,最喜欢玩的游戏之一——我的世界,minecraft。想当初在手机上长按第二个格子便可以刷出很多物品的乐趣,现在长大了,对于儿时的记忆仍然尤新,还是能切身体会到那种“逃课”的快乐(当然,现在在塞尔达里面也经常能体验到)。

    然而,儿时较大的遗憾是没有技术,不会自己组建服务器,通常都是在别人的服务器里肝得开开心心,转头关服又灰心丧气,所以,儿时的快乐总是极致而又短暂的。不过到了现在,自己已经有了技术,对服务器也了解一二,反而对这种游戏没有太大兴趣了。因此自己开服玩游戏其实一直都没有很多机会。这段时间偶尔的“上号”,才按照最好的方式部署了一次 Minecraft 服务器。因此,本文在我成功部署之后,将此步骤作为记录,以提供给想要自行部署服务器玩的朋友们,愿你们能在这个世界中玩的开心。

    本文将讲述如何使用 Linux 服务器,通过 docker 和 CarpetSkyAdditions 来搭建一个 minecraft 空岛服务器。对于 windows 开服的玩家来说,步骤可能有些许不同,如果有不懂的问题,请随时提问,我将在本文章评论区提供帮助。

    准备工作

    服务器

    • Linux 系统
    • 按照Wiki给出的配置菜单,用于 Unix 的 Minecraft 服务器不应当小于以下配置
    需求玩家CPU内存硬盘上传带宽下载带宽[隐藏]注释
    最低配置1-2Intel Pentium 4 1.8 GHz 或 AMD Athlon XP 1600+ 或 PowerPC 750 1000 MHz/G4 1 GHz 以上512 MB2 GB 可用空间 (5GB -如果经常备份服务器)3 Mbit/s2 Mbit/s(Minecraft 服务器能勉强在 1Mbit/s 的上传带宽上运行)
    Acceptable2-4Intel Pentium 4 2.6 GHz 或 AMD Athlon XP 2000+ 或 G4/Frescale 7xxx 1.8 GHz 以上2 GB8 GB 可用空间6 Mbit/s3 Mbit/s
    推荐配置4-5Intel Pentium 4 3.6 GHz 或 AMD Phenom 3600+ G4 2.0 GHz 或 IBM 970 以上3 GB16 GB 可用空间8 Mbit/s4 Mbit/s
    优良配置5-7Intel Core-Based CPUs 或 AMD K8-Based CPUs IBM 970 2.0 GHz 以上5 GB25 GB 可用空间14 Mbit/s7 Mbit/s
    最佳配置7+Intel Core-Based CPUs 或 AMD K8-Based CPUs at 3.6GHz 或 higher IBM 970 2.0 GHz 以上6 GB35 GB 可用空间30 Mbit/s15 Mbit/s推荐使用高读写速度的机械磁盘或 SLC SSD。
    • 我个人建议,应当保持不小于 2G 的内存空间,不小于 20G 的存储空间,上下行带宽不应小于 5Mbps 即可

    所需软件和工具

    • 必要的指令
      apt install curl tar zip
    • Docker 的安装与配置
      curl -fsSL https://get.docker.com | bash -s docker

    对于国内服务器,可以使用--mirror参数设置镜像源进行安装,例如:

      curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

    创建并运行 docker compose 生成默认配置文件

    • 创建 docker-compose.yml
      我们选用的 Docker 镜像为广受使用的itzg 的 docker-minecraft-server,由于 CarpetSkyAdditions 是基于Fabric的,所以我们配置文件需要使用 Fabric 对应的 docker 镜像。当然如果你并不是想游玩空岛地图,你可以在官方给出的环境示例或者直接在Github 配置文件示例选择你想要的 server type 并使用即可。 mkdir mc && cd $_ 当然,此处我直接给出我自己的配置文件
    services:
        mc:
          image: itzg/minecraft-server
          stdin_open: true
          tty: true
          restart: unless-stopped
          environment:
            EULA: "true"
            TYPE: FABRIC
            VERSION: 1.20.1
            MEMORY: 3G
          ports:
            - "25565:25565"
          volumes:
            - ./data:/data
      
      volumes:
        fabric: {}

    注意,上面的内容请不要照抄,请修改自己对应的内存MEMORY。如果你想跟我一样玩空岛并想自己写配置文件的话,请先参考CarpetSkyAdditions对应的MC的最新版本,由于写这篇文章时最新版为1.20.1,因此本文以版本为主。

    按下Esc键并输入:wq回车保存

    • 运行 docker compose 并创建默认文件
      docker compose up

    等待运行完成,会生成默认世界,世界生成完毕后 Ctrl+C 退出 docker 页面并停止容器

      docker compose down

    至此,我们对于 docker 和 mc 的创建就已经完成,如果你想要体验原汁原味的生存,就可以开始了。

    空岛配置

    配置 CarpetSkyAdditions

    cd data/mods && curl -L -o carpetskyadditions-1.20.1-4.4.1.jar https://github.com/jsorrell/CarpetSkyAdditions/releases/download/v1.20.1-4.4.1/carpetskyadditions-1.20.1-4.4.1.jar>
    • 下载必须的模组,由于 Curseforge 的原因,并不方便通过curl或者wget命令进行下载。通过手动访问下载并通过 ftp 上传到服务器 (上传到data文件夹下的./mods文件夹中)
    • 从本站下载
    cd data/mods && curl -L -o mods.tar.gz https://api.zty.ink/api/v2/objects/file/4k41dx7iv5onapouj7.zip && unzip mods.tar.gz

    配置服务器属性文件(server.properties

    • 在前面创建 docker compose 文件的时候我们已经运行过一次了,因此会在data目录下生成我们的server.properties文件,直接修改即可
      level-type=minecraft\:normal(世界生成类型:默认)修改为level-type=carpetskyadditions\:skyblock(世界生成类型:空岛),并启用数据包carpetskyadditions:skyblock ... initial-enabled-packs=carpetskyadditions\:skyblock level-type=carpetskyadditions\:skyblock ...
    • 如果你不清楚如何修改,直接运行下面命令即可。


    请进入./data 目录下运行该指令。

    sed -i 's/^level-type=minecraft\\:normal/level-type=carpetskyadditions\\:skyblock/' server.properties && awk -F= '/^initial-enabled-packs=/ {print $0",carpetskyadditions:skyblock"; next} 1' server.properties > server.properties.tmp && mv server.properties.tmp server.properties
    • (可选)指定种子:
      • level-seed中填写你对应的种子即可。

    (可选)添加其他模组

    以下模组均可直接下载 MC 对应版本的 mod 后添加到./data/mods文件夹,重启服务器即可docker compose restart

    • GugleCarpetAddition
    • 假人模组,可以不用在空岛这么肝
    • Servus
    • 服务器端提供结构边界框给客户端 MiniHUD 的工具

    创建世界并添加数据包

    在做完以上工作后,我们便可以正常创建一个空岛世界,并添加适合空岛玩法的数据包。

    删除原有世界并创造新的世界

    由于我们之前的世界并不是根据 CarpetSkyAdditions 生成的,所以我们需要先删掉之前生成的 world 世界,重新由 carpetskyadditions\:skyblock 生成一个世界。

    rm -rf world && cd .. && docker compose up -d

    添加并启用数据包

    • 下载数据包到 datapacks 文件夹中
    • 从官网下载

    cd data/world/datapacks && curl -L -o carpetskyadditions-1.20.1-4.4.1-datapack.zip https://github.com/jsorrell/CarpetSkyAdditions/releases/download/v1.20.1-4.4.1/carpetskyadditions-1.20.1-4.4.1-datapack.zip
    • 启用数据包
    • 进入控制台 docker ps 会输出类似于以下内容,找到其 NAMES CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fca3576a47f itzg/minecraft-server “/start” 4 days ago Up 4 days (healthy) 0.0.0.0:25565->25565/tcp, :::25565->25565/tcp mc-mc-1 docker exec -i <NAMES> rcon-cli 将其中的< NAMES >更换为上面的内容
    • 启用数据包
      首先,通过以下命令查看哪些数据包没有被启用 > datapack list 类似于以下输出 There are 4 data pack(s) enabled: [carpetskyadditions:skyblock (built-in: Carpet Sky Additions)], [fabric (Fabric mod)], [vanilla (built-in)], [file/carpetskyadditions-1.20.1-4.4.1-datapack.zip (world)]There are 1 data pack(s) available: [carpetskyadditions:skyblock_acacia (built-in: Carpet Sky Additions)] 启用对应数据包即可 (一般来说是 carpetskyadditions-1.20.1-4.4.1-datapack.zip) datapack enable carpetskyadditions-1.20.1-4.4.1-datapack.zip

    测试服务器

    外部连接测试

    由于开放的是 Minecraft 标准的 25565 端口,因此在服务器地址一栏中直接输入服务器地址即可直接连接。

    客户端配置

    同样,您需要将datapack文件和language文件放入客户端的datapacks文件夹中,并且在游戏配置中启用,才能获得更好的体验。

    此外,我强烈建议您在客户端安装MiniHUDmod,这在空岛生存中非常有用

    常见问题解答

    • 为何我连接不上?
    • 首先,通过docker ps检查容器是否正常运行,如果容器发生错误,请根据 log 自行排查
    • 若容器运行正常,大概率为网络问题,请先检查防火墙是否阻断,一般我习惯用 ufw 来管理防火墙。您应当检查 iptables
    • 版本问题

    服务器维护与管理

    常见问题及解决方法

    • 容器重启和停止命令
      重启:
      docker compose restart
      停止:
      docker compose down
    • 日志查看与错误排查
      Minecraft 日志存放于./data/logs文件夹中
      cat data/logs/latest.log

    备份与恢复

    • 数据备份策略
      一般来说,我们只需要备份world文件夹(或者你创建的其他世界的名称)即可,如果 mod 使用过多或者使用了不常见的 datapacks,建议备份对应文件夹以及server.properties
      tar -zcf bak.tar.gz world datapacks mods server.properties
    • 恢复备份数据的方法
      将备份文件解压到data目录下即可
      tar -zxf bak.tar.gz

    结论

    总体来说,通过 docker 的搭建方式让我觉得比使用其他方式更加便携和更加模块化,我更喜欢通过 docker 来部署 Minecraft 服务器,当然我也在此鼓励各位尝试更加个性化的部署方式,一方面能够体验更多的乐趣,另一方面也希望各位不要总是遵循文档办事。我相信,有自己的创造力是每一个 mc 玩家最值得骄傲的事情。

    附录

    这些资源可以帮助您更深入地了解如何使用 Docker 和 Minecraft 模组来定制和优化自己的游戏服务器。

  • 树莓派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 

  • 阿里云学生认证优惠购买及配置T5服务器指南

    学生认证及优惠券领取

    学生认证

    进行学生认证前,您需要先完成账号的个人实名认证

    完成个人实名认证后进入阿里云-学生认证页面,进行学生认证,按照操作提示完成认证。

    优惠券领取

    进入优惠券领取地址,领取高校学生通用权益,获得¥ 300无门槛抵扣金。

    创建VPC并完成对应配置

    创建交换机及专有网络

    进入阿里云-专有网络VPC-专有网络-创建专有网络,完成以下配置,未标注的部分请自行完成。

    配置要点:

    查看T5服务器可用区步骤:

    1. 进入云服务器ECS-自定义购买
    2. 地域中选择你要购买的地区(以香港为例)
    3. 筛选中输入t5
    4. 网络及可用区中点击全部可用区,然后点页面其他部分(不要点默认交换机),这样才可以显示随机分配可用区
    5. 在实例部分查看t5可用区,例如显示当前地域:中国(香港)- 可用区 B 可用区 C,因此BC均为我们的可用区
    T5可用区查看示例

    交换机可用区:填写上一步骤中找到的可用区之一即可,点击确定创建专有网络。

    创建共享带宽及弹性公网IPv4和IPv6

    进入专有网络-共享带宽,点击购买共享带宽,按照以下部分配置,未标注的部分请自行完成。

    配置参数:

    • 商品类型选择按量计费
    • 线路类型选择BGP(多线)

    ⚠️ 重要提醒:只有BGP(多线)享受免费的20+180G流量,精品不享受共享流量。参考链接

    • 计费方式选择按主流量
    • 带宽可拉满也可以自定义,按照需求
    • 立即购买
    共享带宽配置示例

    重新进入共享带宽页面,点击最右侧的添加IP并添加一个EIP。

    添加EIP

    开通CDT

    1. 进入CDT页面
    2. 开通CDT及云产品,注意需要升级产品,否则无法享用200G流量
    CDT开通示例

    购买T5服务器并绑定VPC

    购买服务器

    创建完VPC后就可以在之前打开过的页面成功创建我们的VPS了。

    服务器配置:

    • 付费类型:包年包月
    • 地域:香港
    • 网络及可用区:选择之前创建过的专有网络
    • 实例:选择T5(不要打开突发性能实例,镜像自行选择)
    实例配置示例

    存储配置:

    请将云盘大小修改为20GiB。

    ⚠️ 重要提醒:这里默认是40GiB,若不修改最后不是最便宜的计费方式

    存储配置示例

    带宽和安全组配置:

    • IPv4:请不要分配公网IPv4,我们将在后面绑定弹性公网IP地址
    • IPv6:选择下方的免费分配IPv6地址
    带宽配置示例

    查看右方概要是否正确,修改购买时长并使用优惠券进行购买。

    购买确认示例

    为T5服务器绑定VPC(公网IP)

    1. 进入专有网络-弹性公网IP,可以看到有我们之前创建的EIP
    2. 在右侧操作中绑定我们的服务器即可

    常见问题解答

    如果我的服务器在香港,流出流量到大陆,是计算在20G大陆流量还是180G全球流量中?

    答案:我暂时未使用到20G流量,但是通过查看账单,我认为其按照服务器地区进行评判(即使用180G全球流量)。

    流量计费示例

    能否不使用共享带宽?

    答案:可以,跳过共享带宽创建的部分,可以到专有网络-公网访问-弹性公网IP中直接申请公网IP即可,不过带宽最大只有200Mbps,且计费方式为**出向公网的实际流量计费**,如果出站大于入站,建议选此种方法。

    阿里云学生认证优惠购买及配置T5服务器指南

    学生认证及优惠券领取

    学生认证

    进行学生认证前,您需要先完成账号的个人实名认证

    完成个人实名认证后进入阿里云-学生认证页面,进行学生认证,按照操作提示完成认证。

    优惠券领取

    进入优惠券领取地址,领取高校学生通用权益,获得¥ 300无门槛抵扣金。

    创建VPC并完成对应配置

    创建交换机及专有网络

    进入阿里云-专有网络VPC-专有网络-创建专有网络,完成以下配置,未标注的部分请自行完成。

    配置要点:

    查看T5服务器可用区步骤:

    1. 进入云服务器ECS-自定义购买
    2. 地域中选择你要购买的地区(以香港为例)
    3. 筛选中输入t5
    4. 网络及可用区中点击全部可用区,然后点页面其他部分(不要点默认交换机),这样才可以显示随机分配可用区
    5. 在实例部分查看t5可用区,例如显示当前地域:中国(香港)- 可用区 B 可用区 C,因此BC均为我们的可用区
    T5可用区查看示例

    交换机可用区:填写上一步骤中找到的可用区之一即可,点击确定创建专有网络。

    创建共享带宽及弹性公网IPv4和IPv6

    进入专有网络-共享带宽,点击购买共享带宽,按照以下部分配置,未标注的部分请自行完成。

    配置参数:

    • 商品类型选择按量计费
    • 线路类型选择BGP(多线)

    ⚠️ 重要提醒:只有BGP(多线)享受免费的20+180G流量,精品不享受共享流量。参考链接

    • 计费方式选择按主流量
    • 带宽可拉满也可以自定义,按照需求
    • 立即购买
    共享带宽配置示例

    重新进入共享带宽页面,点击最右侧的添加IP并添加一个EIP。

    添加EIP

    开通CDT

    1. 进入CDT页面
    2. 开通CDT及云产品,注意需要升级产品,否则无法享用200G流量
    CDT开通示例

    购买T5服务器并绑定VPC

    购买服务器

    创建完VPC后就可以在之前打开过的页面成功创建我们的VPS了。

    服务器配置:

    • 付费类型:包年包月
    • 地域:香港
    • 网络及可用区:选择之前创建过的专有网络
    • 实例:选择T5(不要打开突发性能实例,镜像自行选择)
    实例配置示例

    存储配置:

    请将云盘大小修改为20GiB。

    ⚠️ 重要提醒:这里默认是40GiB,若不修改最后不是最便宜的计费方式

    存储配置示例

    带宽和安全组配置:

    • IPv4:请不要分配公网IPv4,我们将在后面绑定弹性公网IP地址
    • IPv6:选择下方的免费分配IPv6地址
    带宽配置示例

    查看右方概要是否正确,修改购买时长并使用优惠券进行购买。

    购买确认示例

    为T5服务器绑定VPC(公网IP)

    1. 进入专有网络-弹性公网IP,可以看到有我们之前创建的EIP
    2. 在右侧操作中绑定我们的服务器即可

    常见问题解答

    如果我的服务器在香港,流出流量到大陆,是计算在20G大陆流量还是180G全球流量中?

    答案:我暂时未使用到20G流量,但是通过查看账单,我认为其按照服务器地区进行评判(即使用180G全球流量)。

    流量计费示例

    能否不使用共享带宽?

    答案:可以,跳过共享带宽创建的部分,可以到专有网络-公网访问-弹性公网IP中直接申请公网IP即可,不过带宽最大只有200Mbps,且计费方式为**出向公网的实际流量计费**,如果出站大于入站,建议选此种方法。

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

    引言

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

    现在大多数 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。