1. 双网卡双网关,为什么一配就断网
Linux 服务器上插两块网卡,eth0 走公网、eth1 走内网,这是很常见的组网方式。很多人配完 IP、掩码、DNS、网关,systemctl restart network一敲,SSH 还连着,但ping www.baidu.com直接超时,ping 8.8.8.8也不通。更迷惑的是:ping网关本身是通的,ping同一网关下的其他公网 IP 也通,唯独出不了这个网段。
这个现象我第一次遇到时也绕了半小时,先怀疑 DNS,改成直接ping IP还是不通,排除解析问题;又怀疑网卡驱动、交换机端口,结果ethtool看链路全是 UP。最后ip route一敲,真相大白:路由表里出现了两条default默认路由,一条指向 eth0 的公网网关,一条指向 eth1 的内网网关,内核按 metric 或按后写入的顺序选了一条,结果流量从错误的网卡出去了。
核心结论先放这里:Linux 传统网络模型下,一个路由表里只应该有一条默认路由(default via)。双网卡不等于双默认网关,内网网卡应该只配 IP 和掩码,通过明细路由(静态路由)去访问内网网段,而不是再抢一条 default。本文会从路由表冲突的角度拆解原因,给出可复制的ip route配置片段、排查命令、恢复步骤,并演示怎么用 TaoToken 统一 API 通道做一次网络连通性验证,确认修完之后外网请求真的能出去。
适合谁看:正在配双网卡服务器、被"能 ping 通网关但上不了外网"卡住的运维和开发;以及想把服务器网络调通后,顺手验证一下大模型 API 通道是否可达的同学。
2. 前置准备:TaoToken 通道与网络验证思路
修网络这件事,最怕的是"我以为修好了"。路由表看着干净,但实际请求出不去,或者出去了回不来。所以需要一个稳定的外部目标来做连通性验证。我习惯用 TaoToken 的统一 API 通道来验证,原因是它同时提供模型对话、Coding Plan、控制台和 API Keys 管理,一个域名就能覆盖多种请求场景,验证一次网络通不通,顺便把后面要用的 API 通道也确认了。
TaoToken 官网入口在这里:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个地址不加 UTM 参数,直接用于代码里的 base_url)。
它的定位是统一 API 通道:你拿到一个 API Key,就能通过同一个 base_url 调用不同模型,不用为每个模型单独记一套地址。对本文场景来说,它的价值是——修完双网卡路由后,用一条curl请求打过去,能同时验证三件事:DNS 解析正常、默认路由出公网正常、HTTPS 握手正常。如果这条请求通了,说明网络层基本没问题;如果超时,就回到路由表继续查。
需要提前准备的东西:
- 一台有 eth0/eth1 两块网卡的 Linux 服务器(CentOS 7/8、Ubuntu 20.04+ 都行,命令以
iproute2为准) - root 或 sudo 权限
- 一个 TaoToken API Key(在控制台创建,后面验证用)
- 记录好两个网段的规划:eth0 公网网段、eth1 内网网段、各自网关地址
注意:下面所有配置我都用
ip命令演示,因为它即时生效、可回滚,比直接改 ifcfg 文件再重启网络安全得多。确认无误后再写回配置文件持久化。
3. 可复制配置:双网卡正确写法与错误对照
3.1 先看错误配置长什么样
很多人是照着模板配的,eth0 和 eth1 的配置文件里都写了GATEWAY=,这就是双默认网关的根源。典型错误配置(以 CentOS 的 ifcfg 为例):
# /etc/sysconfig/network-scripts/ifcfg-eth0 (错误示范) TYPE=Ethernet BOOTPROTO=static DEVICE=eth0 ONBOOT=yes IPADDR=203.0.113.10 NETMASK=255.255.255.0 GATEWAY=203.0.113.1 # 公网网关,这条是对的 DNS1=223.5.5.5 # /etc/sysconfig/network-scripts/ifcfg-eth1 (错误示范) TYPE=Ethernet BOOTPROTO=static DEVICE=eth1 ONBOOT=yes IPADDR=10.0.0.10 NETMASK=255.255.255.0 GATEWAY=10.0.0.1 # 内网网关,这条就是罪魁祸首两个文件都写GATEWAY,重启网络后内核会往默认路由表里塞两条 default,谁生效取决于写入顺序和 metric,结果就是公网流量可能从 eth1 出去,而 eth1 的网关根本不给你转发公网,于是断网。
3.2 正确配置:只留一条默认路由
正确做法是 eth0 保留默认网关,eth1 只配 IP 和掩码,内网网段通过静态路由走 eth1。用ip命令即时配置:
# 1. 配置 eth0:公网 IP + 默认路由 sudo ip addr add 203.0.113.10/24 dev eth0 sudo ip link set eth0 up sudo ip route add default via 203.0.113.1 dev eth0 # 2. 配置 eth1:只配内网 IP,不加默认网关 sudo ip addr add 10.0.0.10/24 dev eth1 sudo ip link set eth1 up # 3. 内网网段走 eth1 的明细路由(假设内网是 10.0.0.0/8) sudo ip route add 10.0.0.0/8 via 10.0.0.1 dev eth1关键点:ip route add default只执行一次,绑定在 eth0 上;eth1 用ip route add 10.0.0.0/8这种明细路由,只把内网流量导向它。这样默认路由唯一,内网访问也不受影响。
3.3 持久化到配置文件
即时配置验证通过后,写回配置文件。eth0 保留GATEWAY,eth1 删掉GATEWAY,改用route-eth1文件写静态路由:
# /etc/sysconfig/network-scripts/ifcfg-eth1 (正确示范) TYPE=Ethernet BOOTPROTO=static DEVICE=eth1 ONBOOT=yes IPADDR=10.0.0.10 NETMASK=255.255.255.0 # 注意:这里不写 GATEWAY # /etc/sysconfig/network-scripts/route-eth1 (静态路由) 10.0.0.0/8 via 10.0.0.1 dev eth1Ubuntu 用 netplan 的话,写法是给 eth1 只配 addresses,不配 gateway4,内网路由写在 routes 里:
# /etc/netplan/01-netcfg.yaml network: version: 2 ethernets: eth0: addresses: [203.0.113.10/24] gateway4: 203.0.113.1 nameservers: addresses: [223.5.5.5] eth1: addresses: [10.0.0.10/24] routes: - to: 10.0.0.0/8 via: 10.0.0.13.4 参数对照表
| 配置项 | eth0(公网) | eth1(内网) | 说明 |
|---|---|---|---|
| IPADDR | 公网 IP | 内网 IP | 各自网段 |
| NETMASK | 对应掩码 | 对应掩码 | 按规划填 |
| GATEWAY | 公网网关 | 不填 | 只允许一条默认路由 |
| 静态路由 | 无 | 内网网段 via 内网网关 | 用 route-eth1 或 netplan routes |
| DNS | 公网 DNS | 不填 | 统一走 eth0 |
4. 验证请求:路由表检查与 TaoToken 通道连通性测试
4.1 先确认路由表只有一条 default
ip route show健康输出应该类似:
default via 203.0.113.1 dev eth0 proto static 10.0.0.0/8 via 10.0.0.1 dev eth1 proto static 10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.10 203.0.113.0/24 dev eth0 proto kernel scope link src 203.0.113.10如果看到两条default,说明还有网卡在抢默认路由,回到第 3 节检查配置文件。用ip route get可以精确看某个目标走哪条路:
ip route get 8.8.8.8 # 期望输出:8.8.8.8 via 203.0.113.1 dev eth0 ... ip route get 10.0.0.5 # 期望输出:10.0.0.5 via 10.0.0.1 dev eth1 ...4.2 用 TaoToken API 通道做端到端验证
路由表干净不代表请求能出去,还得实测。用 TaoToken 的 API 基址发一条请求,验证 DNS、默认路由、HTTPS 全链路:
# 先验证 DNS 解析 getent hosts taotoken.net # 再用 curl 打 TaoToken API 通道,验证外网连通 curl -sS -o /dev/null -w "HTTP状态: %{http_code} 耗时: %{time_total}s\n" \ https://taotoken.net/api \ -H "Authorization: Bearer $TAOTOKEN_API_KEY"如果返回HTTP状态: 200或401(401 说明网络通了、只是 Key 没带对),都证明网络层没问题。如果卡住超时,说明默认路由还是有问题,回到 4.1 继续查。
想进一步验证模型调用是否正常,可以走模型对话入口,用同一个 Key 发一条最小请求:
curl -sS https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 16 }'返回正常 JSON 就说明:双网卡路由修好了,外网通道也通了,后面接 Coding Plan 或写代码调用都不会再被网络卡住。API Key 在控制台的 API Keys 页面创建,接入细节可以对照接入文档。
4.3 成功结果长什么样
修好之后,你应该能同时看到这几个信号:
ip route show里只有一条defaultip route get 8.8.8.8指向 eth0ip route get 10.0.0.5指向 eth1curlTaoToken API 返回 200/401,不超时ping -c 3 223.5.5.5正常
这五条全绿,双网卡双网关的坑就算填平了。
5. 本篇常见错排查
5.1 能 ping 通网关,但上不了外网
这是最典型的症状。网关通说明二层和同网段三层没问题,上不了外网说明默认路由选错了网卡。直接ip route show看 default 有几条,多于一条就是本文说的问题。修复:删掉多余的默认路由,sudo ip route del default via 10.0.0.1 dev eth1,只保留 eth0 那条。
5.2 改完即时生效,重启后又坏了
说明只改了运行时,没写回配置文件。检查/etc/sysconfig/network-scripts/ifcfg-eth1里是不是还有GATEWAY=,有就删掉,改用route-eth1写静态路由。Ubuntu 检查 netplan 里 eth1 是否误配了gateway4。
5.3 内网访问也断了
删默认路由时手抖把内网明细路由也删了。补回来:sudo ip route add 10.0.0.0/8 via 10.0.0.1 dev eth1。注意内网网段要按你实际规划填,别照抄 10.0.0.0/8。
5.4 两条 default 但 metric 不同,看着"没冲突"
有的系统会给两条默认路由配不同 metric,内核选 metric 小的。这种"看起来正常"的配置很危险,一旦主网卡抖动,流量会切到内网网关,直接断网。别依赖 metric 兜底,从配置层面就保证只有一条 default。
5.5 curl TaoToken 超时但 ping IP 通
ping 走 ICMP,curl 走 TCP 443。如果 ping 通但 curl 超时,可能是防火墙挡了出站 443,或者 DNS 没配好导致域名解析失败。先getent hosts taotoken.net确认解析,再curl -v看卡在哪一步。DNS 建议统一配在 eth0 上,eth1 不配 DNS。
5.6 排障命令速查
ip route show # 看路由表,重点数 default 条数 ip route get 8.8.8.8 # 看特定目标走哪条路 ip addr show # 看网卡 IP 是否配对 ip link show # 看网卡是否 UP ss -tlnp # 看本地监听端口 curl -v https://taotoken.net/api # 看 HTTPS 请求卡在哪一步 journalctl -u network -n 50 # 看网络服务日志6. 修完之后,把 API 通道也用起来
双网卡路由这个坑,本质是"默认路由唯一性"被破坏。记住一句话就够了:一个路由表只留一条 default,内网网卡用明细路由。配的时候用ip命令即时验证,确认ip route get的走向对了,再写回配置文件持久化,能省掉大量重启排查的时间。
网络通了之后,TaoToken 这条统一 API 通道就可以直接投入使用了。如果你只是想把模型对话跑起来,去模型对话页面拿 Key 试一条请求就行;如果你要长期写代码、跑 Agent,建议直接上 Coding Plan,一个 base_url 覆盖多种模型,省得来回换地址;接入过程中遇到报错,对照接入文档排查最快。API Key 统一在控制台创建和管理,创建完记得用本文 4.2 的 curl 命令先验证一次连通性,确认网络和 Key 都没问题,再往业务代码里塞。