侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 146 篇文章
  • 累计创建 60 个标签
  • 累计收到 2 条评论

Linux 多网卡配置路由策略

liveJQ
2021-11-11 / 0 评论 / 0 点赞 / 904 阅读 / 2,420 字 / 正在检测是否收录...
广告 广告

多网卡配置路由策略可以简称为“源进源出”策略,顾名思义就是指从哪个网卡上进来就从哪个网卡上出去,这样做的目的是为了达到更好的访问效果。例如:配置实现三层内网和外网的同时访问、国内三线访问、国内外线路访问等。

CentOS 7.9

网卡配置

vi /etc/sysconfig/network-scripts/ifcfg-xxx

网卡1:访问互联网(默认路由)

TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.20.10.10
NETMASK=255.0.0.0
#IPADDR1=10.20.10.11
#NETMASK1=255.0.0.0
GATEWAY=10.20.10.254
DNS1=223.6.6.6
#DNS2=114.114.114.114
DEFROUTE=yes
NAME=ens192
DEVICE=ens192

网卡2:访问三层局域网(换成其他公网一样配置)

TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.123.2
NETMASK=255.255.255.0
#GATEWAY=192.168.123.254
DNS1=xxx.xxx.xxx.xxx
DEFROUTE=yes
NAME=ens160
DEVICE=ens160

NETMASK 可以用 PREFIX 代替,例如:PREFIX=8 表示 255.0.0.0

需要注意的是,网关只配置其中一个,作为默认路由。最后重启网络服务生效。

service network restart

添加路由表并配置路由策略

255 local、254 man、253 default 和 0 unspec 是已定义的路由表 ID 和对应的路由表名,理论上 linux 可以配置超过 255 个路由表,路由表 ID 数字命名除了已定义之外,也是可以命名 255 之外的数字的,只不过太巨大的话也会引发溢出问题。路由表名称以字母(大小写)、数字和下划线组成。虽然可以直接以纯数字命名,但缺乏可读性,建议还是根据路由表意义来命名。

cat << EOF >>/etc/iproute2/rt_tables
251 localnet
EOF

如果这里的网卡2是二层网络,则可以忽略这一步配置。

cat << EOF >>/etc/rc.local
ip route flush table localnet
ip route add default via 192.168.123.254 dev ens160 src 192.168.123.2 table localnet                   
ip rule add from 192.168.123.2 table localnet
EOF

生效

chmod 777 /etc/rc.local 
/etc/rc.local

这里一定要添加执行权限,确保每次开机后自动执行生效。

Ubuntu 20.04

安装

apt install iproute2

添加路由表

cat << EOF >> /etc/iproute2/rt_tables
800 amazon_hk
EOF

网卡配置

# This is the network config written by 'subiquity'
network:
  ethernets:
    ens160:
      addresses:
      - 172.18.0.57/24
      - 172.18.0.58/24
      match:
        macaddress: 00:50:56:aa:28:1f
      mtu: 1500
      nameservers:
        addresses:
        - 8.8.8.8
        search: []
      set-name: ens160
      routes:
        - to: 0.0.0.0/0
          via: 172.18.0.254
          table: 800
      routing-policy:
        - from: 172.18.0.57
          table: 800
          priority: 33300
    ens192:
      addresses:
      - 192.168.111.94/24
      match:
        macaddress: 00:50:56:aa:37:79
      mtu: 1500
      gateway4: 192.168.111.65
      nameservers:
        addresses:
        - 1.1.1.1
        search: []
      set-name: ens192
  version: 2

优先级问题

这里需要注意的是给路由表设置了优先级,这里是 33300,数字越小优先级越高。有时候配置好后网络仍然不可达,问题就出在优先级,我将优先级数字缩小到3300,网络就通了,猜测可能跟已定义的路由表优先级有关。

root@noc:~# ip rule show
0:	from all lookup local
32766:	from all lookup main
32767:	from all lookup default
33300:	from 172.18.0.57 lookup amazon_hk

还有一种情况是当多个路由表匹配目标地址时,系统会选择最长前缀的路由,也就是 CIDR 前缀最大的那个。

路由表801:

routes:
- to: 1.1.1.0/24
  via: 172.18.0.254
  table: 801
routing-policy:
- from: 172.18.0.57
  table: 801
  priority: 33300

路由表802:

routes:
- to: 1.1.1.0/30
  via: 172.18.0.254
  table: 802
routing-policy:
- from: 172.18.0.57
  table: 802
  priority: 33300

毫无疑问,如果目标是去 1.1.1.1 的话,系统会选择路由表802。

配置静态路由

静态路由里面的 metric 表示优先级,较低的值同样表示较高的优先级。如果没有指定路由表,则添加的静态路由通常属于主路由表。

routes:
- to: 1.1.1.1
  via: 172.18.0.254
  metric: 0

配置生效

netplan generate && netplan apply
0

评论区