事情是这个样子的,国内客户在国外有服务器,直接连过去会很慢,但是从国内某地连过去就很快。所以,我们就想能不能在国内某地做个中转,于是就有了这次试验。考虑不周之处,请大家不吝指教!(没想到图片不支持直接粘贴,这次就不上图了,下次也不截图了:)【缺图将近一年,已补上。呵呵!】)


实验目的:当访问A地区的内网30.30.30.200时转到B地区的内网40.40.40.200

实验要求:1、使用×××环境; 2、***不能架设在网关上;3、40.40.40.200上不得做任何更改;4、网关上不用添加路由条目
分析:基于上述需求:
1、×××架构设计
软件使用Open×××.可以将A地区服务器GW1 配置为××× Server 模式,B地区服务器GW2使用××× Client模式。建立一条点对点(Point-to-Point)的SSL ×××安全隧道——“GW1 <----> GW2”,GW1、GW2的公网IP地址分别使用10.10.10.10和20.20.20.20来模拟。其他网络接口地址设置如下:
GW1、GW2 的内网接口IP 地址分别为30.30.30.30、40.40.40.40;
GW1<----> GW2 隧道:分别使用虚拟IP 地址172.16.30.1/24、172.16.30.2/24。
2、在A地区GW1上使用iptables对访问30.30.30.200的数据做DNAT;

3、在B地区GW2上使用iptables对到达的数据源地址30.30.30.20做SNAT

wKiom1MBn--RJ-NaAAIt6GNO2_g249.jpg

图 1
一、 ×××环境搭建
   1、××× Server操作如下
       a、配置ip地址、路由信息:
           [root@localhost ~]# ip addr add 10.10.10.10/24 dev eth0
           [root@localhost ~]# ip addr add 30.30.30.30/24 dev eth0
           [root@localhost ~]# ip route 20.20.20.0/24 via 10.10.10.1
       b、下载软件包
           [root@localhost ~]# mkidr –p /opt/software
           [root@localhost ~]# wget –P /opt/software http://swupdate.open***.org/community/releases/open***-2.2.2.tar.gz
           [root@localhost ~]# wget –P /opt/software/ http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
       c、编译、安装
           [root@localhost ~]# cd /opt/software
           [root@localhost software]# tar xvf lzo-2.03.tar.gz
           [root@localhost software]#./configure --prefix=/opt/lzo-2.03
           [root@localhost software]# make && make install
           [root@localhost software]# tar xvf open***-2.2.2.tar.gz
           [root@localhost software]#./configure --prefix=/opt/open***-2.2.2 --with-lzo-headers=/opt/lzo-2.03/include --with-lzo-lib=/opt/lzo-2.03/lib
           [root@localhost software]# make && make install
       d、Open×××服务器端配置
           I、配置环境变量(创建证书和密钥时使用)
               [root@localhost ~]# cd /opt/software/open***-2.2.2/easy-rsa/2.0
               [root@localhost 2.0]# vim vars

***按情况修改粉红色部分,并将改动设置为环境变量***

wKiom1MBmQnC8h5nAAG5z2yOlgI535.jpg

图 2
                [root@localhost 2.0]# source vars
                NOTE: If you run ./clean-all, I will be doing a rm -rf on /opt/software/open***-2.2.2/easy-rsa/2.0/keys
                [root@localhost 2.0]# ./clean-all   #预先清除/opt/software/open***-2.2.2/easy-rsa/2.0/keys 目录

           II、创建CA证书

               [root@localhost 2.0]# ./build-ca

wKioL1MBmTDw0L-0AAJi_K86cA8910.jpg

图 3
           III、创建dh(Diffie-Hellman)密钥算法文件

               [root@localhost 2.0]# ./build-dh

wKiom1MBmW_zB8NyAAKIxXfIpNA298.jpg

图 4
           IV、创建GW1 主服务器端密钥

               [root@localhost 2.0]# ./build-key-server server

wKioL1MBmW_g95n2AARkS8rtXnE957.jpg

图 5
           V、创建GW2 对端服务器密钥

               [root@localhost 2.0]# ./build-key client01

wKiom1MBmanRvvOZAAUaCN_-mQk935.jpg

图 6
           VI、生成tls-auth 密钥
               [root@localhost 2.0]# /opt/open***-2.2.2/sbin/open*** --genkey --secret /opt/software/open***-2.2.2/easy-rsa/2.0/keys/ta.key
           VII、最后将上述文件所在的keys/文件夹转移至/etc/open***/目录
               [root@localhost 2.0]# cp -a keys /opt/open***-2.2.2/
           VIII、创建服务器端配置文件
               [root@localhost ~]# mkdir -p /opt/open***-2.2.2/etc/
               [root@localhost ~]# cd /opt/open***-2.2.2/etc
               [root@localhost etc]# vim server.conf
