某客户从一个ISP_A移到了另一个ISP_B。但是,其WEB服务器由于之前对外公布的是IP地址,且无DNS,因此,要求该服务器搬至ISP_B后,用户依然可以访问原来的IP地址,求方案。

假设:ISP_A与ISP_B的两台路由器都可控;原服务器的地址为2.2.2.2/24

原理:在ISP_A(R2)与ISP_B(R1)两台路由器之间做一个GRE的tunnel。当用户访问服务器时,到达ISP_A路由器,在这里,做一条至服务器2.2.2.2的主机路由,指向tunnel的另一端(ISP_B)。数据包通过tunnel到达ISP_B,本机有2.2.2.0段的直连路由,数据包到达2.2.2.2。服务器响应,数据包发送至默认网关ISP_B, 此时数据包就从ISP_B出去了,也就是说数据包来回走的路是不一样的,这样就少了一层GRE封装,理论上讲效率会高。如果想来回都走ISP_A路由,则需要在ISP_B路由器连接服务器的那个端口上启用PBR,将所有源地址是2.2.2.2的包,都指向ISP_A的tunnel上去。

该方案看似复杂,实际实现非常简单,而且是在IP路由层面实现,不挑设备。

实现该功能最简单的办法是NAT就更好了,但目前想不出NAT(在一个端口上实现inside,outside)的实现方法。

测试:

采用dynamips 0.2.8 for linux完成测试(CentOS 6.5, 0.2.8版本总是找libpcap0.9.4库,即使安装上该库). 拓扑图如下。

测试用命令:

R9:
dynamips --idle-pc=0x606d0ef0 -P 7200 -p 1:PA-4E unzip-c7200-is-mz.122-37.bin \
-i 9 \
-s 1:1:udp:13321:127.0.0.1:13322 \
-s 1:2:udp:13311:127.0.0.1:13312
#e1/1 to R2 e1/1 #e1/2 to R1 e1/1

R2:
dynamips --idle-pc=0x606d0ef0 -P 7200 -p 1:PA-4E unzip-c7200-is-mz.122-37.bin \
-i 2 \
-s 1:1:udp:13322:127.0.0.1:13321 \
-s 1:2:udp:22221:127.0.0.1:22222
#to R9 #to R22

R22:
dynamips --idle-pc=0x606d0ef0 -P 7200 -p 1:PA-4E unzip-c7200-is-mz.122-37.bin \
-i 22 \
-s 1:1:udp:22222:127.0.0.1:22221

R1:
dynamips --idle-pc=0x606d0ef0 -P 7200 -p 1:PA-4E unzip-c7200-is-mz.122-37.bin \
-i 1 \
-s 1:1:udp:13312:127.0.0.1:13311 \
-s 1:2:udp:12221:127.0.0.1:12222
#to R9 #to R22

R11:
dynamips --idle-pc=0x606d0ef0 -P 7200 -p 1:PA-4E unzip-c7200-is-mz.122-37.bin \
-i 11 \
-s 1:1:udp:12222:127.0.0.1:12221

配置:

R9:

interface Loopback0
ip address 9.9.9.9 255.255.255.255
!
interface Ethernet1/1
ip address 3.3.2.1 255.255.255.0
duplex half
!
interface Ethernet1/2
ip address 3.3.1.1 255.255.255.0
duplex half
!
ip route 2.2.2.0 255.255.255.0 3.3.2.2

R1:===========

interface Tunnel0
ip address 192.168.1.1 255.255.255.0
tunnel source 3.3.1.2
tunnel destination 3.3.2.2
!
interface Ethernet1/1
ip address 3.3.1.2 255.255.255.0
duplex half
!
interface Ethernet1/2
ip address 2.2.2.1 255.255.255.0
duplex half
!
ip route 0.0.0.0 0.0.0.0 3.3.1.1

R2:===========

interface Tunnel0
ip address 192.168.1.2 255.255.255.0
tunnel source 3.3.2.2
tunnel destination 3.3.1.2
!
interface Ethernet1/1
ip address 3.3.2.2 255.255.255.0
duplex half
!
interface Ethernet1/2
ip address 2.2.2.1 255.255.255.0
duplex half
!
ip route 0.0.0.0 0.0.0.0 3.3.2.1
ip route 2.2.2.2 255.255.255.255 Tunnel0

R11:=============

interface Ethernet1/1
  ip address 2.2.2.2 255.255.255.0

ip route 0.0.0.0 0.0.0.0 2.2.2.1

line vty 0 4

password 123

login
!
end

R22:=============

interface Ethernet1/1
ip address 2.2.2.3 255.255.255.0
duplex half
!
ip route 0.0.0.0 0.0.0.0 2.2.2.1

从一个ISP移至另一个ISP而不改变IP的方案的更多相关文章

  1. js移除最后一个字符,js替换字符串的连接符号,js移除最后一个分隔符号

    js移除最后一个字符 js移除最后一个分隔符号 js替换字符串的连接符号 >>>>>>>>>>>>>>>> ...

  2. 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题

    在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...

  3. cxgrid回车移到下一个单元格

    cxgrid回车移到下一个单元格   cxgrid回车移到下一个单元格 作用:表格式录入全键盘操作. 设置cxgrid1Dbtableview1.optionsBehavior.goToNextCel ...

  4. SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组

    SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组 之前写过一篇文章:SQLSERVER将一个文件组的数据移动到另一个文件组 每个物理文件(数据文件)对应一个文件组的情况(一对一) 如 ...

  5. 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件

    由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...

  6. jq移除最后一个class的值

    $(".his_pg_jl li").on("click",function() {//挂一个点击事件 $(this).addClass('back_img') ...

  7. jq select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性

    select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性 $("#IsRecommend").change(function ...

  8. pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

    pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值.

  9. Java实现点击一个控件实现删除一个控件的方法

    最近在做项目的时候需要处理点击一个JLabel实现删除这一个JLabel的功能.最近折磨了一点时间,查了一下API.找到2个方法可以实现这个功能. remove public void remove( ...

随机推荐

  1. Android APK反编译详解(附图)

    转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...

  2. Linux下执行的java命令重定向到文件中的方法

    在Linux下通常会执行如:java -version 的命令, 但是,命令只是打印到了屏幕上不能重定向到文件中或标准输出流中. 此时需要将错误输出流重定向到标准输出流中就可以得到了. 比如:java ...

  3. URL编码与解码

    在项目中碰到了ajax传来的参数,后台接收值乱码(如下图)的问题 在此记录一下 前台: 后台: 解决问题 为什么需要编码 怎样编码 实际出现的问题解决方法 1.为什么需要编码? URL 只能使用 AS ...

  4. PHP获取毫秒时间戳,利用microtime()函数

    PHP获取毫秒时间戳,利用microtime()函数 php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,借助此函数,可以很容易定义一个返回毫秒数的函数.php的毫秒是没有默认 ...

  5. adpatch options=hotpatch

    --no need to shutdown application and no need to enable maintenance mode adpatch options=hotpatch fi ...

  6. 谈谈对AOP的理解

    Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之 ...

  7. Just a Hook(HDU1698 线段树的简单应用)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Prob ...

  8. python 学习笔记十 rabbitmq(进阶篇)

    RabbitMQ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 ...

  9. jQuery 效果 —— 滑动

    jQuery 效果 -- 滑动 1.向下滑动元素 (1)使用slideDown()方法可以用于向下滑动元素 $("button").click(function(){ $(&quo ...

  10. HTML5/CSS3hack

    以下兼容技术我只测试了IE8+ Media Query 媒体查询 <script src="respond.min.js"></script> respon ...