为什么要配置双网卡路由
在实际生产环境中,很多服务器需要同时连接内网和外网两个网络。比如一台服务器既要通过内网访问数据库、存储等内部资源,又要通过外网对外提供服务。如果只配置默认路由,往往会出现流量走错网卡的情况——要么内网流量绕了外网,要么外网访问不到服务器。双网卡路由配置就是解决这个问题的核心手段。
双网卡路由的核心概念
默认路由与路由表
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辅助作者原创,未经许可,转载请保留原文链接。

发表评论