linux 双路由双网卡公私网访问环境配置

linux 双路由双网卡公私网访问环境配置

需求

之前碰到一个问题,没经历过还挺麻烦的。现在将解决方法分享出来,希望能帮助到遇到相同问题的人。

实验室有一台HP工作站的机器,有一个公网IP,导师希望布置一些网站,和同学们在任何地方都能通过公网IP连到服务器上,本来很简单的问题,但很坑爹的是通过这个公网IP不能上外网,连什么Mysql,github等都不可以(可以连,但是开通要收巨额流量费,一晚几千那种),于是有了下面的架构。
linux 双路由双网卡公私网访问环境配置

问题

需要配置访问者通过公网IP通过路由器2网卡2进入服务器,服务器访问网络通过网卡1
如果访问IP (如:A)固定的话有个解决方案,配置路由表,设置去往A的流量通过网卡2即可,但是访问服务器的IP不可能固定

  1. 访问者不一定有公网IP
  2. 每次访问的IP很有可能是变化的

如过配置访问者通过路由器1网卡1进入服务器,行不通,因为路由器1不具有公网IP

结论

配置单一的路由表不能解决问题
理想的路径如下图
linux 双路由双网卡公私网访问环境配置

解决办法

配置多张路由表

网卡1为 eth1,网卡2为eth0

  1. 编辑 /etc/iproute2/rt_tables 增加两个public 和 private策略
    其中public策略表对应网卡2(公网IP),private策略表对应网卡1(无公网IP)
    linux 双路由双网卡公私网访问环境配置

linux 双路由双网卡公私网访问环境配置
下面是具体配置命令

	route del -net 0.0.0.0                          删除默认路由策略
	route add -net 0.0.0.0 gw 192.168.80.1          增加默认路由网关 即从能访问国际网的路由器走
eth0的配置命令
	ip route flush table public                     清空public策略表
	ip route add default via 192.168.90.1 dev eth0 table public 
													public策略表默认网关为外网连进来的路由器
	ip rule add from 192.168.90.0/24 table public   从192.168.90.X网段来的流量都从public策略表走,即从90.1网关走
	
eth1的配置命令 (同上)
	ip route flush table private
	ip route add default via 192.168.80.1 dev eth1 table private
	ip rule add from 192.168.80.0/24 table private

路由展示

默认路由
linux 双路由双网卡公私网访问环境配置

ip策略表

linux 双路由双网卡公私网访问环境配置
路由表的内容

linux 双路由双网卡公私网访问环境配置

后续问题

安装docker后,发现docker container 里不能访问互联网

linux 双路由双网卡公私网访问环境配置

解决办法
在 private路由表中添加docker路由信息
linux 双路由双网卡公私网访问环境配置
linux 双路由双网卡公私网访问环境配置

网卡配置

  1. centOS版(网桥版,为何是网桥版,请看
    https://blog.csdn.net/weixin_44698082/article/details/89322728

在 /etc/sysconfig/network-scripts/下
有ifcfg-enp3s0 、 ifcfg-enp5s0 两张网卡信息,编辑如下

ifcfg-enp3s0

TYPE=Ethernet                          类型  以太网
#PROXY_METHOD=none
#BROWSER_ONLY=no
#BOOTPROTO=dhcp
#DEFROUTE=yes
#NM_CONTROLLED=no
BRIDGE=br0                            网桥 br0
#USERCTL=no
#IPV6INIT=yes
#IPV4_FAILURE_FATAL=no
#IPV6_AUTOCONF=yes
#IPV6_DEFROUTE=yes
#IPV6_FAILURE_FATAL=no
#IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp3s0                          名称
UUID=c05227b6-aac4-462d-b83a-6157d1354410   UUID 唯一
DEVICE=enp3s0                          设备
ONBOOT=yes                            启动的时候启用该设置
#NETMASK=255.255.255.0
#GATEWAY=192.168.90.1

ifcfg-enp5s0 同理 网桥选择br1

创建网桥配置文件 ifcfg-br0 ifcfg-br1
ifcfg-br0

TYPE=Bridge                       类型 网桥
PROXY_METHOD=none				  无代理?
BROWSER_ONLY=no					
BOOTPROTO=static	              配置ip获取类型 这里设置为静态,也可以在路由器里设置mac绑定
DEFROUTE=yes                      定义路由?
NM_CONTROLLED=no				  设置不实时生效
#BRIDGE=br0
USERCTL=no
IPV6INIT=yes
IPV4_FAILURE_FATAL=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br0							名称
#UUID=c05227b6-aac4-462d-b83a-6157d1354410
DEVICE=br0                          设备
ONBOOT=yes							启动的时候启用该设置
IPADDR=192.168.90.2                 静态IP地址
NETMASK=255.255.255.0				子网掩码
NETWORK=192.168.90.0				网段
#GATEWAY=192.168.90.1
DNS1=223.6.6.6                      DNS服务器 阿里云的
DNS2=223.5.5.5

ifcfg-br1

TYPE=Bridge
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
NM_CONTROLLED=no
#BRIDGE=br0
USERCTL=no
IPV6INIT=yes
IPV4_FAILURE_FATAL=no
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=br1
#UUID=c05227b6-aac4-462d-b83a-6157d1354410
DEVICE=br1
ONBOOT=yes
IPADDR=192.168.80.3
NETMASK=255.255.255.0
NETWORK=192.168.80.0
GATEWAY=192.168.80.1
DNS1=223.6.6.6
DNS2=223.5.5.5

~
3. ubuntu版
打开ubuntu的/etc/network/interfaces

#and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

#The loopback network interface

auto lo
iface lo inet loopback

#The primary network interface

auto eth0
iface eth0 inet dhcp             //第一张网卡DHCP  但是因为MAC绑定过了,所以是静态地址
auto eth1
iface eth1 inet dhcp             //第二张网卡DHCP

开机启动

将解决方法里的命令写到开机脚本 rc.local
赋予rc.local执行权限