自由论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1013|回复: 0
打印 上一主题 下一主题

【学习笔记】VPN

[复制链接]

85

主题

97

帖子

9829

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9829
跳转到指定楼层
楼主
发表于 2016-2-28 21:19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ip tunnel (在网络上建立虚拟的通道,用于做VPN这种应用)

Linux有3种隧道。它们是:
IP-in-IP隧道
GRE 隧道
非内核隧道(如PPTP)
GRE是最初由CISCO开发出来的隧道协议,能够做一些IP-in-IP隧道做不到的事情。比如,你可以使用GRE隧道传输多播数据包和IPv6数据包。在Linux下,你需要ip_gre.o模块

          因特网
  深圳分公司  ---------  北京分公司
        建立tunnel

使用四台虚拟机来模拟实现(不用宿主机模拟,宿主机能和所有网段通)

--下图中10.1.1.0网段模拟外网;1.1.1.0网段模拟内网1;2.2.2.0网段模拟内网2
--(虽然在实际情况下10.1.1.0是内网,1.1.1.0和2.2.2.0是外网,但我这里只是实验环境模拟)
我下面是用vmware来模拟
10.1.1.0为bridge网络
1.1.1.0为hostonly1网络(vmnet1)
2.2.2.0为hostonly2网络(vmnet2)
  

     10.1.1.6      10.1.1.7      
      外1(深圳VPN)      外2(北京VPN)
     1.1.1.128      2.2.2.128

内1 (深圳内网机器)    内2 (北京内网机器)
1.1.1.129     2.2.2.129
网关指向1.1.1.128    网关指向2.2.2.128


先在外1和外2在打开ip_forword
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1  --0改为1
# sysctl -p


建立外1和外2之间的tunnel
1,外1上面操作
# modprobe ip_gre --tunnel协议
# lsmod |grep gre
ip_gre                 15341  0

ip tunnel add tun0 mode gre  remote 10.1.1.7 local 10.1.1.6
ip link set tun0 up
ip addr add 3.3.3.3 peer 3.3.3.4 dev tun0
ip route add 2.2.2.0/24 dev tun0

--上面这四条的意思:
第一条,增加一个tun0接口,隧道模式为gre,由本端的10.1.1.6和对端的10.1.1.7这个物理连接上建立
第二条,启动tun0这个网卡接口,然后ifconfig命令就可以查看得到
第三条,给本地的tun0授于IP为3.3.3.3,对端为3.3.3.4;完成后ifconfig就能看到tun0的IP
第四条,表示当本机数据包要访问2.2.2.0/24这个网段时从tun0出去;完成后route -n可以看到这条路由

2,外2上的操作
# modprobe ip_gre
# lsmod |grep gre
ip_gre                 15341  0

ip tunnel add tun0 mode gre  remote 10.1.1.6 local 10.1.1.7
ip link set tun0 up
ip addr add 3.3.3.4 peer 3.3.3.3 dev tun0
ip route add 1.1.1.0/24 dev tun0

3,内1上的操作
把网关指向外1的内网IP
route add default gw 1.1.1.128

4,内2上的操作
把网关指向外2的内网IP
route add default gw 2.2.2.128

5,测试,内1和内2两个内网可以互相ping通,并且可以使用traceroute 命令接IP,查看确实走了tunnel
测试完后,删除tunnel的方法  ip tunnel del tun0
--如果做的有问题,可以用ip tunnel del tun0命令删除后,重新,再写上面的四条

扩展:
上面架构做好后,深圳内网用户1.1.1.129ping不通10.1.1.6(北京vpn外网IP),但反过来(就是北京vpn可以ping通深圳内网用户)却可以ping通
--从tunnel过,才可以从tunnel回。不能不从tunnel过,而从tunnel回


=============================================================


vpn    (virtual private network)

openswan
openvpn

tunnel做好后,但走公网如果有安全性考虑,就需要对tunnel进行加密;
一般来说可以用ipsec或ssl来加密tunnel

下面我就用openswan软件来实现tunnel的加密

rhel6自带了openswan软件包
参考redhat官方文档
https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-Virtual_Private_Networks_VPNs.html


     10.1.1.6     10.1.1.7      
  外1(深圳vpn)      外2(北京vpn)
     1.1.1.128      2.2.2.128