#指定监听服务器的ip地址
local 10.10.10.10
#指定监听端口
port 51194
#指定传输协议(必要时可使用tcp协议)
proto udp
#使用SSL Tune 的××× 隧道模式
dev tun
#指定ca证书路径
ca /opt/open***-2.2.2/keys/ca.crt
#指定服务器端公钥位置
cert /opt/open***-2.2.2/keys/server.crt
#指定服务器端私钥位置
key /opt/open***-2.2.2/keys/server.key
#指定密钥算法文件
dh /opt/open***-2.2.2/keys/dh1024.pem
#使用服务器模式,并指定***虚拟网络
server 172.16.30.0 255.255.255.0
#记录客户端使用过的ip
ifconfig-pool-persist /opt/open***-2.2.2/etc/ipp.txt
#在客户端添加服务器端内网网络路由
push "route 30.30.30.0 255.255.255.0"
#在服务器端添加客户端内网网络路由
route 40.40.40.0 255.255.255.0
#客户端配置文件存放路径
client-config-dir /opt/open***-2.2.2/ccd
#每10秒通过×××的Control通道ping对方,如果连续120秒无法ping通,认为连接丢失,并重新启动×××,重新连接
keepalive 10 120
#没有HMAC signature的控制信息不予处理,所以客户端也必须有此文件。注:server端后面的数字使用0,client使用1
tls-auth /opt/open***-2.2.2/keys/ta.key 0
#指定加密算法。注:服务端与客户端必须一致
cipher BF-CBC
#启用压缩
comp-lzo
#最大允许100个并发×××连接(可根据需要更改)
max-clients 100
#指定运行open***的用户
user nobody
#指定运行open***的组
group nobody
#通过keepalive检测超时后,重新启动×××,不重新读取keys,保留第一次使用的keys
persist-key
#通过keepalive检测超时后,重新启动×××,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
persist-tun
#记录open***状态
status /opt/open***-2.2.2/log/open***-status.log
#记录open***日志
log-append /opt/open***-2.2.2/log/open***.log
#指定debug level
verb 3
#允许记录20次重复的日志
mute 20
           IX、创建客户端的ccd配置文件
               [root@localhost ~]# mkdir -p /opt/open***-2.2.2/ccd/
               [root@localhost ~]# cd /opt/open***-2.2.2/ccd/
               [root@localhost ccd]# vim client01
iroute 40.40.40.0 255.255.255.0    #声明GW2后端的子网络
ifconfig-push 172.16.30.2 172.16.30.1     #指定GW2的本地地址(tun0)、对端地址(p-t-p)
           X、启动服务器端open***

[root@localhost ~]# /opt/open***-2.2.2/sbin/open*** --config /opt/open***-2.2.2/etc/server.conf &

wKiom1MBmcezQaHgAAIf5HidRCs097.jpg

