小祺的技术分享屋

记录一名业余爱好者的网络运维学习过程


项目


FRP-AUTOMAP · 全端口自动映射工具:给你的私有云无限近似公网体验

2026-09-05

给没有公网 IPv4 地址的设备用的全端口自动映射工具。租一台云服务器跑服务端, 本地设备跑客户端,之后本地每起一个服务,公网就能直接访问,不用为任何一个端口 手写配置。

与 frp 的关系

本项目基于 frp 的成熟架构与思路开发, 单连接复用、连接池、控制面与数据面分离等设计均借鉴自 frp。frp 功能全面, 但每条通道都要手工配置;FRP-AUTOMAP 把它收窄成一个目标:把登记这件事 完全自动化——自动发现本地正在监听的服务端口,自动登记、自动注销, 让维护工作从"配一堆条目"变成"什么都不用配"。

工作方式

  1. 周期读取系统端口表,自动发现本地正在监听的服务端口,并过滤掉系统进程端口;
  2. 新端口出现即自动登记,云端同步开放同号公网端口;
  3. 服务停止后自动注销,公网端口同步关闭;
  4. 断线后自动重连,重连成功按当前状态重建全部登记。

核心设计

两端之间只维持一条常活 TCP 连接,所有端口的通信复用这条连接上的逻辑流; 每个端口维护一个小型连接池,空闲连接常驻,请求到达时直接从池中取用。 客户端运行在 Windows,服务端运行在 Linux,Go 语言编写。配置只有服务器地址、 端口和少量参数,首次运行自动生成配置文件。

代码片段

端口池维持逻辑,空闲时恒定保持目标数量的就绪流:

func (e *Engine) ensurePool(t *tunnel, target int) {
    need := target - len(t.pipes) - t.connecting
    if need > 0 {
        for i := 0; i < need; i++ {
            go e.buildPipe(t)
        }
    }
}

端口变化后的自动登记与注销:

added, removed := table.Diff(prev, cur)
for _, k := range added {
    register(k)
}
for _, k := range removed {
    unregister(k)
}

客户端配置文件(自动生成,按需修改):

[client]
server_addr = your-cloud-host
server_port = 500
data_conns_per_port = 4
detect_interval_ms = 500

项目持续迭代中,仓库整理好后会放上来。作者主页: github.com/adminmmakdbusb


宽带保活喵 · PPPoE 保活与断网自动重拨

2026-06-28

家里云设备使用拨号上网偶发掉线,掉了就得手动重拨(家宽ip动态分配)。这个工具做的事情: 定时检测宽带连接状态,发现断开就自动重拨;拨通后再探测公网连通性, 不通继续重拨,直到网络恢复。附带一个 Python 编写的网页配置界面, 用来填拨号账户、密码与检测间隔。

工作方式

  1. 按设定间隔检测宽带连接是否在线,连续检测失败后进入重拨;
  2. 断开当前连接,用配置的账户重新拨号;
  3. 拨号后轮询探测公网连通性,确认网络真的恢复才回到周期检测;
  4. 全程记录日志,方便回溯掉线与重拨的时间点。

实现

Windows 批处理调用系统自带拨号组件完成检测与拨号,Python 提供配置页面。 核心循环长这样:

@echo off
:loop
rasdial "%NAME%" >nul 2>&1
if errorlevel 1 goto redial
timeout /t %INTERVAL% /nobreak >nul
goto loop
:redial
rasdial "%NAME%" /disconnect >nul 2>&1
rasdial "%NAME%" %USER% %PASS% >nul 2>&1
goto loop

这是早期的练手项目,结构朴素,代码质量一般,胜在把"掉线—重拨—验证恢复" 这条流程跑顺了,哈哈哈我瞎折腾。


学习笔记