内1      内2
1.1.1.129     2.2.2.129
网关指向1.1.1.128    网关指向2.2.2.128


--架构图还是和上次做tunnel一样
--先使用ip tunnel del tun0把上面做的tunnel给删除掉,再用openswan来做

准备好机器后
主机名绑定
iptables,selinux关闭
时间同步
配置yum


第一步:在外1和外2这两台vpn服务器上安装openswan,两边安装方法一样,步骤如下(我这里没有使用rpm包,使用的是源码包安装)
笔记目录/arch/vpn_soft/openswan-2.6.38.tar.gz

# tar xf openswan-2.6.38.tar.gz -C /usr/src/
# cd /usr/src/openswan-2.6.38/


--下面的安装方法先参考源码目录下的README
--在一些linux版本里编译完后,内核自带的ipsec模块是netkey,而openswan自已也开发了ipsec模块为klips;下面的做法是编译klips

--编译前安装相关的依赖性,下面这些依懒性,如果是装系统时把开发有关的都安装过的话,应该就只有gmp-devel这个包没装;如果不装此包,编译时会报错的

# yum groupinstall "Development tools"
# yum install gmp gmp-devel gawk flex bison iproute iptables sed kernel-devel

# make programs
# make KERNELSRC=/lib/modules/`uname -r`/build module
# make KERNELSRC=/lib/modules/`uname -r`/build install minstall
# ipsec --version
Linux Openswan U2.6.38/K(no kernel code presently loaded) --没有看到有加载ipsec的模块
See `ipsec --copyright' for copyright information.
# modprobe ipsec  --使用这一句来加载
# ipsec --version
Linux Openswan 2.6.38 (klips)     --可以看到klips了
See `ipsec --copyright' for copyright information.


第二步:
在两边的vpn服务器上进行配置
外1
# ipsec showhostkey --left --这一步是为了生成网络传输加密的公钥,但它要用到/etc/ipsec.secrets这个文件来生成,现在报错,没有这个文件
ipsec showhostkey no secrets filename matched "/etc/ipsec.secrets"
No keys found

# rm /dev/random -rf
# ln -s /dev/urandom /dev/random
# ipsec newhostkey --output /etc/ipsec.secrets
--这里主要是用随机设备生成/etc/ipsec.secrets,如果不做前两步,则第三步速度非常慢

#  ipsec showhostkey --left  --再次生成公钥,得到很长的一串字符串
leftrsasigkey=0sAQN4bpl6e64jyZEZtJHOndmkzkpm/T6fiDa4Zfm0kXBPaB1bgXDckwXS3YluAObn3lH/VjpSx6mZBf5GM9PHu4Opa8ZCk21O/AHQ3sdf2sa9zv1r8L9Y2mVDyKv0Sc2Iy6t6N2PHYnNOvlCzAqLa5iSuVBKBjvbJXrqGWKNIfRmeeIjS15hlfbRMHrJk3V0db4j1EenECPFeTL4PVxyEMJXcBeyslajuZCqGncd7kV17rY9RaGsnlph08OfeOL/I0FRajcyQW5WQCGBr60h1Ne0c2BuWqSkJGKyomBtxBgAXHPsU7iD4nyoH2ot/zNOSYRDZJ7w8EEuShswuDM+c6tze5mVGVR0TgZzLe4A/ZjHEq2gT

外2
# rm /dev/random -rf
# ln -s /dev/urandom /dev/random
# ipsec newhostkey --output /etc/ipsec.secrets
# ipsec showhostkey --right
rightrsasigkey=0sAQPN+lWszCDAvmowlcQKPb+f5b+bWnsRfGq1Dr/tOzq6WW0Xzl+KJYUdAnV3gTxvGrTeUhoVrhvQZ5l721ywVPV2lK27NToqWf7aQ+E5EoFR5en5hsH6EYr3F305vYtM03m0Cy1rlGDRCuGCGpy6E/FNAurvH5TdlGg0D+k4Q6VRMMz6clE/Rg/NCN4ZZRdBKxzYCcxqIXXGAAJL2XkZ0hJX7R4EWjOUrmeFpvOj2XMRDtUABnq9jXFEKKoQFtMSVZXmIpq0cfudJUPcMpnHRtyA40o9CHko20JF9lbwkwpegZYQ/L2eTLJD7pGMND1HObhGFMsUrqUmqhcZ799sdsde2ed563ThkmPmizpUYhePC2iH

