Cisco路由基础:双线策略路由的三种实现方式总结+端口映射

这篇具有很好参考价值的文章主要介绍了Cisco路由基础:双线策略路由的三种实现方式总结+端口映射。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  参考了下网上关于电信+网通双线策略路由的帖子,并结合实际环境,将实现双线策略路由的几种方式总结如下,希望对有需要的朋友有所帮助,双线比单线要复杂多了,但把策略路由的原理弄明白了,就会发现其实并不难。

  服务器(网关):

  eth0 为LAN口,IP为 LAN_IP = 192.168.0.1

  eth1 为第一个WAN口,接电信线路,IP为 CTC_IP,网关为 CTC_GW

  eth2 为第二个WAN口,接网通线路,IP为 CNC_IP,网关为 CNC_GW

  内网网站

  HTTP_SERVER = 192.168.0.100

  内核打补丁

  如果你希望外网用户,不管通过哪个IP都可以访问到服务器或映射后的内网服务器,那么你就需要为内核打上补丁,

  补丁可以下载到,在 Static, Alternative Routes, Dead Gateway Detection, NAT 找和内核对应的 patch下载后为内核打上,然后在

  Networking  --->  Networking options  --->  IP: advanced router

  把 IP: equal cost multipath with caching support (EXPERIMENTAL) 前面的勾去掉

  如果你不想打补丁,或不想动内核,有个简单的办法来实现,即写一个脚本,每隔2秒钟刷新一次route cache

  while : ; do

  ip route flush cache

  sleep 2

  done

  双线策略的实现

  1. 静态路由方式(这种方式是最简单的)

  1) 设置默认路由,比如电信

  ip route replace default via 电信网关 dev eth1

  2) 设置策略路由,对另外一条线路

  ip route add 网通路由表1 via 网通网关 dev eth2 metric 1

  ip route add 网通路由表2 via 网通网关 dev eth2 metric 1

  3) 添加原路返回路由

  策略路由规则设置完后,还要为每条线路加入相应的 "原路返回路由"(从哪条线进来的数据,最终还是从这条线出去),不然就会出现这样的问题:

  电信用户通过网通的IP访问不到服务器,网通用户也不能通过电信IP访问到服务器

  ip route flush table 100

  ip route add default via 电信网关 dev eth1 src 电信IP table 100 prio 50

  ip rule add from 电信IP table 100

  ip route flush table 200

  ip route add default via 网通网关 dev eth2 src 网通IP table 200 prio 50

  ip rule add from 网通IP table 200

  出来加入本身的原路返回路由之外,还应加入局域网接口的,不然通过端口映射后,内网无法通过外网IP访问到映射后的服务器

  ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table 100

  ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table 200

  2. 策略路由方式

  为了方便,我们增加2个策略路由表,电信 => 100,网通 => 200,这样再添加规则时,就可以直接用自定义的名称来替代数字

  echo "100 ctc" 》  /etc/iproute2/rt_tables

  echo "200 cnc"  》 /etc/iproute2/rt_tables

  1)设置默认路由(电信)

  ip route replace default via 电信网关 dev eth1

  2)对网通进行基于目的地址的策略路由

  ip rule add to 网通路由表1 table cnc prio 100

  ip rule add to 网通路由表2 table cnc prio 100

  3)添加原路返回路由

  ip route flush table ctc

  ip route add default via 电信网关 dev eth1 src 电信IP table ctc

  ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table ctc

  ip rule add from 电信IP table ctc

  ip route flush table cnc

  ip route add default via 网通网关 dev eth2 src 网通IP table cnc

  ip route add 192.168.0.0/24 dev eth0  scope link  src 192.168.0.1 table ctc

  ip rule add from 网通IP table cnc

  3. iptables打标记+iproute2 fwmark

  1)使用 CONNMARK 对连接进行标记

  外网进来数据

  iptables -t mangle -A PREROUTING -i eth1 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100

  iptables -t mangle -A PREROUTING -i eth2 -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200

  转发出去的数据

  iptables -t mangle -A POSTROUTING -o eth1  -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x100

  iptables -t mangle -A POSTROUTING -o eth2  -m conntrack  --ctstate NEW  -j CONNMARK --set-mark 0x200

  局域网进来数据

  iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

  本地出去数据

  iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark

  2)在 IPROUTE2 中做基于 fwmark 的策略路由

  ip rule add fwmark 0x100 table ctc prio 40

  ip rule add fwmark 0x200 table cnc prio 40

  3)添加原路返回路由

  ip route add table ctc to $CTC_NET dev eth1  scope link

  ip route add table ctc to $CNC_NET dev eth2  scope link

  ip route add table ctc to 192.168.0.0/24 dev eth0  scope link

  ip route add default via 电信网关 dev eth1 table ctc

  ip route add table cnc to $CTC_NET dev eth1 scope link

  ip route add table cnc to $CNC_NET dev eth2  scope link

  ip route add table cnc to 192.168.0.0/24 dev eth0  scope link

  ip route add default via 网通网关 dev eth2 table cnc

  Iptables/NAT 规则

  /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域网网段 -j SNAT --to-source 电信外网IP

  /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域网网段 -j SNAT --to-source 网通外网IP

  如果外网IP是动态的,可以用 MASQUERADE

  /sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域网网段 -j MASQUERADE

  /sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域网网段 -j MASQUERADE

  端口映射

  端口映射可以分别针对两条线做端口映射

  比如 LAN口的IP为 192.168.0.1,内网服务器IP为 192.168.0.100,映射端口为 80

  iptables -t nat -A PREROUTING -p tcp --dport 80 -d 电信IP -j DNAT --to-destination 192.168.0.100

  iptables -t nat -A PREROUTING -p tcp --dport 80 -d 网通IP -j DNAT --to-destination 192.168.0.100

  端口回流(内网可以通过外网IP访问映射后的服务器)

  iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 --dport 80 -d 192.168.0.100 -j SNAT --to-source 192.168.0.1

  [注]:上述规则应放到 NAT 规则之前

  常见问题(FAQ)

  1. 不能实现 "交叉访问" 到服务器

  即:会出现外网电信用户只能通过电信IP访问到服务器,而通过网通IP访问不了;

  同理,网通用户只能通过网通IP访问到服务器,而通过电信IP却访问不了。也就是只是单纯地解决了 "内网访问哪里,走哪条线路"

  答:电信用户通过网通IP访问时,数据到达了服务器上,本应该从网通的线路返回的,但最终却从电信的线路出去了,这样的数据会被上层网关丢弃。

  此时需要加入 "原路返回路由" ,实现 "从哪条线来的,依然从哪条线返回".

  2. 外网用户不能交叉访问映射后的内网服务器

  即:电信用户可以通过电信IP访问到内网服务器,网通用户可以通过网通IP访问到内网服务器

  但是:网通用户不能通过电信IP访问到内网服务器,电信用户也不能网通IP访问到内网服务器

  答:路由缓存引起的,给内核打补丁,或每隔 2 秒左右刷新路由缓存

  3. 内网用户不能通过外网IP访问内网服务器

  答:a. 没有做SNAT(端口回流),加入回流规则即可

  b. 加入 "原路返回路由" 时,没有将局域网的路由加入进去

  深入探讨

  1. 上述三种方式哪一种效率最高? 如何来评估 ?

  2. 双线失效保护,即掉线自动切换的实现(定时探测每条线路的连通性)

  3. 通过VPN方式实现虚拟双线,即传说中的"借线"

  4. 内网访问指定外网IP时走指定线路,指定内网IP上网走指定线路

  以上就是关于双线策略路由的三种实现方式总结和端口映射的一些常见问题,谢谢阅读,希望能帮到大家,请继续关注yii666,我们会努力分享更多优秀的文章。文章来源地址https://www.toymoban.com/news/detail-466915.html

