内网穿透是开发者的日常刚需——本地调试接口要给外部同事看、家里的 NAS 要远程访问、内网服务要临时暴露给客户演示。GoodLink 作为一款轻量级内网穿透工具,v2.5.22 版本修掉了两个实际使用中会"咬人"的 bug:local 端断连后 remote 端 CPU 空转飙升,以及子进程参数重复传递导致启动异常。这两个问题看似细节,但在长期运行和自动化部署场景下影响不小。
两个修复分别解决什么
CPU 空转问题:当 local 端(运行在内网机器上的客户端)意外断开——网络抖动、进程崩溃、机器重启——remote 端(运行在公网服务器上的服务端)没有正确感知连接失效,进入了无退出条件的忙等待循环。表现就是:local 已经不在了,remote 的 CPU 占用却持续走高,直到手动杀进程。对于跑在云服务器上按 CPU 计费的场景,这直接烧钱。
子进程参数重复:GoodLink 在启动子进程时,--local_config 参数被多次拼接到命令行中。Linux 进程的命令行参数是按位置解析的,重复参数要么被忽略,要么导致配置被覆盖为空值,子进程行为不可预测。在用脚本批量部署或 systemd 管理时,这类问题尤其难排查——日志不会报"参数重复",只会表现为连接不上或配置丢失。
快速部署一个可用的穿透通道
下面是一个最小化部署示例,假设你有一台公网服务器(IP 203.0.113.10)和一台内网机器。
公网服务器:启动 remote 端
# 下载最新版本
wget https://gitee.com/konyshe/goodlink/releases/download/v2.5.22/goodlink_v2.5.22_linux_amd64.tar.gz
tar -xzf goodlink_v2.5.22_linux_amd64.tar.gz
# 启动 remote 端,监听公网端口
./goodlink remote \
--listen 0.0.0.0:9000 \
--secret my-secret-key-2024
--listen 是 remote 端对外暴露的端口,外部客户端通过这个端口访问内网服务。--secret 是两端握手时的认证密钥,必须与 local 端一致。
内网机器:启动 local 端
# 同样下载并解压(步骤同上,省略)
# 启动 local 端,将内网 8080 端口穿透到公网
./goodlink local \
--remote 203.0.113.10:9000 \
--secret my-secret-key-2024 \
--local_config 127.0.0.1:8080
--local_config 指定内网服务的地址和端口。启动后,外部访问 203.0.113.10:9000 的流量会被转发到内网机器的 127.0.0.1:8080。
用 systemd 保持长期运行
手动启动适合调试,生产环境建议用 systemd 管理,断连自动重启:
# /etc/systemd/system/goodlink-remote.service
[Unit]
Description=GoodLink Remote (Public Server)
After=network.target
[Service]
Type=simple
ExecStart=/opt/goodlink/goodlink remote \
--listen 0.0.0.0:9000 \
--secret my-secret-key-2024
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now goodlink-remote
local 端同理,把 ExecStart 替换为 local 命令即可。v2.5.22 修复了断连后 CPU 空转的问题,配合 systemd 的 Restart=always,local 端意外退出后 remote 端不会再空耗 CPU,local 端也会被 systemd 自动拉起。
实际使用中的几个注意点
密钥不要用弱密码。--secret 是唯一防线,用随机生成的 16 位以上字符串。可以在两端各写进环境变量,避免命令行泄露:
export GOODLINK_SECRET="$(openssl rand -hex 16)"
./goodlink remote --listen 0.0.0.0:9000 --secret "$GOODLINK_SECRET"
防火墙只放行必要端口。公网服务器上只需要暴露 remote 的 --listen 端口,不要把内网服务的原始端口也放出去——穿透工具的意义就在于不需要内网机器有公网入口。
监控 CPU 占用。虽然 v2.5.22 修掉了空转 bug,但长期运行仍建议加一个简单监控:
# 每 60 秒检查 goodlink 进程 CPU,超过 50% 就告警
while true; do
cpu=$(ps -p $(pgrep goodlink) -o %cpu= 2>/dev/null | awk '{print int($1)}')
if [ -n "$cpu" ] && [ "$cpu" -gt 50 ]; then
echo "[WARN] goodlink CPU=$cpu% at $(date)" >> /var/log/goodlink_monitor.log
fi
sleep 60
done
升级建议
如果你已经在跑旧版本 GoodLink,v2.5.22 建议尽快升级,理由很直接:
- CPU 空转在无人值守的服务器上会持续数小时甚至数天,既浪费资源又可能触发云厂商的 CPU 用量告警。
- 参数重复在脚本化部署中是隐性故障,不容易从日志定位,升级后直接消除这个隐患。
升级步骤就是替换二进制文件、重启 systemd 服务,配置无需改动:
wget https://gitee.com/konyshe/goodlink/releases/download/v2.5.22/goodlink_v2.5.22_linux_amd64.tar.gz
tar -xzf goodlink_v2.5.22_linux_amd64.tar.gz
cp goodlink /opt/goodlink/goodlink
sudo systemctl restart goodlink-remote # 以及 goodlink-local
内网穿透工具的选择不少,GoodLink 的优势在于部署简单、二进制单文件无依赖、配置项少且语义清晰。v2.5.22 这两个修复虽然不是功能大更新,但修掉的都是"跑久了才会遇到、遇到了就很头疼"的问题,稳定性提升值得这一步升级。