第三步:配置两边的主配置文件,建立新的VPN链接(先只配置一边VPN,配置完后直接scp拷到另一边的VPN,不用做任何修改)
# vim /etc/ipsec.conf  --打开主配置文件,默认的都不修改,直接在最后面加上下面一段
conn sz-to-bj    --建立一个链接,名字随意
  left=10.1.1.6 --左边vpn通向外网的IP
  leftsubnet=1.1.1.0/24 --左边的内网网段
  leftnexthop=%defaultroute --下一跳就是默认路由,也就是两个有公网的机器的默认网关;表示目标找不到路由,就会走这个默认网关
  leftrsasigkey=0sAQN4bpl6e64...... --这里省略,其实就是前面ipsec showhostkey --left得到的一段
  right=10.1.1.7
  rightsubnet=2.2.2.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQPN+lWszC......
  auto=start  --自动启动这个链接

# scp  /etc/ipsec.conf 10.1.1.7:/etc/ --因为两边vpn的配置一样,所以直接scp到另一台就可以了


第四步:
两边vpn服务器启服务


# /etc/init.d/ipsec start --启动ipsec服务
ipsec_setup: Starting Openswan IPsec 2.6.38...
ipsec_setup: ipsec0 -> NULL mtu=0(0) -> 0
--------------------------------------
如果启动报下面的错误表示,你的VPN服务器没有默认路由
ipsec_setup: Starting Openswan IPsec 2.6.38...
ipsec_setup: no default route, %defaultroute cannot cope!!!
解决方法:
用route add default gw去加一个网关就可以了
但注意一定要加一个公网的网关(不用两边外网网关互指,我这里就直接网关指向172.16.2.1)
也不要把网关指向你的内网(如果是一个人四台虚拟机模拟的话,你指内网网关就指到宿主机了,会造成两边内网直接通过宿主机通迅了)
------------------------------------------------------------


# ipsec verify   --验证ipsec的状态,不要有failed就行;可能会在checking IP forwarding那里有failed,只要打开了ip_forward就行,不影响后面的验证;
--或者udp 500那里是failed,只要去netstat -ntlup |grep :500去查一下udp的500端口是启动的就可以了
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                              [OK]
Linux Openswan 2.6.38 (klips)
Checking for IPsec support in kernel                         [OK]
KLIPS: checking for NAT Traversal support                   [OK]
KLIPS: checking for OCF crypto offload support              [N/A]
SAref kernel support                                        [N/A]
Checking that pluto is running                               [OK]
Pluto listening for IKE on udp 500                          [OK]
Pluto listening for NAT-T on udp 4500                       [OK]
Two or more interfaces found, checking IP forwarding        Checking NAT and MASQUERADEing                               [OK]
Checking for 'ip' command                                    [OK]
Checking /bin/sh is not /bin/dash                            [OK]
Checking for 'iptables' command                              [OK]
Opportunistic Encryption Support                             [DISABLED]

然后两边就可以看到一个网卡叫ipsec0,也就是说两边的链接自动建立了,因为我们在前面ipsec.conf里配置的是auto=start
如果不是自动建立,则需要手动启动ipsec auto --up sz-to-bj

第五步:
把两台vpn服务器的ip_forward打开
两边的内网就可以互相ping通了

--在两台vpn服务器上tcpdump抓包可以看到有ipsec的加密
# tcpdump -i eth0 host 10.1.1.6 and 10.1.1.7 -n
12:14:40.301869 IP 10.1.1.7 > 10.1.1.6: ESP(spi=0x49a9eeef,seq=0xf3), length 132
12:14:41.314925 IP 10.1.1.6 > 10.1.1.7: ESP(spi=0xf85ae907,seq=0xf4), length 132
12:14:41.320418 IP 10.1.1.7 > 10.1.1.6: ESP(spi=0x49a9eeef,seq=0xf4), length 132
12:14:42.345614 IP 10.1.1.6 > 10.1.1.7: ESP(spi=0xf85ae907,seq=0xf5), length 132
12:14:42.347481 IP 10.1.1.7 > 10.1.1.6: ESP(spi=0x49a9eeef,seq=0xf5), length 132

