场景背景与需求

某公司新买一台服务器, 服务器资源(cpu,内存,硬盘)比较多,并且有多个网卡。

运维工程师为了节省资源,在服务器上搭建多个服务,希望通过多个网卡实现流量分流。

但由于运维工程师对网络理解不够深入,将服务器的多个网卡都配置了同一个网段。

最后的结果是并不能正常的访问这多个服务。

场景分析

  • 网卡设置了IP地址后,会产生一个与IP地址同网段的路由条目, 并与当前网卡名对应。
  • 如果多个网卡设置同网段IP地址后,会产生多个同网段的路由条目,并与不同网卡名对应。

假设两个网卡eth0,eth1分别配置10.1.1.5/24与10.1.1.6/24. 则会产生以下路由

10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1

如果不同客户端通过这两个IP进来访问不同的服务。进来会从不同网卡进,但回去时就会都从eth0回去(因为路由会从上往下读取,所以默认只会读上面一条)

测试实验:

1, 准备一个虚拟机模拟服务器,开两个网卡,都为同一个网络, 配置两个同网段IP。

server# ip addr |grep eth -A 1
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 52:54:00:41:e4:22 brd ff:ff:ff:ff:ff:ffinet 10.1.1.5/24 brd 10.1.1.255 scope global br0
eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 52:54:00:39:c0:e6 brd ff:ff:ff:ff:ff:ffinet 10.1.1.6/24 brd 10.1.1.255 scope global eth1

2, 用另一台机器模拟客户端,使用ping来访问以上2个IP。

client# ip neigh |grep -E "^10.1.1.5 |^10.1.1.6 "
10.1.1.5 dev eth0 lladdr 52:54:00:41:e4:22 REACHABLE
10.1.1.6 dev eth0 lladdr 52:54:00:41:e4:22 REACHABLE

说明:

  • 按照arp协议原理, 访问哪个IP它才会回应mac地址。
  • 而现在的结果是mac地址都为10.1.1.5对应的mac地址。
  • 这是因为linux系统内核参数默认做了设置, 访问同台机器的网卡IP,如果这个网卡挂了,另外一个同网段的网卡会帮助回应。可以比喻成(张三,李四两个网卡同一台机器,就是一家人,找张三,张三回,找李四,也张三回)

3,在服务器上修改内核参数

server# vim /etc/sysctl.conf                # 添加以下参数
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth1.arp_ignore = 1
net.ipv4.conf.eth1.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2server# sysctl -p                           # 用此命令让其生效

说明: 这几个参数的目的就是把上面的一家人(张三又回应张三也回应李四)的情况变成了原本的arp情况(张三只能回张三,李四只能回李四)

4, 再次客户端测试

client# arp -d 10.1.1.5
client# arp -d 10.1.1.6

说明: arp -d可清除arp协议访问的mac地址缓存。建议清除再测试

最终结果:

