一、需求说明
1、网络拓扑结构
2、环境说明
设备名称 |
IP地址信息 | 所属机房 |
***server | 外网eth0 10.0.0.3 VMnet3 内网eth1 192.168.1.4 VMnet4 网关 机房默认网关 |
上海 |
***client | 外网eth0 10.0.0.4 VMnet3 内网eth1 172.16.1.4 VMnet5 网关 机房默认网关 |
北京 |
client1 | eth0 192.168.1.5 VMnet4 网关 192.168.1.4 |
上海 |
client2 | eth0 172.16.1.5 VMnet5 网关 172.16.1.4 |
北京 |
3、实现目标
1、实现上海IDC机房和北京IDC机房内网机器互联,即我们可以通过client1 ping通client2
2、实现192.168.1.5和172.16.1.5互通
在实验前,请把四台虚拟机准备好,IP配置好,其中我设置的VMnet3、4、5都是仅主机模式,大家可以先把需要安装的软件安装好在修改为仅主机,因为仅主机模式不能上互联网,给电脑的VMnet4配置一个192.168.1.11,给VMnet5配置一个172.16.1.11,然后我们就可以通过连接四台虚拟机了。
3、环境搭建好之后我们检查一下联通性,正常情况下六个IP互通情况如下
192.168.1.5 | 192.168.1.4 | 10.0.0.3 | 10.0.0.4 | 172.16.1.4 | 172.16.1.5 | |
192.168.1.5 | √ | √ | √ | 〤 | 〤 | 〤 |
192.168.1.4 | √ | √ | √ | √ | 〤 | 〤 |
10.0.0.3 | √ | √ | √ | √ | 〤 | 〤 |
10.0.0.4 | 〤 | 〤 | √ | √ | √ | √ |
172.16.1.4 | 〤 | 〤 | √ | √ | √ | √ |
172.16.1.5 | 〤 | 〤 | 〤 | √ | √ | √ |
这里可以使用tcpdump抓包查看过程
4、把***Server、***Client的数据包转发打开,不然数据传输不过去
# echo 1 > /proc/sys/net/ipv4/ip_forward
这里可以使用tcpdump抓包查看过程
二、Open*** Server的安装配置
1、Open***下载
通过官网下载最新版本的open***。http://open***.net/,有可能因为国家防火墙的原因,可能无法访问,我这里提供的下载地址是https://swupdate.open***.org/community/releases/open***-2.3.7.tar.gz
2、Open*** Server安装
我的系统环境是CentOS 6.3 32位最小化安装,我的上一篇文章是使用的yum安装,http://wangzan18.blog.51cto.com/8021085/1673778,使用的是epel仓库,我还是推荐大家使用yum安装,简单方便,open***依赖一些软件,openssl提供数据加密,lzo提供数据压缩,我们都可以使用yum进行安装,这里我的open***使用源码编译安装,一些依赖的软件包大家请提前下载好。
#安装依赖的软件包 yum install openssl-devel lzo-devel pam-devel gcc wget -y #下载open***软件 wget https://swupdate.open***.org/community/releases/open***-2.3.7.tar.gz #编译安装open*** tar xf open***-2.3.7.tar.gz cd open***-2.3.7 ./configure --prefix=/usr/local/open*** --sysconfdir=/etc/open***
如果出现以上的内容,证明我们配置好了,下面我们就进行编译安装
make make install tree /usr/local/open***/
安装好的目录结构大概如下,不同版本可能有所不同
下面我们添加open***的配置文件
mkdir /etc/open*** cp sample/sample-config-files/server.conf /etc/open***/
因为我们这个版本没有提供密钥生成更具,但是他给我们提供了默认的证书,在open***-2.3.7/sample/sample-keys目录下面
3、我们这里现在密钥生成工具
#下载密钥生成工具 wget https://github.com/Open***/easy-rsa/archive/release/2.x.zip unzip 2.x.zip #复制我们的CA到open***配置目录下 cp -ra easy-rsa-release-2.x/easy-rsa/2.0 /etc/open***/easy-rsa cd /etc/open***/easy-rsa
根据脚本的名字我们可以猜测到工具的功能,首先我们先修改一下vars这个文件,修改成我们相关的内容。
# vim vars
# source vars
# ./buile-ca
创建服务器证书
# ./build-key-server server
创建客户端证书
# ./build-key client
创建Diffie Hellman参数
# ./build-dh
这一步需要的时间很长,大家可以把vars文件里面的export KEY_SIZE=2048 改为1024
生产的证书全部放在easy-rsa目录下面的keys里面
4、Open*** Server的配置
我们查看一下配置文件的内容,具体每个参数的含义配置文件讲解的很详细,我这里不再陈述,为了看起来简便,我这里把注释删掉,参数不是很多,我们对其修改成我们需要的,修改后我这里是这样的。
grep -vE '^#|^;|^$' /etc/open***/server.conf
--client-config-dir /etc/open***/ccd/
通过该选项为存放客户端定制的配置文件指定一个目录,在一个***用户通过客户端验证之后,Open***将会查找这个目录,通过这些文件可以使用--ifconfig-push来指定一个固定的客户端IP地址,也可以使用--iroute指定一个客户端自己拥有的子网。
--push "route 192.168.1.0 255.255.255.0"
这项指令是把***Server后端的子网推送给***Client,要不Client不知道如何到达这个子网。
--route 172.16.1.0 255.255.255.0
这项指令是给***Server添加一条路由,要不***Server不知道如何到达172.16.1.0网段。
--server 10.8.0.0 255.255.255.0
这项指令是给***Client分配IP地址。
cat /etc/open***/ccd/client
--iroute 172.16.1.0 255.255.255.0
为特定的客户端生产内部路由。
--ifconfig-push 10.8.0.4 10.8.0.5
这条指令就是给特定客户端指定分配的IP的,可以不使用,除非客户端比较多,你有必要进行区分。
到此服务端的配置告一段落
三、Open*** Client的安装配置
1、客户端的安装
客户端的安装请安装服务端的安装,过程一样
2、客户端的配置
下面我把我的客户端配置文件发送一下,首先我们需要把服务器端的证书文件拷贝过来。
# cat /etc/open***/client.conf
客户端的配置比较简单,这里不在进行讲解。
四、服务的启动及测试
1、首先我们先查看一下***服务端和客户端的路由信息
***服务端
***客户端
2、***服务端及客户端的启动
***服务端启动
/usr/local/open***/sbin/open*** /etc/open***/server.conf & cat /var/log/open***/open***.log
***客户端启动
/usr/local/open***/sbin/open*** /etc/open***/client.conf
3、***服务端及客户端的启动后的路由信息
***服务端
我们可以看到增加了一个虚拟网卡,增加了几条路由。
Open***默认使用的net30模式,10.8.0.1是获取的一个实际IP,接受ping,10.8.0.2是Open***内部的一个虚拟IP地址,它被用作末端路由,对于这个地址,Open***不会接受ping。
我们可以在启动的时候增加一个参数--topology subnet让Open***工作在subnet模式下,使用此模式要去掉前面的选项--ifconfig-push,不然客户端会连接失败,具体net30和subnet模式的区别,大家可以参考官网文档(man open*** ,doc)或者参考本文附录。
# /usr/local/open***/sbin/open*** --config /etc/open***/server.conf --topology subnet
***客户端
现在***服务端和客户端都有到达对方后端子网的路由,我测试了一下,他们到对方后端子网的网络都已经联通了,我这里就不在贴图了。
这里可以使用tcpdump抓包查看过程
五、项目需求实现
1、我们在client1测试
结果显示client1可以ping通client2。
2、在client2上面测试
我们可以看到client2和client1也是互通的,由此证明项目成功。
六、项目改进
1、不修改客户机默认网关
我们知道,上面的环境是所有的客户机网关都指向了***服务器,在很多环境场合是不允许我们修改内网客户机的网关,数量少还可以,数量多的话那就是很大的工作,并且可能会影响服务的运行,而且所有的流量都经过***也是对***服务器很大的压力。
假设所有的客户机都是现有的默认网关,我们实现的目的就是他们到达对方子网的时候经过***服务器,而访问外网还是使用自己默认的网关,其实很简单,我们只需要在每个客户机上面添加上到对方子网的路由。
2、如何添加路由
对于client1,我是这样操作,我们删掉现在的默认路由,可以不设定
route del default gw 192.168.1.4
ping 172.16.1.5 connect: Network is unreachable
这时候我们是无法ping通对方子网的,下面我们添加一条路由
route add -net 172.16.1.0/24 gw 192.168.1.4
client2也是如此操作
route del default gw 172.16.1.4 route add -net 192.168.1.0/24 gw 172.16.1.4
3、如何更加了解数据传输过程
Linux提供一个数据抓包的命令tcpdump,如果过程中哪里有问题,数据就是传输不过去,我们可以通过抓包工具一步一步抓取,我这里简单介绍一个例子,比如我们在client1 ping client2不通,我们首先在***server上面转包看看数据吧流向,然后在***client上面抓取,然后在client2上面抓取,看看数据吧是否有回包,如果没有回包很大可能的情况就是回包路由的问题。
七、附录
在--topology mode选项中,mode有三种取值,即net30、subnet和p2p。
当运行在--dev tun模式下时,可以通过--topology mode选项来配置虚拟地址的拓扑结构。而对于--dev tap而言,该选项没有任何意义,因为在--dev tap模式下,总是使用子网拓扑。
1、net30
Open***默认的子网掩码是/30,也就是255.255.225.252。在这样的情况下,只有两个地址可以使用,一个给服务端,一个给客户端,这样地址是很浪费的。
在Open***的2.0版本中,Open***能通过虚拟一个TUN虚拟接口处理多个客户端,要处理这种技术,可以把服务器上看到的PtP连接看作是一个操作系统和Open***之间的连接,而在Open***内部还需要为每一个客户端创建另一个PtP。如何所有的O/S在TUN接口上真正的支持PtP连接,那么这将会是的Open***服务器仅使用一个IP地址,并且一个客户端也使用一个IP地址。
2、subnet
subnet通过配置TUN接口的本地IP地址和子网掩码来使用一个子网,而不是点对点的拓扑结构,类似于使用--dev tap和以太网桥模式的拓扑结构。这种模式为每个客户端分配单个IP地址。
3、p2p
p2p模式使用点对点拓扑,仅适用于Windows系统下,现在已经不再赞成使用。
如有什么不同意见欢迎和我交流,谢谢!