-- 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 :PRINTABLE:'CN' stateOrProvinceName :PRINTABLE:'GD' localityName :PRINTABLE:'ShenZhen' organizationName :PRINTABLE:'IT' organizationalUnitName:PRINTABLE:'IT' commonName :PRINTABLE:'vpn' name :PRINTABLE:'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可以上外网了