作者: zhangtianyi

  • Anki 加密 Deck 解密 Key 查找指南

    背景说明

    某些 Anki deck 使用了加密保护,需要找到解密的 key 和 iv 才能提取内容。这些加密 deck 通常还包含防调试代码,会在检测到开发者工具时循环刷新页面。

    完整操作步骤

    第一步:绕过防调试代码

    1. 先打开 Chrome DevTools(按 F12)
    2. 立即禁用所有断点:
      • 在 Sources 面板,按快捷键 F8(或 Ctrl+F8 / Cmd+F8)
      • 或点击右上角的 “Deactivate breakpoints” 按钮(蓝色暂停图标)
      • 此时按钮应该变灰,表示断点已禁用
    3. 进入 Deck 页面(现在不会被防调试代码拦截)

    第二步:定位解密函数

    1. 按 Ctrl+Shift+F(Mac: Cmd+Shift+F)打开全局搜索
    2. 搜索关键词:≯#(加密内容的标记符)
    3. 找到类似这样的代码段:
    _0x3dc22f[_0x5271('0x47')]( (_0x3d4b22, _0x1e99f3) => {
        let _0xe83f49 = this['akDecrypt'](
            _0x3d4b22[_0x5271('0x1e')](0x2)[_0x5271('0x1e')](0x0, ...),
            _0x292030,                    // ← key
            _0x384624[_0x5271('0xd6')]    // ← iv
        );
        _0x36a462 = _0x36a462[_0x5271('0x4a')](_0x3d4b22, _0xe83f49);
    });

    第三步:打断点(关键!)

    重要:断点要打在 forEach 或循环的外层,不要打在箭头函数内部

    在这行打断点:

    _0x3dc22f[_0x5271('0x47')]( (_0x3d4b22, _0x1e99f3) => {  // ← 点击行号打断点

    或者打在更外层的 if 语句:

    if (_0x3dc22f) {  // ← 也可以在这里打断点

    第四步:重新启用断点并触发解密

    1. 按 F8 重新启用断点(按钮变回蓝色)
    2. 点击卡片翻转(Front → Back 或 Back → Front)
    3. 代码会在断点处暂停

    第五步:查看 Key 和 IV

    方法一:查看 Scope 面板(推荐)

    在右侧 Scope 面板中:

    1. 展开 Closure 部分(而不是 Local)
    2. 找到:
      • _0x292030 ← 这是 key
      • _0x384624 ← 展开这个对象,找到 iv 相关的值

    方法二:直接在 Console 查询

    在下方 Console 中输入:

    javascript

    _0x292030  // 查看 key
    _0x384624  // 查看包含 iv 的对象

    第六步:保存结果

    将找到的 key 和 iv 复制保存,格式通常是:

    • key: 一串字符串(如 "somekey123")
    • iv: 通常是 "12345679abcdefgj" 或类似字符串

    替代方法:使用 Logpoint(无需暂停)

    如果不想让代码暂停执行:

    1. 在断点位置右键行号 → 选择 “Add logpoint”
    2. 输入表达式:

    javascript

    'Key:', _0x292030, 'IV:', _0x384624
    1. 点击翻转卡片
    2. Console 会直接打印出值,不会暂停执行

    快速参考

    步骤操作快捷键打开 DevTools开发者工具F12禁用/启用断点切换断点状态F8全局搜索搜索代码Ctrl+Shift+F打断点点击行号鼠标点击

    常见问题

    Q: 只看到箭头函数内的局部变量?
    A: 断点打错位置了,应该打在 forEach 外层,然后查看 Closure 作用域。

    Q: 页面一直刷新?
    A: 进入页面前先按 F8 禁用断点,进入后再启用。

    Q: 找不到 ≯# 符号?
    A: 尝试搜索 akDecrypt 或 decrypt,找到调用这些函数的地方。

    Q: Scope 里没有想要的变量?
    A: 直接在 Console 输入变量名查看,或者展开 Closure 作用域。


    参考资料


    提示:找到 key 和 iv 后,可以使用解密脚本批量处理加密内容,具体使用方法参考上述 GitHub Gist。

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

  • 基于 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 服务器的方案

    实时监控和自动扩展

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