同时接入多个网卡访问多个网段
Linux多网卡配置
工作环境限制,不同的网络环境只能访问对应网段的网站、应用,这时通过安装双网卡且做对应配置后可以实现同时访问的需求。
设置网卡

同时连接多块网卡后,通过ipconfig、ip addr、nmcli device status命令对比查看网络状态,确认硬件已经存在。

进入/etc/sysconfig/network-scripts,新增网卡之后还是只有一个网卡配置文件ens160,复制现有网卡配置生成ens192模板。
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens160 ifcfg-ens192
vim ifcfg-ens192
uuidgen
设置ens192网卡,双网卡只能一张网卡设置DEFROUTE=yes,另外一张no,且只有一张网卡需要设置默认网关GATEWAY,避免路由冲突断网,UUID通过uuidgen命令生成替换,并修改DEVICE和NAME名称。
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=no
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens192
UUID=e0f4b292-8190-4fb6-969b-d745203c6b77
DEVICE=ens192
ONBOOT=yes
IPADDR=10.xx.xx.xx
PREFIX=24
GATEWAY=
DNS1=
IPV6_PRIVACY=no
Centos8及以上和Kylin-Server-10-SP2系统,执行systemctl restart NetworkManager命令重启网络使配置生效。

查看路由配置
# 查看路由表
ip route show
route -n

proto kernel代表内核自动生成,只要网卡配置IP、网卡UP就自动出现,不是手动静态路由;scope link表示链路本地路由,代表该网段和本机网卡二层直连,不需要网关,直接ARP通信。
通过ip route get 10.xx.xx.xx命令,测试流量走哪个网关。

命令临时修改路由配置
通过修改路由配置,实现所有ip默认走ens160网关,某几个网段走ens192网关,实现同时访问不同网络。
route命令是早期Linux发行版使用的路由管理工具,但已被 ip route 取代;ip route 命令提供了更丰富的功能,支持更复杂的路由配置,现在Linux发行版建议使用 ip route 进行路由管理。
| 功能 | route | ip route |
|---|---|---|
| 查看路由表 | route -n | ip route show |
| 添加静态路由 | route add -net 10.11.0.0 netmask 255.255.0.0 gw 10.11.42.1 | ip route add 10.11.0.0/16 via 10.11.42.1 dev ens192 |
| 删除静态路由 | route del -net 10.11.0.0 netmask 255.255.0.0 gw 10.11.42.1 | ip route del 10.11.0.0/16 via 10.11.42.1 |
| 设置默认网关 | route add default gw 10.11.42.1 | ip route add default via 10.11.42.1 dev ens192 |
| 删除默认网关 | route del default gw 10.11.42.1 | ip route del default |
# route命令添加临时路由,无需重启网络服务
route add -net 10.11.0.0 netmask 255.255.0.0 gw 10.11.42.1
route add -net 10.12.0.0 netmask 255.255.0.0 gw 10.11.42.1
route add -net 10.4.0.0 netmask 255.255.0.0 gw 10.11.42.1
# ip route添加临时路由,无需重启网络服务
ip route add 10.11.0.0/16 via 10.11.42.1 dev ens192
ip route add 10.12.0.0/16 via 10.11.42.1 dev ens192
ip route add 10.4.0.0/16 via 10.11.42.1 dev ens192

