上周帮人解决了一个问题,这个问题绝对是非典型性的,采用了非常规的方法。虽然最终的方案非常不符合常规,非常不通用,充满了各种藏得很深的技巧或者说是trick,但是这个问题却是一个学习Linux路由的绝好机会。事后想了很久,还是决定分享出来,本文并不主张使用奇技淫巧去解决通用问题,但是本文主张遇到问题后至少要有折腾到该领域的原子级别。
  
    清晨马上就要天亮,听着窗外小鸟儿在歌唱,我把问题重新整理,形成一个新的问题。先看需求,以下是一个拓扑:
  
  这里写图片描述
  
  现在的需求是:
  
  hostA和hostB之间双向互联互通!
  
  这难道不是把Router做成Bridge(这是Linux的术语,正确的说法应该是switch)或者为hostA到Router之间另开辟一个IP地址段么??为什么没有这么做本文不深究也不会暴露,现在的问题是,就上面这个拓扑,怎么能通吧。
  
    诚然,如果你已经很熟悉Linux路由的方方面面,那么下面的内容你早就耳熟能详,但我相信大部分做不到。另外,本文将体现一种解决问题的方法和精神,即见招拆招。画出流程图或者时序图,哪里有阻碍,就清除哪里。
  
  为了不扯过多哲学上的论述,避免进入形而上的争辩,我先把一个显然的配置配在Router上,即Router到hostA的路由:
  
  ip route add 192.168.0.1/32 dev eth1 src 192.168.0.2
  
  1
  
  毕竟eth1连IP地址都没有,我们只能把经由它的数据包强行推给它,不然还能怎么做呢?携带src参数是因为为了让数据包到达hostA的时候,让hostA觉得这个数据包看上去是从同一网段来的,即经由了Link路由到达的本机,而不是被强行扭送到了本机。仅此,事先说明。
  
    然后呢?
  
  然后我们来分两种情况看一下到达hostB的192.168.0.3的数据包如何从hostA出去。
  
    首先,第一种方法是一个显而易见的方法,即通过链路层发现的路由出去,但因为这个太显然了,因此我准备先介绍第二种方法,即通过默认路由让Router中转到达hostB。
  
    为了去dig一下第二种方法,我决定对hostA进行如下配置:
  
  ip addr add dev eth0 192.168.0.1/24
  
  ip route add 0.0.0.0/0 via 192.168.0.2
  
  # 删除链路层路由,避免直接ARP同网段目标IP
  
  ip route del 192.168.0.0/24
  
  1
  
  2
  
  3
  
  4
  
  或者更加trick一点:
  
  ip addr add dev eth0 192.168.0.1/30
  
  # 占用.3广播,你要亲自试试 :-)
  
  ...
  
  1
  
  2
  
  3
  
  假设我采用了第一个配置,那么接下来事情就要慢慢起变化了。
  
    我准备采用时序图来描述这一切是为什么发生的,首先我要将hostA,hostB以及Router的各个网卡抽象成各种Object,同时Router的路由逻辑我也抽象成了一个单独的Object,这样时序图就可以更好地演绎了。另外的假设是,我假定在通信开始时,所有涉事设备的所有ARP表都是空的。下面开始演绎:
  
  这里写图片描述
  
  一切都非常流转,只要注意红色部分就好了,这部分是唯一被拆招的地方,其它的都是例行公事而已。然而就这个地方你要是不懂,整个链路就不会通,道理就这么简单。
  
    好了,接下来看看从hostB反过来ping hostA时一路上会发生什么,声明一点,我把时序图左右颠倒反过来画了,这是为了和上面的情况好做对比:
  
  这里写图片描述
  
  也不难,也很容易,流程清晰了就都清晰了。不是吗?
  
    下面该介绍第二种情况了,即hostA直接广播的情况,我们知道,这只是影响了从hostA到hostB的流程,而对反向的hostB到hostA的流程丝毫没有任何影响,因此在这种情况下,只有一幅时序图。
  
    先给出hostA的配置:
  
  ip addr add dev eth0 192.168.0.1/24
  
  1
  
  仅此而已,如此一来,当在hostA上发起到达hostB的ping时,路由逻辑会首选自动生成的链路层路由,落实到链路层,即直接请求hostB的MAC,而该请求会被Router的eth1首先捕获到,它该怎么做呢?请看图:
  
  这里写图片描述
  
  好了,到底位置,问题全部解决。总结下来几乎什么都没说,因为这个问题确实是没有难度但很诡异,属于能让人走火入魔的那种,不管怎么说吧,本文的目标是想介绍以下的协议栈参数:
  
  arp_announce
  
  arp_ignore
  
  proxy_arp
  
  ip_forward
  
  以及以下的命令:
  
  arptables
  
  最终总结下来就是两种方式:
  
  方法1:使用Router默认路由中转
  
  #### hostA
  
  ip addr add dev eth0 192.168.0.1/24
  
  ip route add 0.0.0.0/0www.dongfan178.com via 192.168.0.2
  
  # 删除链路层路由,避免直接ARP同网段目标IP
  
  ip route del 192.168.0.0/24
  
  #### Router
  
  ip route add 192.168.0.1/32 dev eth1 src 192.168.0.2
  
  sysctl -w net.ipv4.conf.eth0.proxy_arp=1
  
  sysctl -w net.ipv4.conf.eth1.proxy_arp=1
  
  sysctl -w net.ipv4.ip_forward=1
  
  arptables -A OUTPUT -o eth1 -j mangle --mangle-ip-s 192.168.0.2
  
  方法2:默认路由
  
  #### hostA
  
  ip addr add dev eth0 192.168.0.1/24
  
  ip route add 0.0.0.0/0 via www.dashuju178.com 192.168.0.2
  
  ip route del 192.168.0.0/24
  
  #### Router:
  
  ip route add 192.168.0.1/32 dev eth1 src 192.168.0.2
  
  sysctl -w net.ipv4.conf.eth0.proxy_arp=1
  
  sysctl -w net.ipv4.conf.eth1.arp_ignore=3
  
  sysctl -w net.ipv4.ip_forward=1
  
  arptables -A OUTPUT -o eth1 -j www.tygj178.com mangle --mangle-ip-s 192.168.0.2

