0

Linux服务器双网卡路由配置实战:内外网隔离与策略路由完整指南

2026.05.24 | youres | 15次围观

为什么要配置双网卡路由

在实际生产环境中,很多服务器需要同时连接内网和外网两个网络。比如一台服务器既要通过内网访问数据库、存储等内部资源,又要通过外网对外提供服务。如果只配置默认路由,往往会出现流量走错网卡的情况——要么内网流量绕了外网,要么外网访问不到服务器。双网卡路由配置就是解决这个问题的核心手段。

双网卡路由的核心概念

默认路由与路由表

Linux系统通过路由表决定数据包从哪个网卡发出。一张路由表里有多条规则,系统按"最长匹配"原则选择出口。默认路由(default route)是兜底规则——当没有更精确的路由匹配时,数据包就走默认路由指定的网卡和网关。

策略路由(Policy Routing)

普通路由只看目标地址,策略路由可以同时根据源地址、目标地址、入接口等条件来选择不同的路由表。这是实现双网卡流量隔离的关键技术。Linux支持255张路由表,默认只用了main表和local表,策略路由让我们能创建自定义路由表。

实战场景:内网+外网双网卡服务器

假设服务器有两块网卡:

  • eth0:外网网卡,IP 203.0.113.10/24,网关 203.0.113.1
  • eth1:内网网卡,IP 192.168.1.10/24,网关 192.168.1.1

第一步:配置网卡IP地址

CentOS/RHEL(ifcfg文件方式)

外网网卡 /etc/sysconfig/network-scripts/ifcfg-eth0:

TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=203.0.113.10
PREFIX=24
GATEWAY=203.0.113.1
DNS1=8.8.8.8

内网网卡 /etc/sysconfig/network-scripts/ifcfg-eth1:

TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.1.10
PREFIX=24
# 注意:内网网卡不要写GATEWAY,避免默认路由冲突

关键点:只有一个网卡配置GATEWAY,另一个网卡通过策略路由来指定网关。两个网卡都写GATEWAY会导致默认路由冲突,后加载的网卡会覆盖前一个的默认路由。

Ubuntu(netplan方式)

network:
  version: 2
  ethernets:
    eth0:
      addresses: [203.0.113.10/24]
      routes:
        - to: default
          via: 203.0.113.1
      nameservers:
        addresses: [8.8.8.8]
    eth1:
      addresses: [192.168.1.10/24]
      # 内网不设默认路由

第二步:配置策略路由

创建自定义路由表

编辑 /etc/iproute2/rt_tables,添加自定义路由表:

# 已有的
100    inner

添加路由规则

为内网网卡创建独立路由表并添加规则:

# 往inner表添加内网默认路由
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table inner
ip route add default via 192.168.1.1 dev eth1 table inner

# 添加策略规则:从192.168.1.10发出的包查inner表
ip rule add from 192.168.1.10 table inner

这样从内网IP发出的流量会查inner路由表,走内网网关;其他流量走main表的默认路由,走外网网关。

验证路由规则

# 查看策略路由规则
ip rule show

# 查看inner路由表
ip route show table inner

# 测试从内网IP出发的路由
ip route get 10.0.0.1 from 192.168.1.10

# 测试从外网IP出发的路由
ip route get 8.8.8.8 from 203.0.113.10

第三步:持久化路由配置

ip命令添加的路由重启后会丢失,需要持久化。

CentOS/RHEL方式

创建 /etc/sysconfig/network-scripts/rule-eth1:

from 192.168.1.10 table inner

创建 /etc/sysconfig/network-scripts/route-eth1:

192.168.1.0/24 dev eth1 src 192.168.1.10 table inner
default via 192.168.1.1 dev eth1 table inner

Ubuntu方式

在netplan中配置策略路由:

network:
  version: 2
  ethernets:
    eth0:
      addresses: [203.0.113.10/24]
      routes:
        - to: default
          via: 203.0.113.1
    eth1:
      addresses: [192.168.1.10/24]
      routes:
        - to: 192.168.1.0/24
          via: 192.168.1.1
          table: 100
        - to: default
          via: 192.168.1.1
          table: 100
      routing-policy:
        - from: 192.168.1.10
          table: 100

执行 netplan apply 生效。

第四步:解决常见问题

问题一:内网能ping通但外网访问不了

原因通常是默认路由指向了内网网关。检查 main 路由表的默认路由:

ip route show default

确认默认路由指向外网网关。如果不对,删除错误的默认路由再添加正确的:

ip route del default
ip route add default via 203.0.113.1 dev eth0

问题二:外网能访问但内网不通

检查策略路由规则是否生效:

ip rule show | grep inner

确认 from 192.168.1.10 table inner 规则存在,且 inner 表中有正确的路由。

问题三:重启后路由丢失

说明持久化配置没写对。CentOS检查 rule-eth1 和 route-eth1 文件,Ubuntu检查 netplan 配置。

高级场景:多网段内网路由

如果内网有多个网段(如10.0.0.0/8、172.16.0.0/12),需要在inner路由表中添加这些网段的路由:

ip route add 10.0.0.0/8 via 192.168.1.1 dev eth1 table inner
ip route add 172.16.0.0/12 via 192.168.1.1 dev eth1 table inner

或者直接在inner表加一条默认路由指向内网网关,所有内网流量都走eth1出去。

防火墙注意事项

双网卡服务器别忘了防火墙规则,确保内网网卡允许内网流量、外网网卡只开放必要端口:

# firewalld示例
firewall-cmd --zone=internal --add-interface=eth1 --permanent
firewall-cmd --zone=public --add-interface=eth0 --permanent
firewall-cmd --zone=internal --add-source=192.168.1.0/24 --permanent
firewall-cmd --reload

排查双网卡路由问题的工具

  • ip route get:模拟从指定IP到指定目标的路由路径
  • ip rule show:查看所有策略路由规则
  • tcpdump -i ethX:抓包看流量是否从正确的网卡进出
  • traceroute:追踪数据包实际走的路径
  • mtr:结合ping和traceroute,实时查看路由

总结

双网卡路由配置的核心就三步:一是一个网卡配默认路由、另一个不配;二是用策略路由让内网流量走内网网关;三是持久化配置防止重启丢失。搞清这三点,内外网隔离基本就不会出问题。遇到故障先用 ip route get 定位流量走向,再针对性修复路由规则。

相关文章

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
881文章数 0评论数
作者其它文章