从一个ISP移至另一个ISP而不改变IP的方案
某客户从一个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的方案的更多相关文章
- js移除最后一个字符,js替换字符串的连接符号,js移除最后一个分隔符号
js移除最后一个字符 js移除最后一个分隔符号 js替换字符串的连接符号 >>>>>>>>>>>>>>>> ...
- 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题
在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...
- cxgrid回车移到下一个单元格
cxgrid回车移到下一个单元格 cxgrid回车移到下一个单元格 作用:表格式录入全键盘操作. 设置cxgrid1Dbtableview1.optionsBehavior.goToNextCel ...
- SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组
SQLSERVER将数据移到另一个文件组之后清空文件组并删除文件组 之前写过一篇文章:SQLSERVER将一个文件组的数据移动到另一个文件组 每个物理文件(数据文件)对应一个文件组的情况(一对一) 如 ...
- 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件
由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...
- jq移除最后一个class的值
$(".his_pg_jl li").on("click",function() {//挂一个点击事件 $(this).addClass('back_img') ...
- jq select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性
select change下拉框选项变化判断选中值,添加(attr)或移除(removeAttr)一个或多个属性 $("#IsRecommend").change(function ...
- pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值.
- Java实现点击一个控件实现删除一个控件的方法
最近在做项目的时候需要处理点击一个JLabel实现删除这一个JLabel的功能.最近折磨了一点时间,查了一下API.找到2个方法可以实现这个功能. remove public void remove( ...
随机推荐
- Struts 404 The requested resource is not available
出现这种错误一般是struts.xml配置错误,重点针对<action> 的class属性的全名 因为struts感觉应该是先加载所有的配置文件,如果配置文件有错误的话,所有的资源就都无效 ...
- paper 99:CV界的明星人物经典介绍
CV人物1:Jianbo Shi史建波毕业于UC Berkeley,导师是Jitendra Malik.其最有影响力的研究成果:图像分割.其于2000年在PAMI上多人合作发表”Nor ...
- android 多点
引用:http://blog.163.com/fenglang_2006/blog/static/13366231820108205274325/ 第一章摘要 在Linux内核支持的基础上,Andro ...
- PHP中fopen,file_get_contents,curl函数的区别
PHP中fopen,file_get_contents,curl函数的区别 1.fopen/file_get_contents每次请求都做DNS查询,并不对DNS的信息进行缓存,而curl会对DNS的 ...
- 白话LINQ系列1---什么是LINQ?
一.本系列目标 1.理解LINQ: 2.能写得复杂的LINQ语句(比如:动态查询): 3.理解表达式树及相关概念: 4.熟练运用LINQ写出优美的代码(希望一起努力,最终达到): 二.LINQ为何物? ...
- 优化Myeclipse10 Building Workspace速度慢等问题
今天把ext3.0部署到web project很慢很慢,查了一下,这个当笔记.转自http://blog.163.com/jong_cai/blog/static/870280452013111781 ...
- [Effective JavaScript 笔记]第7章:并发--个人总结
前言 这一章的内容学到了事件队列和异步的API.js只是运行在其他应用程序的脚本语言.js即依赖于应用程序,也独立与应用程序.可以使它可以在多平台,多种环境上运行.ECMAScript标准中没有关于并 ...
- python-操作csv文件
import csv lv,er=[],[] #读 with open('date.csv') as mycsv: reader=csv.DictReader(mycsv) for row in re ...
- Linux之netstat命令详解
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...
- JAVA基础知识之JDBC——离线RowSet
离线RowSet 如果直接使用ResultSet, 程序在得到ResultSet记录之后需要立即使用,否则一旦关闭Connection就不再可用,要解决这种情况要么将ResultSet的结果转换成Ja ...