Debian 双网卡配置:主网卡上网,副网卡通过静态路由访问多内网

摘要: 本文介绍 Debian 12/13 双网卡场景下,如何保持主网卡默认上网,同时让副网卡通过指定下一跳访问多个内网网段,并实现重启自动生效。
大家好,我是云核筑梦家。
在服务器实际部署中,经常会遇到这样的网络需求:
第一张网卡连接公网,负责服务器默认上网。
第二张网卡连接内部网络。
第二张网卡不能抢占默认路由。
需要通过第二张网卡的上联网关访问多个其他内网网段。
所有配置需要在服务器重启后自动恢复。
这类场景如果直接给两张网卡都配置 gateway,很容易出现默认路由冲突,甚至导致 Debian 的 networking.service 启动失败。
本文以 Debian 12 / Debian 13 为例,介绍一种更加稳定的配置方法:主网卡保留默认网关,副网卡只配置 IP,通过静态路由访问其他内网。
一、网络拓扑示例
本文所有 IP 均为实验示例,请根据自己的实际网络进行修改。
假设服务器拥有两张网卡:
ens18:公网网卡
IP:203.0.113.10/24
网关:203.0.113.1
ens19:内网网卡
IP:10.10.11.6/24内网下一跳网关:
10.10.11.1另外还需要通过这个网关访问:
10.10.12.0/24
10.10.13.0/24
10.10.14.0/24最终我们需要实现:
普通公网流量
↓
ens18
↓
203.0.113.1
10.10.11.0/24
↓
ens19 直接访问
10.10.12.0/24
10.10.13.0/24
10.10.14.0/24
↓
10.10.11.1
↓
ens19这样主网卡和内网网卡互不影响。
二、查看当前网卡
首先执行:
ip addr例如:
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP>
inet 203.0.113.10/24
3: ens19: <BROADCAST,MULTICAST>可以看到:
ens18 = 已经配置公网 IP
ens19 = 第二张网卡,暂未配置再查看当前路由:
ip route正常情况下公网默认路由类似:
default via 203.0.113.1 dev ens18这条默认路由需要保留。
三、配置第二张网卡
Debian 使用传统 ifupdown 网络配置时,可以给第二张网卡创建独立配置文件。
创建:
nano /etc/network/interfaces.d/ens19写入:
auto ens19
iface ens19 inet static
address 10.10.11.6/24这里有一个很重要的地方:
不要配置 gateway。
不要写成:
auto ens19
iface ens19 inet static
address 10.10.11.6/24
gateway 10.10.11.1因为主网卡本身已经存在默认网关。
如果第二张网卡再次配置:
gateway 10.10.11.1Debian 会尝试再向主路由表添加一条默认路由。
某些环境下可能出现:
RTNETLINK answers: File exists甚至:
Job for networking.service failed because the control process exited with error code.所以这种网络结构下,副网卡没有必要配置默认网关。
四、启动第二张网卡
可以先单独启动网卡:
ip link set ens19 up然后:
ifup ens19如果之前已经启动过,可能会看到:
ifup: interface ens19 already configured这并不一定代表配置错误。
查看:
ip addr show ens19正常应该可以看到:
inet 10.10.11.6/24同时系统会自动生成一条直连路由:
10.10.11.0/24 dev ens19 proto kernel scope link src 10.10.11.6这意味着:
10.10.11.0/24这个网段不需要额外配置静态路由。
五、测试内网网关
首先确认第二张网卡到内网网关正常。
执行:
ping -I ens19 10.10.11.1正常返回:
64 bytes from 10.10.11.1: icmp_seq=1 ttl=64 time=0.xxx ms说明:
服务器
↓
ens19
↓
10.10.11.1这一段网络已经正常。
六、添加其他内网静态路由
接下来添加需要通过 10.10.11.1 访问的网段。
执行:
ip route replace 10.10.12.0/24 via 10.10.11.1 dev ens19
ip route replace 10.10.13.0/24 via 10.10.11.1 dev ens19
ip route replace 10.10.14.0/24 via 10.10.11.1 dev ens19这里推荐使用:
ip route replace而不是:
ip route add因为 replace 在路由已经存在时会直接更新,不容易出现:
RTNETLINK answers: File exists七、查看路由是否正确
执行:
ip route最终应该类似:
default via 203.0.113.1 dev ens18
203.0.113.0/24 dev ens18 proto kernel scope link src 203.0.113.10
10.10.11.0/24 dev ens19 proto kernel scope link src 10.10.11.6
10.10.12.0/24 via 10.10.11.1 dev ens19
10.10.13.0/24 via 10.10.11.1 dev ens19
10.10.14.0/24 via 10.10.11.1 dev ens19这时候服务器的默认上网出口仍然是:
203.0.113.1 → ens18而三个内网网段则全部从:
10.10.11.1 → ens19访问。
八、验证具体流量走哪张网卡
Linux 有一个非常好用的命令:
ip route get例如:
ip route get 10.10.12.1正常应该返回:
10.10.12.1 via 10.10.11.1 dev ens19 src 10.10.11.6这句话的意思就是:
目标:10.10.12.1
下一跳:
10.10.11.1
出口网卡:
ens19
源地址:
10.10.11.6同样可以检查:
ip route get 10.10.13.1
ip route get 10.10.14.1九、测试三个内网
分别执行:
ping 10.10.12.1ping 10.10.13.1ping 10.10.14.1如果都能够正常收到回复,就说明静态路由已经生效。
十、配置永久静态路由
前面执行的:
ip route replace只对当前系统运行状态生效。
服务器重启以后,这些手动添加的路由会消失。
所以需要写入:
/etc/network/interfaces.d/ens19最终配置如下:
auto ens19
iface ens19 inet static
address 10.10.11.6/24
up ip route replace 10.10.12.0/24 via 10.10.11.1 dev ens19
up ip route replace 10.10.13.0/24 via 10.10.11.1 dev ens19
up ip route replace 10.10.14.0/24 via 10.10.11.1 dev ens19也可以直接使用命令生成:
cat >/etc/network/interfaces.d/ens19 <<'EOF'
auto ens19
iface ens19 inet static
address 10.10.11.6/24
up ip route replace 10.10.12.0/24 via 10.10.11.1 dev ens19
up ip route replace 10.10.13.0/24 via 10.10.11.1 dev ens19
up ip route replace 10.10.14.0/24 via 10.10.11.1 dev ens19
EOF查看:
cat /etc/network/interfaces.d/ens19这样以后 ens19 启动时,就会自动添加这些路由。
十一、为什么第二张网卡不需要 gateway?
很多人容易产生一个误区:
第二张网卡连接了一个三层网关,所以一定要配置 gateway。
实际上并不是。
在 Linux 中:
gateway通常意味着:
默认路由例如:
gateway 203.0.113.1最终实际上就是:
ip route add default via 203.0.113.1但我们的服务器已经有:
default via 203.0.113.1 dev ens18服务器只需要通过第二张网卡访问指定内网,所以真正需要的是:
10.10.12.0/24 → 10.10.11.1
10.10.13.0/24 → 10.10.11.1
10.10.14.0/24 → 10.10.11.1而不是再增加一个默认路由。
所以:
第二张网卡不配置 gateway并不代表它不能经过网关。
我们只是通过静态路由明确告诉系统哪些目标需要经过这个网关。
十二、为什么直接 ping 其他内网最开始不通?
假设最开始路由表只有:
default via 203.0.113.1 dev ens18
10.10.11.0/24 dev ens19这时候执行:
ping 10.10.12.1Linux 查看路由表后发现:
没有 10.10.12.0/24 的路由于是只能使用:
default最终流量就会变成:
10.10.12.1
↓
默认路由
↓
ens18
↓
公网网关自然无法访问内部网络。
添加:
ip route replace 10.10.12.0/24 via 10.10.11.1 dev ens19以后,就变成:
10.10.12.1
↓
10.10.11.1
↓
ens19所以访问恢复正常。
十三、不要随意重启整个 networking
远程 SSH 操作服务器的时候,不建议随便执行:
systemctl restart networking因为这个操作可能同时重启:
ens18
ens19如果 ens18 是当前 SSH 使用的公网网卡,一旦配置存在问题,很可能直接导致服务器失联。
修改第二张网卡时,更推荐:
ifdown ens19
ifup ens19或者先通过临时命令测试:
ip addr
ip route确认完全正常后,再写入永久配置。
十四、常用排查命令
查看所有网卡
ip addr查看路由表
ip route查看指定网卡
ip addr show ens19查看访问某个 IP 使用哪条路由
ip route get 10.10.12.1指定网卡 Ping
ping -I ens19 10.10.11.1查看 Debian 网络服务
systemctl status networking --no-pager -l查看网络服务日志
journalctl -u networking -n 50 --no-pager十五、最终方案总结
本次网络配置可以概括为:
Debian Server
┌─────────────────────┐
│ │
公网 ──→│ ens18 │
│ 主默认路由 │
│ │
内网 ──→│ ens19 │
│ 仅配置内网 IP │
│ + 静态路由 │
└─────────────────────┘公网:
默认流量
↓
ens18
↓
公网网关内网:
10.10.11.0/24
↓
ens19 直连其他内部网段:
10.10.12.0/24
10.10.13.0/24
10.10.14.0/24
↓
10.10.11.1
↓
ens19这种方式的优势是:
不影响公网默认出口
不需要双默认网关
路由关系清晰
不容易出现默认路由冲突
支持多个内部网段
Debian 重启后可以自动恢复
非常适合 IDC、管理网络、监控网络、业务内网等双网卡服务器环境
对于一台同时连接公网和多个内部网段的 Debian 服务器来说,主网卡负责默认路由,副网卡配合静态路由,通常是更加简单、稳定、容易维护的方案。
评论