NGROK无法拨号至服务器报错invalid argument的求助
ngrok在TrueNAS Jail(FreeBSD)中连接失败(invalid argument)问题排查
问题场景
我在TrueNAS Jail(FreeBSD)环境中使用ngrok已有4年多,一直运行正常。使用免费账号(随机URL),网络环境为2条LTE连接加负载均衡。近期工具突然无法工作,已尝试更新至最新版本(3.21.0)并从头配置:
操作步骤
- 下载并解压最新FreeBSD版本:
wget ngrok-v3-stable-freebsd-amd64.tgz tar -xvzf ngrok-v3-stable-freebsd-amd64.tgz
- 添加官网获取的authtoken:
./ngrok config add-authtoken <token here> Authtoken saved to configuration file: /root/.config/ngrok/ngrok.yml
- 测试运行命令:
./ngrok http http://localhost:8080 ./ngrok tcp 22
- 测试结果均报错:
ngrok (Ctrl+C to quit) Session Status reconnecting (failed to dial ngrok server with address "connect.ngrok-agent.com:443": invalid argument) Version 3.21.0 Web Interface http://127.0.0.1:4040 Connections ttl opn rt1 rt5 p50 p90 0 0 0.00 0.00 0.00 0.00
diagnose命令结果
./ngrok diagnose Testing ngrok connectivity... Internet Connectivity Name Resolution [ OK ] TCP [ OK ] TLS [ OK ] Localhost Connectivity Name Resolution [ OK ] Ngrok Connectivity - Region: Auto (lowest latency) Name Resolution [ OK ] TCP [ OK ] TLS [ OK ] Tunnel Protocol [ OK ] Successfully established ngrok connection! (region: 'eu', latency: 56.114596ms)
即使使用旧配置文件或修改connect_url为tunnel.eu.ngrok.com:443,仍出现相同"invalid argument"报错,仅地址不同。
可能的原因及解决思路
1. FreeBSD Jail的网络栈限制
TrueNAS Jail默认的共享主机网络模式可能限制了套接字选项的设置,ngrok建立连接时需要的特定TCP选项无法生效,触发"invalid argument"错误。
- 解决:将Jail网络模式切换为
VNET(虚拟网络栈),为Jail提供独立网络栈。操作路径:TrueNAS WebUI → 对应Jail → 编辑设置 → 网络模式改为VNET → 重启Jail后重新测试。
2. 负载均衡网络的MTU/路由问题
双LTE负载均衡环境下,可能存在MTU不匹配或路由不对称。diagnose的测试包较小能通过,但ngrok实际连接包因MTU过大分片失败,导致参数错误。
- 解决:
- 手动降低Jail内网卡MTU值(如设置为1400):
ifconfig <你的网卡名称> mtu 1400 - 检查负载均衡设备的路由规则,确保到ngrok服务器的路径对称,避免数据包来回走不同LTE链路。
- 手动降低Jail内网卡MTU值(如设置为1400):
3. ngrok 3.x版本与FreeBSD Jail兼容性问题
ngrok 3.x的部分特性可能在Jail环境存在未被diagnose检测到的兼容性bug。
- 解决:回退到之前能正常运行的ngrok版本(如3.x早期版或2.x版)测试,若旧版本正常,说明新版本存在兼容性问题,可向ngrok官方提交bug。
4. Jail内的系统调用限制
TrueNAS Jail可能启用了sysctl限制,禁止ngrok所需的系统调用。
- 解决:在TrueNAS主机上修改sysctl配置,允许Jail访问必要的网络相关sysctl:
或在Jail配置文件中添加允许的sysctl项,重启Jail后测试。sysctl security.jail.sysctl_allow=net.inet.tcp.*
5. DNS缓存或解析异常
虽然diagnose显示DNS正常,但ngrok运行时可能使用了缓存的旧IP,导致连接错误地址触发参数问题。
- 解决:
- ping获取ngrok服务器IP:
ping connect.ngrok-agent.com - 将IP和域名添加到Jail的
/etc/hosts:echo "<获取到的IP> connect.ngrok-agent.com" >> /etc/hosts - 重新运行ngrok测试。
- ping获取ngrok服务器IP:
内容的提问来源于stack exchange,提问作者Vasco Baptista
相关产品推荐
相关产品推荐