图 7
   2、ROUTE端配置
       [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
       [root@localhost ~]# ip addr add 10.10.10.1/24 dev eth0
       [root@localhost ~]# ip addr add 20.20.20.1/24 dev eth0
   3、××× Client操作如下
       a、配置ip地址、路由信息:
           [root@localhost ~]# ip addr add 10.10.10.10/24 dev eth0
           [root@localhost ~]# ip addr add 30.30.30.30/24 dev eth0
           [root@localhost ~]# ip route add 10.10.10.0/24 via 20.20.20.1
       b、下载软件包
           [root@localhost ~]# mkidr –p /opt/software
           [root@localhost ~]# wget –P /opt/software http://swupdate.open***.org/community/releases/open***-2.2.2.tar.gz
           [root@localhost ~]# wget –P /opt/software/ http://www.oberhumer.com/opensource/lzo/download/lzo-2.03.tar.gz
       c、编译、安装
           [root@localhost ~]# cd /opt/software
           [root@localhost software]# tar xvf lzo-2.03.tar.gz
           [root@localhost software]#./configure --prefix=/opt/lzo-2.03
           [root@localhost software]# make && make install
           [root@localhost software]# tar xvf open***-2.2.2.tar.gz
           [root@localhost software]#./configure --prefix=/opt/open***-2.2.2 --with-lzo-headers=/opt/lzo-2.03/include --with-lzo-lib=/opt/lzo-2.03/lib
           [root@localhost software]# make && make install
       d、下载证书和密钥文件
           下载在GW1 主服务器端创建的ca.crt、ta.key、client01.key、client01.crt 文件

           ××× Server端操作

wKioL1MBmbXjOsu1AAFtVlVKxcI315.jpg

图 8

           ××× Client端操作

wKiom1MBmeuCK6mCAACZy_-18X0344.jpg

图 9
       e、创建××× Client端配置文件
           [root@localhost ~]# mkdir -p /opt/open***-2.2.2/etc
           [root@localhost ~]# cd /opt/open***-2.2.2/etc/
           [root@localhost etc]# vim client.conf
#指定为客户端模式
Client
#使用SSL Tune 的××× 隧道模式
dev tun
#指定传输协议(与服务器相同)
proto udp
#服务器外网口地址、端口
remote 10.10.10.10 51194
#在本机不邦定任何端口监听incoming数据
nobind
#指定运行open***的用户
user nobody
#指定运行open***的组
group nobody
#通过keepalive检测超时后,重新启动×××,不重新读取keys,保留第一次使用的keys
persist-key
#通过keepalive检测超时后,重新启动×××,一直保持tun或者tap设备是linkup的,否则网络连接会先linkdown然后linkup
persist-tun
#指定ca证书路径
ca /opt/open***-2.2.2/keys/ca.crt
#指定客户端公钥位置
cert /opt/open***-2.2.2/keys/client01.crt
#指定服务器端私钥位置
key /opt/open***-2.2.2/keys/client01.key
#防止××× client使用他们的keys + DNS hack欺骗*** client连接他们假冒的××× Server
ns-cert-type server
#没有HMAC signature的控制信息不予处理。注:server端后面的数字使用0,client使用1
tls-auth /opt/open***-2.2.2/keys/ta.key 1
#记录open***状态
status /opt/open***-2.2.2/log/open***-status.log
#记录open***日志
log-append /opt/open***-2.2.2/log/open***.log
#指定加密算法。注:服务端与客户端必须一致
cipher BF-CBC
#启用压缩
comp-lzo
#指定debug level
verb 3
#允许记录20次重复的日志
mute 20
       f、启动客户端open***

           [root@localhost ~]# /opt/open***-2.2.2/sbin/open*** /opt/open***-2.2.2/etc/client.conf &

wKioL1MBmeqymflHAAHgBhd-GI0347.jpg

图 10
   4、测试×××

        a、××× Server端ping ××× Client端

wKiom1MBmiDRLnQXAAHkRpfeHQI770.jpg

图 11

       b、××× Client端ping ××× Server端

wKioL1MBmgbgDojxAAISBrgh7Jg221.jpg

图 12
二、 当访问30.30.30.200时转到40.40.40.200
   [root@×××_Server ~]# ip addr add 30.30.30.200/24 dev eth0
   [root@×××_Server ~]# iptables -t nat -A PREROUTING -d 30.30.30.200 -j DNAT --to-destination 40.40.40.200
   [root@×××_Server ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
   测试:

       1、现有一ip为30.30.30.20的client访问30.30.30.200

wKioL1MBmhSiuZYIAAEPIg6lqXg546.jpg

图 13

       2、××× Server端收到数据包如下图

wKiom1MBmmWS2Yz8AAIjaY2KVdk302.jpg

图 14

       3、由于××× Server端对ip:30.30.30.200设置了DNAT,所以××× Client收到的数据包如下图

wKiom1MBmnPj4QZyAAHxuKf__RY114.jpg

图 15

       4、打开××× Client的转发功能(echo 1 > /porc/sys/net/ipv4/ip_forward)后,目标机器40.40.40.200收到的数据包,如下图

wKioL1MBml6zsR4DAALT217jafw838.jpg

图 16
       5、测试结果及分析:DNAT成功,目标机器收到数据包,由于目标机器没有30.30.30.20的路由,所以数据返回不成功。
三、 在××× Client设置SNAT,转发目标机器返回的数据包。
   [root@×××_Client ~]# iptables -t nat -A POSTROUTING -s 30.30.30.20 -j SNAT --to 40.40.40.40
测试:

   1、现有一ip为30.30.30.20的client访问30.30.30.200

wKiom1MBmpLyXFFEAAFSDw1Ny7A327.jpg

图 17

   2、××× Server收到的数据包

wKioL1MBmn-wiEIQAAKIAIulHfU236.jpg

图 18

   3、经过DNAT和SNAT后××× Client收到的数据包

wKiom1MBmrbyNHoRAALKkNhCkCQ563.jpg

图 19

   4、目标机器40.40.40.200收到的数据包

wKioL1MBmqDB9AfcAAM-AqS8DeI598.jpg

图 20
   5、测试结果:符合实验要求。