--关于AH,ESP的概念是
ipsec协议的知识,比较底层;这里我们只要看到有相关的信息就可以了


========================================================================

扩展,假设有三个分公司sz(深圳),sh(上海),bj(北京),如何用openswan实现三地的基于ipsec的vpn互联

   深圳         北京   上海
10.1.1.6      10.1.1.7       10.1.1.8
   外1           外2   外3
1.1.1.128      2.2.2.128       3.3.3.128

   内1    内2   内3
1.1.1.129     2.2.2.129      3.3.3.129
网关指向1.1.1.128    网关指向2.2.2.128     网关指向3.3.3.128

# cat /etc/ipsec.conf   --深圳分公司的配置只有下面两段(深圳to北京,深圳to上海就行)
conn sz-to-bj
  left=10.1.1.6
  leftsubnet=1.1.1.0/24
  leftnexthop=%defaultroute
  leftrsasigkey=0sAQONxSH......
  right=10.1.1.7
  rightsubnet=2.2.2.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQNzwN......
  auto=start
conn sz-to-sh
  left=10.1.1.6
  leftsubnet=1.1.1.0/24
  leftnexthop=%defaultroute
  leftrsasigkey=0sAQONxSH......
  right=10.1.1.8
  rightsubnet=3.3.3.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQOL07......
  auto=start

# cat /etc/ipsec.conf   --北京分公司的配置只有下面两段(深圳to北京,上海to北京就行)
conn sz-to-bj
  left=10.1.1.6
  leftsubnet=1.1.1.0/24
  leftnexthop=%defaultroute
  leftrsasigkey=0sAQONxSH......
  right=10.1.1.7
  rightsubnet=2.2.2.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQNzwN......
  auto=start

conn sh-to-bj
  left=10.1.1.8
  leftsubnet=3.3.3.0/24
  leftnexthop=%defaultroute
  leftrsasigkey=0sAQOL07......
  right=10.1.1.7
  rightsubnet=2.2.2.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQNzw......
  auto=start

# cat /etc/ipsec.conf   --上海分公司的配置只有下面两段(深圳to上海,上海to北京就行)
conn sz-to-sh
  left=10.1.1.6
  leftsubnet=1.1.1.0/24
  leftnexthop=%defaultroute
  leftrsasigkey=0sAQONxSH......
  right=10.1.1.8
  rightsubnet=3.3.3.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQOL07......
  auto=start

conn sh-to-bj
  left=10.1.1.8
  leftsubnet=3.3.3.0/24
  leftnexthop=%defaultroute
  leftrsasigkey=0sAQOL07......
  right=10.1.1.7
  rightsubnet=2.2.2.0/24
  rightnexthop=%defaultroute
  rightrsasigkey=0sAQNzw......
  auto=start

把上面三台vpn服务器上配置文件确定后,三台还要确认ip_forword打开,然后就可以/etc/init.d/ipsec start 把三台的服务启动,测试,三个内网都能通了

上面还有一种做法也可以成功,就是深圳的VPN服务器上可以配置(sz-to-bj,sz-to-sh,sh-to-bj)三段配置,然后,把配置文件直接scp到北京和上海服务器不用修改,然后都启动,也可以成功
--那么这种做法节点越多,配置起来越方便(因为只要配置一份,然后拷到其它节点就行,不用考虑差异性)

=====================================================================