一个非典型的Linux路由配置方案的更多相关文章

  1. linux路由配置负载均衡

    负载平衡ip route add default scope global nexthop via XX.XX.XX.XX dev eth0 weight 1 nexthop via XX.XX.XX ...

  2. 路由器的路由配置命令汇总(win和linux系统)

    路由器/Linux主机/win下主机的路由配置汇总 2009-07-16 17:43:15 分类: 系统运维 工作时总是要在这三个个体中配来配去,所以为了方便,汇总了.   win下:   使用 Ro ...

  3. 在 Linux 上配置一个 syslog 服务器

    syslog服务器可以用作一个网络中的日志监控中心,所有能够通过网络来发送日志的设施(包含了Linux或Windows服务器,路由器,交换机以及其他主机)都可以把日志发送给它. 通过设置一个syslo ...

  4. Linux和Windows路由配置

    Linux和Windows路由配置 一.配置路由 1-       原则上一台主机只能有一条缺省路由.如果一台主机上有多个网段的话,请配置能够上网的那个网段的网关为缺省路由 Linux配置缺省路由: ...

  5. 原创:路由配置实践 两个局域网主机的互连 VM linux

    又开始齐天大圣讲课的时间了 我相信网络是每个运维人员和开发人员必不可少要接触的   今天我们要讲的是在VM虚拟机中 我们三台虚拟机划分两个局域网 实现不同局域网的互联 也就是下面图中的AC通过B主机的 ...

  6. Linux系统多网卡环境下的路由配置

    Linux下路由配置命令 1. 添加主机路由 route add -host 192.168.1.11 dev eth0 route add -host 192.168.1.12 gw 192.168 ...

  7. Linux下路由配置梳理

    在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:---------------------------------------------------------- ...

  8. linux 下路由配置

    转自 https://www.cnblogs.com/kevingrace/p/6490627.html 在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:----- ...

  9. Linux下路由配置梳理(转)

    转自:https://www.cnblogs.com/kevingrace/p/6490627.html 在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:----- ...

随机推荐

  1. linux下ftp连接:530 Permission denied

    问题如下:[root@localhost apps]# ftp 10.xxx.xxx.xxxConnected to 10.xxx.xxx.xxx220 (vsFTPd 2.0.5)530 Pleas ...

  2. 从零开始的Python学习Episode 23——进程

    ---恢复内容开始--- 进程 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好用 ...

  3. TeamWork#3,Week5,Scrum Meeting 11.13

    最近我们根据之前发现的问题, 补充了相关知识,正在努力修复出现的问题,调整程序结构. 成员 已完成 待完成 彭林江 之前没有考虑到网站信息更新导致的程序可变性,正在调整爬虫程序结构 更换爬虫结构 郝倩 ...

  4. 20172319 2018.04.11-16 《Java程序设计教程》 第6周学习总结

    20172319 2018.04.11-16 <Java程序设计教程>第6周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错题 ...

  5. YQCB绩效表

    标准 队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 28 19 9 91 张晨阳 16 16 25 17 9 83 刘昭为 ...

  6. 第二阶段Sprint6

    昨天:设置统一保存路径为内存卡,实现可以选择播放已有的视频 今天:将“录制”及“保存”整合到一起,修复出现的Bug,使之能够正常运行. 遇到的问题:感觉调的摄像头录制的画面不好,这怎么办啊?

  7. bata3

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  8. sprintf函数 %6.2f

    %6.2f6表示数据表示至少6位,后面的.2表示小数点后保留两位 比如2342.123415用这个表示的话,结果就是2342.12如果不足六位就会在前面补空格超过六位的话正常显示 代码例子:int m ...

  9. Windows10(UWP)下的MEF

    前言 最近在帮一家知名外企开发Universal Windows Platform的相关应用,开发过程中不由感慨:项目分为两种,一种叫做前人栽树后人乘凉,一种叫做前人挖坑后人遭殃.不多说了,多说又要变 ...

  10. vue 选项卡(转载)

    !DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-e ...