frpc 连接失败问题排查与修复笔记

一、问题现象

执行 podman logs frpc 发现以下错误:

[W] [client/service.go:319] connect to server error: dial tcp 49.235.100.182:52639: connect: no route to host
login to the server failed: dial tcp 49.235.110.18:52639: connect: no route to host

关键点:

  • frps 服务器地址:49.235.100.182:52639
  • 错误类型:no route to host(无到达主机的路由)
  • 触发条件:frpc 更换了 IP 地址后出现此错误

二、初步排查:网络连通性测试

2.1 测试命令(无需安装额外工具)

# 测试基础网络
ping -c 4 49.235.100.182

# 测试端口连通性(使用 nc)
nc -zv 49.235.100.182 52639

# 使用 bash 内置 TCP 测试
timeout 3 bash -c "cat < /dev/null > /dev/tcp/49.235.100.182/52639" && echo "✓ 端口可达" || echo "✗ 端口不可达"

2.2 安装 telnet(如需要)

# Debian/Ubuntu
sudo apt install telnet -y

# CentOS/RHEL
sudo yum install telnet -y

# Alpine Linux(容器环境)
apk add busybox-extras

三、发现根本问题:设备无互联网连接

3.1 测试结果

ping www.baidu.com
# 输出:From orangepizero3 (192.168.1.10) icmp_seq=1 Destination Host Unreachable

结论: Orange Pi Zero 3 设备没有互联网连接。

3.2 检查网络配置

# 查看 IP 地址
ip addr show end0

# 查看路由表
ip route show

# 查看 DNS 配置
cat /etc/resolv.conf