上面做的是网对网的方式(也就是两个子网或多个子网的连接),openswan叫这种为net-to-net方式,还有一种点对网(也就是出差的单个同事,想登录到公司内网的情况,openswan叫这种为road warrior方式

     10.1.1.6      10.1.1.7      
      酒店路由器     公司VPN服务器
     1.1.1.128      2.2.2.128

员工在酒店内笔记本获取的内网IP   公司内的一个服务机器
1.1.1.129         2.2.2.129
网关指向1.1.1.128    网关指向2.2.2.128

--上图中,10.1.1.0网段模拟公网,这里有一个问题,就是公司VPN服务器不一定有公网IP,可能在前端有防火墙DNAT转发过来;
--我这里就简单化一下,直接把公网IP放到VPN服务器
--上图里安装openswan的机器(员工笔记本和vpn服务器要打开ip_forward)

做之前的准备:
1,在酒店路由器上/etc/init.d/ipsec stop掉;还要把网关也删除掉。因为现在它是默认酒店的一个路由器,你不可能在上面安装openswan;
ipsec 服务停掉后,那么上面网对网的架构就不行了;10.1.1.6只是用来模拟做路由而已
2,需要在酒店路由器做一个SNAT伪装,让员工能上外网
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE   --注意eth0为路由器的公网IP的网卡名
并且在酒店路由器上打开ip_forword
#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 --改为1
# sysctl -p  --保存退出后,用此使用使之生效

做完上面的准备工作后,员工在1.1.1.129上能ping通10.1.1.7公司VPN服务器公网IP了,但ping不通2.2.2.129公司内网服务器,所以需要做VPN拔号上去


第一步:
在1.1.1.129(这里模拟出差的员工带的笔记本)上安装openswan
安装过程省略,和上面架构时安装过程一样,装完也要modprobe ipsec安装模块(并要打开ip_forward)

第二步:
在1.1.1.129(出差员工客户端)和10.1.1.7(公司VPN服务器)上配置openswan
步骤也是和上面架构安装时一样,我这里的步骤如下

在1.1.1.129上的步骤

# rm /dev/random -rf
# ln -s /dev/urandom /dev/random
# ipsec newhostkey --output /etc/ipsec.secrets

# ipsec showhostkey --left
leftrsasigkey=0sAQO8q6mzHWavOv1Oh3rCtuewZTkwhvefFoVsUqGAeVL8MMv5/kENgeBIMeIH3nclS57oR9juYjY47DJoflZYvJlDwjvOYv5K0BrnM5DqpHitWzblP6Rb/oUl2FNk3oHUs7EoNmqO7JXK4ZWabVj3Dq+BgQTpQyC/wolgfLo6jPqvRwum5xdwxeuHlGgsxFhonY0bBQaX56t8mbt8wuO2ieyo+wyL5nlOe54LY15nzObcm6eTAa15p2TPEtsYFJJk0ijnhucYhMur2SodU3uZyyIKbOIx5qVxTwgcBnDvap8olLqH7GkQRsqPxHpQwW0vgPgmqz/mQu9wEFh/LPcORgkhh4roIJpTtwJdZwTrfIBI/DNN

在10.1.1.7上的步骤
# rm /dev/random -rf
# ln -s /dev/urandom /dev/random
# ipsec newhostkey --output /etc/ipsec.secrets
# ipsec showhostkey --right
rightrsasigkey=0sAQPCb+Wdc7Pe5Cd9Q3s3tEOqahLZxbi3VKbL8N+FtzMfiE5CrFfFcnyIr8GH63bMstFFL0nH/Qaq6h0WbJOTAP//6At9p7+h0103CBNVXFDiI3gex5xQQtvuBlOG/9WhIuYYz/kpkTggdSK9uGvWPBgFV/Gw1NQGUBL/H2VPZ+RWArlREyfa1A5N7atbnKpk6lsFgrthPoZPqS0vdYaQdYXeQE1ZQvChWdPRNXOIVbmK5+blnt5tqCr1eKqZsjIylCWrH/2Uh6ZI9rGzalwaLVxXUTLLPP1Q3F03tXReAk5xF5bednjqUAOO/ofCne2HdoJVFciTAQWS/pvp9zOiI6X6wszrrK1mKQCjHE/JrDj5edMP

第三步:
配置客户端和VPN服务器的ipsec.conf主配置文件

先在出差用户的笔记本上(1.1.1.129)配置
# vim /etc/ipsec.conf --加上下面一段,表示一个VPN连接
conn road
  left=%defaultroute --因为在外出差,酒店的公网IP不固定,所以这里直接指向你的网关就行
  leftid=@laptop  --对你的笔记本做一个标识ID,只要和vpn服务器不一样就行,名字随意
  leftrsasigkey=0sAQO8q6mzHW...... --这里的leftkey就是在员工笔记本上得到的key(你在笔记本上--left和--right显示的key是一样的)
  right=10.1.1.7 --VPN服务器公网IP,要求IP是固定的
  rightid=@vpnserver --vpn服务器的标识ID,名字随意
  rightsubnet=2.2.2.0/24   --公司的内网网段(再次提一下,2.2.2.0实际上是公网网段,我这里是实验环境而已)
  rightrsasigkey=0sAQPCb+Wdc7..... --这里是rightkey就是在VPN服务器上得到的key(使用--left和--right也是一样的,同一台服务器左和右显示的key是一样的)
  auto=start --表示启动服务时,自动连接.如果笔记本chkconfig ipsec on,那么开机就会自动vpn连上公司

再在vpn服务器(10.1.1.7)上配置
# vim /etc/ipsec.conf --加上下面一段

conn road
  left=10.1.1.7  --这里VPN服务器公网IP(注意这里left和right换了角色了,在这里vpnserver为left,出差客户端为right)
  leftid=@vpnserver
  leftsubnet=2.2.2.0/24
  leftrsasigkey=0sAQPCb+Wdc7...... --这是vpn服务器上--left得到的key,和--right是一样的key(只是前面的前缀不一样而已)
  rightnexthop=%defaultroute
  right=%any --因为不知道客户端的公网IP(动态的),所以用%any
  rightsubnet=vhost:%priv,%no --这句话很重要,如果出差用户是在一个NAT后面(在路由器后面).也就是说出差用户用的是私网IP,那么这句话就是支持这种情况用的
  rightid=@laptop
  rightrsasigkey=0sAQO8q6mzH...... --这是出差用户--right得到的key,和--left是一样
  auto=start

第四步:
vpn服务器和用户客户端都启动服务
/etc/init.d/ipsec start

第五步:
测试
客户端(1.1.1.129)就可以ping通(2.2.2.128和2.2.2.129)这个公司内网了

===================================================================

openvpn
--架构和上面一样,只是出差员工这次用的系统是windows;如下图

     10.1.1.6      10.1.1.7      
      酒店路由器     公司VPN服务器
     1.1.1.128      2.2.2.128


员工在酒店内笔记本(windonws系统)获取的内网IP 公司内的一个服务机器
1.1.1.130         2.2.2.129
网关指向1.1.1.128    网关指向2.2.2.128

准备工作
主机名
关闭iptables
时间同步

按上图准备好后,员工在酒店(1.1.1.130)是ping不通VPN服务器外网IP的(10.1.1.7)
为了模拟实际情况,要在酒店路由器(10.1.1.6)上做一个NAT,命令如下
# iptables -t nat -A POSTROUTING -j MASQUERADE
并且在酒店路由器上打开ip_forword
#vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 --改为1
# sysctl -p  --保存退出后,用此使用使之生效
做完后,1.1.1.130就可以访问10.1.1.7了

但是现在出差员工,是访问不了公司内网的(也说是2.2.2.0/24网段)
所以现在我们做VPN,让出差员工能够访问


在vpn-server上安装的相关软件包
笔记目录/arch/vpn_soft/
lzo-2.06.tar.gz --lzo压缩
openvpn-2.2.1.tar.gz --openvpn主程序包
openvpn-2.2.1-install.exe --openvpn在windows上的客户端

1,把软件包拷到vpn服务器上,在VPN服务器上安装lzo和openvpn源码软件包
# yum install openssl*
# tar xf lzo-2.06.tar.gz -C /usr/src/
# cd /usr/src/lzo-2.06/
# ./configure && make && make install

# tar xf openvpn-2.2.1.tar.gz -C /usr/src/
# cd /usr/src/openvpn-2.2.1/
# ./configure && make && make install

2,配置openvpn
# mkdir -p /etc/openvpn
# cp -r /usr/src/openvpn-2.2.1/easy-rsa/* /etc/openvpn/
# cd /etc/openvpn/2.0/
# vim vars --修改生成证书的信息,为了后面生成证书方便
export KEY_COUNTRY="CN"
export KEY_PROVINCE="GD"
export KEY_CITY="ShenZhen"
export KEY_ORG="IT"
export KEY_EMAIL="me@hotmail.com"
export KEY_EMAIL=me@gmail.com
export KEY_CN=vpn
export KEY_NAME=daniel
export KEY_OU=IT

# rpm -qa |grep openssl  --rhel6.5自带的openssl为1.0版,所以下面拷的文件为1.0的配置文件
openssl-devel-1.0.1e-15.el6.x86_64
openssl-1.0.1e-15.el6.x86_64
# cp openssl-1.0.0.cnf openssl.cnf
# source ./vars --让刚才的修改生效
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/2.0/keys
# ./clean-all  --执行这句,如果你以前做过keys的话,那么它会帮你删除以前做在/etc/openvpn/2.0/keys目录里的密钥文件.如果你是第一次,它会帮你产生这个目录

3,生成密钥
# ./build-ca
Generating a 1024 bit RSA private key
......................................................++++++
.++++++
writing new private key to 'ca.key'
-----
......
Country Name (2 letter code) [CN]:
State or Province Name (full name) [GD]:
Locality Name (eg, city) [ShenZhen]:
Organization Name (eg, company) [IT]:
Organizational Unit Name (eg, section) [IT]:
Common Name (eg, your name or your server's hostname) [vpn]:
Name [daniel]:
Email Address [me@gmail.com]:
--上面这些我全部都是直接回车的,用的都是上面修改的默认值

4,生成服务器端证书
# ./build-key-server vpn  --名字也是随意
Generating a 1024 bit RSA private key
.........++++++
..++++++
writing new private key to 'vpn.key'
......
Country Name (2 letter code) [CN]:
State or Province Name (full name) [GD]:
Locality Name (eg, city) [ShenZhen]:
Organization Name (eg, company) [IT]:
Organizational Unit Name (eg, section) [IT]:
Common Name (eg, your name or your server's hostname) [vpn]:
Name [daniel]:
Email Address [me@gmail.com]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456  --证书密码
An optional company name []:IT --随意
Using configuration from /etc/openvpn/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           RINTABLE:'CN'
stateOrProvinceName   RINTABLE:'GD'
localityName          RINTABLE:'ShenZhen'
organizationName      RINTABLE:'IT'
organizationalUnitNameRINTABLE:'IT'
commonName            RINTABLE:'vpn'
name                  RINTABLE:'daniel'
emailAddress          :IA5STRING:'me@gmail.com'
Certificate is to be certified until Nov  8 06:54:13 2022 GMT (3650 days)
Sign the certificate? [y/n]:y --证书有效期为10年,同意

1 out of 1 certificate requests certified, commit? [y/n]y --按y确认
Write out database with 1 new entries
Data Base Updated

5.生成密钥对 Diffie hellman(一种确保共享KEY安全穿越不安全网络的方法)
#./build-dh --会生成dh1024.pem

6,生成客户端证书
# ./build-key client --过程与第4步一样

# ls /etc/openvpn/2.0/keys/ --上面做完后,key目录就会有下面这些文件了
01.pem      client.csr      index.txt.attr.old  vpn.csr
02.pem      client.key      index.txt.old       vpn.key
ca.crt      dh1024.pem      serial
ca.key      index.txt       serial.old
client.crt  index.txt.attr  vpn.crt


7,配置openvpn主配置文件
# cp /usr/src/openvpn-2.2.1/sample-config-files/server.conf /etc/openvpn/ --拷贝配置文件模版
# vim /etc/openvpn/server.conf
port 1194
proto udp
dev tun
ca /etc/openvpn/2.0/keys/ca.crt
cert /etc/openvpn/2.0/keys/vpn.crt
key /etc/openvpn/2.0/keys/vpn.key  --路径不要写错
dh /etc/openvpn/2.0/keys/dh1024.pem
server 10.8.0.0 255.255.255.0 --服务器端tun0网卡所在网段,和分配拔号成功的客户端IP所在网段,也就是他们隧道通迅的网段
push "route 2.2.2.0 255.255.255.0" --拔号后给他加一个路由,2.2.2.0就是公司的内网网段
client-to-client --多客户端能互相访问
comp-lzo
max-clients 100 --允许的最大客户端数

8,拷贝openvpn服务脚本,然后启动服务
# cp /usr/src/openvpn-2.2.1/sample-scripts/openvpn.init /etc/rc.d/init.d/openvpn
# chmod 755 /etc/rc.d/init.d/openvpn

# /etc/init.d/openvpn start --启动不起来的话,查看/var/log/messages

验证:
ifconfig tun0  --可以看到下面的信息
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255


9,把客户端证书和openvpn客户端软件拷贝到windows客户端
要拷的文件有
vpn-server上的:
/etc/openvpn/2.0/keys/
client.crt
client.key
ca.crt
我真实机上的:
笔记目录/arch/vpn_soft/openvpn-2.2.1-install.exe


10,在windows客户端先双击安装openvpn-2.2.1-install.exe

11,我的openvpn默认安装路径为C:\Program Files\OpenVPN\
所以把client.crt,client.key,ca.crt三个文件拷贝到C:\Program Files\OpenVPN\config目录
还要把C:\Program Files\OpenVPN\sample-config\里的client文件也拷到
C:\Program Files\OpenVPN\config目录


12,编辑client配置文件
用写字板程序打开client配置文件(如果没有写字板,可以使用word打开)
client
dev tun
proto udp
remote 10.1.1.7 1194       --10.1.1.7为VPN服务器通向外网的公网IP
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key  --这三个文件的路径要对应好,我都在config目录下,所以这里是相对路径
comp-lzo


对client文件右键--- start ....  来进行拔号
--注意1:客户端和服务器时间一定要同步,否则拔号时TLS握手失败
--注意2:如果报找不到client.crt,那么就是后缀名的问题。解决方法(点工具--文件夹选项--查看--把最下面的 "隐藏已知文件类型的扩展名" 前面的勾去掉 --确定),后缀名会出现.cer,把他改成.crt就可以了

桌面有一个openvpn的快捷方式,点击后右下角会有一个连接图标(以后可以直接使用这个小图标来连接)
  
  ping 10.8.0.1 可以ping通
  ping 2.2.2.129  也可以ping通了(因为他加了这个网段的路由),说明可以访问内部2.2.2.0/24这个内网了


=============================================================
扩展:
pptpd
  br0 172.16.2.9     --这是能上外网的IP(模拟国外不受限制IP)
   宿主机
  vmnet1 192.168.10.1   --这是hostonly内网(模拟国内IP)
    |
    |
    |
   xp虚拟机
   192.168.10.128  
实现目的:
让xp虚拟机通过pptpd的vpn拔号,能够上外网
软件包路径
笔记目录下/arch/vpn_soft/

第一步:
安装
在宿主机做
# yum install ppp -y
# rpm -ivh pptpd-1.4.0-3.el6.x86_64.rpm

第二步:
配置
在宿主机做
# vim /etc/ppp/options.pptpd   
67 ms-dns 114.114.114.114  --打开注释,并写上公网的DNS服务器IP      

# vim /etc/pptpd.conf
12 ppp /usr/sbin/pppd --打开这一行的注释
102 localip 172.16.2.9  --最后写上这两句(localip要写vpn服务器上外网的IP)
103 remoteip 172.16.2.10-50 --写一个分配给客户端拔号的IP

# vim /etc/ppp/chap-secrets  --写上可以拔号vpn服务器的用户名和密码
test    pptpd   123456  *  --代表用户名为test,密码为123456;pptpd表示服务名,*表示所有人能连

第三步:
服务器启动服务     
# /etc/init.d/pptpd restart

第四步:
windows客户端配置
右键网上邻居--》创建一个新的连接--》下一步--》连接到我的工作场所--》下一步--》虚拟专用网络连接--》下一步--》填一个随意的连接名(如:zhangsan)--》填vpn内网的IP(这里就是192.168.10.1)-->下一步--》填用户名(test),密码(123456)--》点连接

测试:
windows可以上外网了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Prostar Inc.

GMT+8, 2024-11-22 14:39 , Processed in 0.054039 second(s), 9 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表