使用route、ip route命令添加的路由,机器重启或者网卡重启后路由就失效了,是临时的。
文件永久修改路由配置
设置永久路由的话,需要在配置文件中进行修改。按照Linux启动的顺序,rc.local里面的内容是在Linux所有服务都启动完毕,最后才被执行的,在rc.local中添加路由会存在NFS无法自动挂载问题;Centos8及以上和Kylin V10 SP2系统默认使用NetworkManager,不识别、不加载static-routes配置文件;推荐使用route-interface文件的方式进行配置。
rc.local文件
路径为/etc/rc.local,配置文件内容语法与route和ip route命令一致,设置完后需要执行chmod +x /etc/rc.local命令确保文件具有执行权限。
static-routes文件
以Centos7为例,路径为/etc/sysconfig/static-routes,该文件不存在的话就手动建立一个这样的文件,该配置文件的语法如何呢?static-routes其实在被network这个脚本调用的,打开/etc/rc.d/init.d/network这个脚本进行分析。
# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]; then
if [ -x /sbin/route ]; then
grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
/sbin/route add -$args
done
else
net_log $"Legacy static-route support not available: /sbin/route not found"
fi
fi
network在执行的时候到static-routes里面寻找any开头的行,然后执行/sbin/route add -$args命令,相当于手动执行了route add脚本,那后面事情就简单了,回到了手动执行的方式,根据前面的说明,正确的脚本就是any host 10.11.0.100 gw 10.11.42.1,network执行的时候把any去掉,获取后面的参数host 10.11.0.100 gw 10.11.42.1,最后执行route add -host 10.11.0.100 gw 10.11.42.1添加路由。注意这里host前面的-是~自带的,不需要配置到static-routes文件中,最终配置内容如下。
# 设置网段
any net 10.11.0.0 netmask 255.255.0.0 gw 10.11.42.1
any net 10.12.0.0 netmask 255.255.0.0 gw 10.11.42.1
any net 10.4.0.0 netmask 255.255.0.0 gw 10.11.42.1
# 设置host
any host 10.11.0.100 gw 10.11.42.1

route-interface文件
路径为/etc/sysconfig/network-scripts/route-interface,interface需要根据实际的网卡换成网卡名,比如我要在ens192上加静态路由,那就写route-ens192,语法也比较简洁。
10.11.0.0/16 via 10.11.42.1
10.12.0.0/16 via 10.11.42.1
10.4.0.0/16 via 10.11.42.1
使用systemctl restart NetworkManager命令重启网络无效,需要使用如下命令。
# 加载所有网卡配置文件
nmcli connection reload
# 分别重启两张网卡,同时使用down和up,或者单独使用up
nmcli connection down ens160 && nmcli connection up ens160
nmcli connection down ens192 && nmcli connection up ens192
# 勿单独执行网卡down命令,否则会断网
# nmcli connection down ens160
# nmcli connection down ens160
# 或是同时使用ifdown和ifup,或是单独使用ifup命令,勿单独使用ifdown命令,否则会断网
ifdown ens160 && ifup ens160
ifdown ens192 && ifup ens192

DNS按域名分流
双网卡配置DNS,比如ens160的DNS是11.3.127.13,ens192的DNS是10.12.23.16,/etc/resolv.conf只是简单把两个DNS排成列表,系统按顺序挨个尝试比如先去查11.3.127.13,该DNS不存在这条记录则直接返回NXDOMAIN,服务器收到NXDOMAIN就停止继续查询下一个DNS,不会再去尝试10.12.23.16,如果某个域名比如iamsit.cscloud.hnrcc.bank只有10.12.23.16能解析,那么此时ping iamsit.cscloud.hnrcc.bank会导致无法解析。
Win10上使用了Smart Multi-Homed Name Resolution(智能多宿主名称解析)1技术,会同时向所有适配器的DNS发查询,不会出现该问题。下面通过启用Linux自带的systemd-resolved实现按域名分流DNS。
通过vim /etc/NetworkManager/NetworkManager.conf命令新增配置启用systemd-resolved。
[main]
#plugins=ifcfg-rh,ibft
dns=systemd-resolved
rc-manager=symlink
创建软链接指向 127.0.0.53,所有解析请求统一交给resolved代理。
# 先备份
mv /etc/resolv.conf /etc/resolv.conf.bak
# 创建软链接指向stub代理
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
# 删除软链接
# rm -f /etc/resolv.conf
添加域名匹配规则且永久固化。
mkdir -p /etc/systemd/resolved.conf.d
vim /etc/systemd/resolved.conf.d/split-dns.conf
# split-dns.conf文件内容,域名以.cscloud.hnrcc.bank结尾,强制使用本段内配置的DNS=10.12.23.16查询;FallbackDNS:当上面规则不匹配、且网卡没有提供上游DNS时,自动使用11.3.127.13
[Resolve]
Domains=~cscloud.hnrcc.bank
DNS=10.12.23.16
FallbackDNS=11.3.127.13
启动并设置开机自启resolved。
systemctl enable --now systemd-resolved
重载网卡配置。
nmcli connection reload
nmcli connection down ens160 && nmcli connection up ens160
nmcli connection down ens192 && nmcli connection up ens192
此时ping iamsit.cscloud.hnrcc.bank已经正常解析。