输出显示:

  • IP 地址:192.168.1.10/24 ✅(局域网正常)
  • 路由表:default via 255.255.255.0 dev end0 ❌(网关错误!

问题根源: 默认网关被错误设置为 255.255.255.0(这是子网掩码,不是网关地址)。


四、临时修复网络

4.1 立即生效的临时修复

# 删除错误的默认路由
sudo ip route del default

# 添加正确的网关(通常是 192.168.1.1)
sudo ip route add default via 192.168.1.1

# 配置 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 114.114.114.114" | sudo tee -a /etc/resolv.conf

# 验证修复
ip route show
ping -c 3 192.168.1.1
ping -c 3 8.8.8.8
ping -c 2 www.baidu.com

4.2 测试 frps 连接

nc -zv 49.235.100.182 52639
podman restart frpc
podman logs frpc --tail 20

五、永久修复:修改 NetworkManager 配置

5.1 找到正确的配置文件

# 查看连接列表
nmcli connection show

# 查看配置文件目录
ls /etc/NetworkManager/system-connections/

# 示例输出:
# 'Wired connection 1.nmconnection'

注意: 连接名称可能不是接口名(end0),而是 Wired connection 1 等。

5.2 错误的配置示例

[ipv4]
address1=192.168.1.10/24,255.255.255.0   # ❌ 多余掩码
dns=192.168.1.9;192.168.1.1;
ignore-auto-dns=true
ignore-auto-routes=true
may-fail=false
method=manual
# ❌ 缺少 gateway 行!

5.3 正确的配置

[ipv4]
address1=192.168.1.10/24      # ✅ 正确格式
gateway=192.168.1.1            # ✅ 必须明确指定网关
dns=8.8.8.8;114.114.114.114;   # ✅ 使用公网 DNS
ignore-auto-dns=true
ignore-auto-routes=true
may-fail=false
method=manual

5.4 修复方法一:使用 nmcli 命令

# 修改配置
sudo nmcli connection modify "Wired connection 1" ipv4.addresses 192.168.1.10/24
sudo nmcli connection modify "Wired connection 1" ipv4.gateway 192.168.1.1
sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 114.114.114.114"
sudo nmcli connection modify "Wired connection 1" ipv4.ignore-auto-routes yes
sudo nmcli connection modify "Wired connection 1" ipv4.never-default no

# 重新激活
sudo nmcli connection down "Wired connection 1"
sudo nmcli connection up "Wired connection 1"

5.5 修复方法二:直接编辑配置文件

# 编辑配置文件
sudo nano "/etc/NetworkManager/system-connections/Wired connection 1.nmconnection"

# 修改 [ipv4] 部分(如上正确配置所示)

# 保存后设置权限
sudo chmod 600 "/etc/NetworkManager/system-connections/Wired connection 1.nmconnection"

# 重启服务
sudo systemctl restart NetworkManager

5.6 修复方法三:删除并重建连接(最彻底)

# 删除旧连接
sudo nmcli connection delete "Wired connection 1"

# 重新创建
sudo nmcli connection add type ethernet con-name "Wired connection 1" ifname end0 \
    ipv4.addresses 192.168.1.10/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "8.8.8.8 114.114.114.114" \
    ipv4.method manual \
    ipv4.ignore-auto-routes yes \
    ipv4.ignore-auto-dns yes

# 启动连接
sudo nmcli connection up "Wired connection 1"

六、nmui 图形界面配置建议

nmtui 中编辑连接时,以下选项的勾选建议:

选项建议原因
Never use this network for default route不勾选设备需要此网卡作为默认路由
Ignore automatically obtained routes勾选静态 IP 不需要 DHCP 路由
Ignore automatically obtained DNS parameters勾选使用手动指定的 DNS
Require IPv4 addressing for this connection勾选确保 IPv4 配置成功才能激活连接

七、验证与测试

7.1 验证配置

# 查看路由表(应该只有一条正确的默认路由)
ip route show

# 期望输出:
# default via 192.168.1.1 dev end0 proto static metric 100
# 192.168.1.0/24 dev end0 ...

# 测试各层级连通性
ping -c 3 192.168.1.1    # 网关
ping -c 3 8.8.8.8        # 外网 IP
ping -c 2 www.baidu.com  # 域名解析

# 查看 DNS 配置
cat /etc/resolv.conf

7.2 完整验证脚本

#!/bin/bash
echo "=== 验证网络配置 ==="

echo -e "\n1. 当前路由表:"
ip route show | grep default

echo -e "\n2. 网关连通性:"
ping -c 2 192.168.1.1

echo -e "\n3. 外网连通性:"
ping -c 2 8.8.8.8

echo -e "\n4. DNS 解析:"
nslookup www.baidu.com

echo -e "\n5. frps 连通性:"
nc -zv 49.235.100.182 52639

echo -e "\n6. frpc 状态:"
podman logs frpc --tail 10

八、常见问题与解决方法

8.1 出现两条默认路由

# 现象
default via 255.255.255.0 dev end0
default via 192.168.1.1 dev end0

# 解决:删除错误路由
sudo ip route del default via 255.255.255.0

8.2 重启后配置丢失

原因:NetworkManager 配置文件未正确修改或权限不对。

解决:

sudo chmod 600 /etc/NetworkManager/system-connections/*.nmconnection
sudo systemctl restart NetworkManager

8.3 DNS 不生效

# 手动指定 DNS
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 114.114.114.114" | sudo tee -a /etc/resolv.conf

# 防止被覆盖
sudo chattr +i /etc/resolv.conf  # 锁定文件(谨慎使用)

九、关键经验总结

  1. no route to host 通常是网络配置问题,不是 frp 本身的问题。
  2. 网关地址绝对不能是子网掩码(如 255.255.255.0),必须是同网段的一个 IP(通常是 192.168.x.1)。
  3. NetworkManager 配置文件中必须显式指定 gateway,不能只在 address1 中写掩码。
  4. 重启服务前先临时修复,保证业务可用,再处理永久配置。
  5. 排查顺序: 本地 IP → 网关 → 外网 IP → DNS → 目标服务端口。

十、快速参考命令汇总

# 网络诊断
ip addr show              # 查看 IP
ip route show             # 查看路由表
ping -c 3 8.8.8.8         # 测试外网
nc -zv <IP> <端口>         # 测试端口

# 路由修复
sudo ip route del default
sudo ip route add default via 192.168.1.1

# NetworkManager 操作
nmcli connection show                     # 列出连接
nmcli connection modify "名称" ipv4.gateway 192.168.1.1
nmcli connection up "名称"

# frp 操作
podman restart frpc
podman logs frpc --tail 20

标签: none

添加新评论