客户端只能ping通10.1.1.5了, ping不通10.1.1.6了(这就对了,因为一台机器双网卡同网段会路由冲突

这个实验就验证了场景中的情况:

  • 服务器多网卡同网段,客户端从不同网卡IP访问进来,却都从第1个网卡回应
  • 如果修改内核参数,则客户端只能访问第一张网卡的服务

场景解决方案

如果以上场景已经发生,如何解决?

  • 将多网卡改成不同网段IP(这样做可能项目要修改的工作量很大,很多配置要重配)
  • 通过策略路由来解决(不需要修改IP,只需要添加路由表将多个网卡流量分开)

策略路由的做法也非常简单,在服务器上做以下操作

server# echo 100 server1 >> /etc/iproute2/rt_tables
server# echo 200 server2 >> /etc/iproute2/rt_tables server# ip rule add from 10.1.1.5 table server1
server# ip rule add from 10.1.1.6 table server2server# ip route add default via 10.1.1.5 table server1
server# ip route add default via 10.1.1.6 table server2

说明:

  • 增加了server1与server2两个路由表
  • 两个路由表里的规则为访问10.1.1.5将由10.1.1.5回应,访问10.1.1.6将由10.1.1.6回应

场景总结与经验值

此解决方案主要是用到了linux上的多路由表功能。

工作中物理服务器与虚拟机有多网卡时都不要犯这种多网卡同网段的错误。

如果真的需要用到多服务隔离的话,可考虑虚拟化或容器化环境。

服务器多网卡多路由策略相关推荐

  1. 一台服务器装两个sql server 如何访问吗_服务器多网卡多路由策略

    场景背景与需求 某公司新买一台服务器, 服务器资源(cpu,内存,硬盘)比较多,并且有多个网卡. 运维工程师为了节省资源,在服务器上搭建多个服务,希望通过多个网卡实现流量分流. 但由于运维工程师对网络 ...

  2. windows 服务器多网卡设置路由

    1.在开始菜单->运行->输入cmd命令,进入MS-DOS窗口. 2.使用ipconfig 命令查询本机电脑设置的IP地址 3.使用route指令设置网络走向 route add -p 0 ...

  3. linux 添加路由_linux网络知识:路由策略(ip rule,ip route)

    一,路由策略(使用ip rule命令操作路由策略数据库) 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小,应用或IP源地址等属性来选择转发路 ...

  4. linux网络知识:路由策略(ip rule,ip route)

    目录 一,路由策略(使用ip rule命令操作路由策略数据库) 二,路由表(使用ip route命令操作静态路由表) 三, ip rule,ip route,iptables 三者之间的关系 一,路由 ...

  5. oracle ip策略,ip rule -- 路由策略数据库管理命令

    ip rule -- 路由策略数据库管理命令 . 8.ip rule -- 路由策略数据库管理命令 8.1.缩写 rule.ru 8.2.对象 路由策略数据库的规则用于控制选择路由的算法. Inter ...

  6. Serverless 应用引擎产品的流量负载均衡和路由策略配置实践

    流量管理从面向实例到面向应用 在 Serverless 场景下,由于弹性能力以及底层计算实例易变的特性,后端应用实例需要频繁上下线,传统的 ECS 场景下的负载均衡管理方式不再适用. SAE 产品提供 ...

  7. 从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践

    作者 | 落语 阿里云云原生技术团队 本文整理自<Serverless 技术公开课>,"Serverless"公众号后台回复"入门",获取 Serv ...

  8. 下pg负载均衡_SAE 场景下,应用流量的负载均衡及路由策略配置实践

    流量管理从面向实例到面向应用 在 Serverless 场景下,由于弹性能力以及底层计算实例易变的特性,后端应用实例需要频繁上下线,传统的 ECS 场景下的负载均衡管理方式不再适用. SAE 产品提供 ...

  9. win2012双网卡做路由

    网段1  192.168.0.0 网段2  192.168.1.0 2012服务器 网卡1 192.168.0.1/24  网卡2 192.168.1.1/24 网段1内的客户端ip: 192.168 ...

最新文章

  1. 综述:解决目标检测中的样本不均衡问题
  2. 搞笑向, 面向IE8的webworker-ployfill
  3. vue函数如何调用其他函数?_好程序员Python教程系列之递归函数与匿名函数调用...
  4. vue.config和editorconfig
  5. Hibernate学习——建立一个简单的Hibernate项目
  6. 一个用于伪造IP地址进行爆破的BurpSuite插件:BurpFakeIP
  7. 前端学习(1694):前端系列javascript之变量计算
  8. c语言数组冒泡排序程序的解释,c语言指针数组冒泡排序代码
  9. python的web技术宅
  10. 力扣344. 反转字符串(JavaScript)
  11. Python基础学习2--字符串
  12. PowerDesigner一些小技巧
  13. UNIX网络编程卷一 学习笔记 第一章 简介
  14. 使用IAR下载烧录调试
  15. 锁定计算机过久电脑自动关机,如何设置电脑在某个或一段时间后自动关机
  16. 《Learning for Disparity Estimation through Feature Constancy》
  17. Linux管道命令grep 和 wc
  18. 【Vulnhub】之JIS-CTF-VulnUpload-CTF01
  19. Oracle update 更新数据语法和写法
  20. 毗邻目录算法与左右值无限分支算法的结合

热门文章

  1. 冯·诺依曼体系结构总结
  2. 模具怎么报价?快速报价的计算方法
  3. 基于OpenCv的视频流处理方法
  4. 720phi10p 和 720p有什么区别_红米note9和红米9哪个好_红米note9和红米9的区别
  5. 秀动抢票教程,JS逆向分析与学习
  6. DPDK17.05 第一次试用心得与问题记录
  7. 武田收到CHMP肯定意见,推荐ALUNBRIG(R) (brigatinib)用于治疗既往用过克唑替尼的ALK+非小细胞肺癌患者
  8. css三实现ui,纯CSS实现常见的UI效果
  9. 支付宝第三方支付接口java调用详细文档
  10. Win10 内置 OpenSSH 使用密钥连不上的问题解决