到了这里,关于Cisco路由基础:双线策略路由的三种实现方式总结+端口映射的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spark基础】-- RDD 转 Dataframe 的三种方式

    目录 一、环境说明 二、RDD 转 Dataframe 的方法 1、通过 StructType 创建 Dataframe(强烈推荐使用这种方法)

    2024年01月19日
    浏览(34)
  • 前端单点登录实现的三种方式

    1.同源不跨域 使用document.cookie或者localStorage可以直接存取 2.跨域主域名相同 可以使用cookie-js插件存储cookie,在设置cookie是添加domain参数,例如 Cookies.set(\\\'token\\\', 值, { expires: 60, path: \\\'\\\', domain: \\\'taobao.com\\\' }) 只有主域名相同,浏览器在访问时才会携带对应的 cookie 3.跨域 使用iframe内嵌

    2024年04月27日
    浏览(36)
  • Docker 实现挂载的三种方式

    容器中运行的应用,有可能会产生数据,如果将数据直接存储到容器中,如果删除容器时,容器中的数据会一起被删除,例如: 如果运行的是数据库容器,数据库容器直接保存的数据文件,删除容器时,容易导致数据丢失 为了防止数据丢失,可以把数据保存到宿主机上,这样有便于容器之间

    2024年01月23日
    浏览(49)
  • SpringBoot实现分页的三种方式

    一 自己封装Page对象实现 博客链接 二 使用sql实现分页 2.1 场景分析 前段传递给给后台什么参数? 当前页码 currentPage 每页显示条数 pageSize 后台给前端返回什么数据? 当前页数据 List 总记录数 totalCount 2.2 前段代码 2.3 后端代码 PageBean mapper service impl controller 三 使用PageHelper插件

    2024年02月10日
    浏览(51)
  • Redis 实现限流的三种方式

    面对越来越多的高并发场景,限流显示的尤为重要。 当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式。Redis不仅仅是可以做限流,还可以做数据统计,附近的人等功能,这些可能会后续写到。 我们在使用

    2024年02月11日
    浏览(44)
  • Java 多线程实现的三种方式

    Java 多线程实现方式主要有三种:继承 Thread 类、实现 Runnable 接口、使用 ExecutorService、Callable、Future 实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 1、继承 Thread 类实现多线程 继承 Thread 类的方法尽管被我列为一种多线程

    2023年04月27日
    浏览(54)
  • Java 实现多线程的三种方式

    1、三种方法的介绍和比较 1、1三种方式得介绍 1、继承Thread类 2、实现Runnable接口 3、实现Callable接口 1、2三种方法的介绍和比较 1、2、1、实现Runnable接口相比继承Thread类有如下优势 1、增强程序的健壮性,将业务逻辑与线程调度分离 2、线程池只能放入实现Runable或Callable类线程

    2024年02月02日
    浏览(47)
  • Redis实现限流的三种方式

    所谓固定窗口限流即时间窗口的起始和结束时间是固定的,在固定时间段内允许要求的请求数量访问,超过则拒绝;当固定时间段结束后,再重新开始下一个时间段进行计数。 我们可以根据当前的时间,以分钟为时间段,每分钟都生成一个key,用来inc,当达到请求数量就返回

    2024年02月11日
    浏览(45)
  • vue深拷贝的三种实现方式

    vue深拷贝的三种实现方式:1、通过递归方式实现深拷贝;2、JSON.parse(JSON.stringify(obj));3、jQuery的extend方法实现深拷贝。 深拷贝: 拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据; 浅拷贝: 拷贝的是引用类型的指针,副本和原数组或对象指向同一个内

    2024年01月25日
    浏览(49)
  • RabbitMQ 简单实现创建队列的三种方式

    //1. 手动创建,需在RabbitMQ中手动创建myQueue1 队列,否则报错 @RabbitListener(queues = “myQueue1”) public void process1(String message){ log.info(“MqReceiver1: {}”, message); } //2. 自动创建队列 @RabbitListener(queuesToDeclare = @Queue(“myQueue2”)) public void process2(String message){ log.info(“MqReceiver2: {}”, messa

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包