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

网络服务器有用的小知识
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.1

Debian 会尝试再向主路由表添加一条默认路由。

某些环境下可能出现:

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.1
ping 10.10.13.1
ping 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.1

Linux 查看路由表后发现:

没有 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 服务器来说,主网卡负责默认路由,副网卡配合静态路由,通常是更加简单、稳定、容易维护的方案。

本文为原创实践记录,首发于 小航博客,转载请注明出处与链接。

评论

发表评论

评论经审核后显示。请勿提交广告或与主题无关的内容。