142012
 

原创文章,转载请注明来自Sean的技术博客

    自从买到了VPS,除了放置网站,就是玩一玩VPN了。早就听说过这种神奇的东西,用的还是不多,充满了好奇。放狗搜索了一下,发现最多的教程就是使用PPTPD搭建的,有的讲了配置,有的是用一键安装包。但是我的需求是一个能够支持IPv6的VPN,这样在校园网的环境下就可以免费的上网了,比较爽。以前一直用的是GoAgent来做代理,但是只是个普通的HTTP代理而已,还有单次返回数据500KB的限制,更是无法用任何的客户端。这些都使得这种方式并不能完全替代付费校园网IPv4的使用。

    后来发现大家表示OpenVPN是有支持IPv6的补丁包的,只要打好了补丁,就可以支持Server和Client之间的IPv6连接了。于是开始动手,以RedHat系列为例:

第一步,安装编译工具和OpenSSL。
      yum install gcc gcc-c++ kernel-devel openssl-devel

第二步,安装LZO压缩模块,后面OpenVPN用它来压缩。
      wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz
   tar解压,进入目录./configure && make && make install

第三步,下载OpenVPN并打上IPv6的Patch,安装之。
   wget http://openvpn.net/release/openvpn-2.1.1.tar.gz
   wget https://github.com/downloads/jjo/openvpn-ipv6/openvpn-2.1.1-ipv6-0.4.11.patch.gz
   tar解压第一个,gunzip第二个,然后 patch –p0 < openvpn-2.1.1-ipv6-0.4.11.patch
   进入openvpn-2.1.1,./configure && make && make install

第四步,把/openvpn-2.1.1/easy-rsa/复制到/etc/openvpn中。
      cp -r ./openvpn-2.1.1/easy-rsa/ -r /etc/openvpn 注意当前工作目录的位置

第五步,使用/etc/openvpn/2.0/中的工具制作证书。
      cd /etc/openvpn/2.0/
   export D=`pwd`
   export KEY_CONFIG=$D/openssl.cnf
   export KEY_DIR=$D/keys
   export KEY_SIZE=1024
   export KEY_COUNTRY=US
   export KEY_PROVINCE=CA
   export KEY_CITY=SanFrancisco
   export KEY_ORG=”SomeOrgization”
   export KEY_EMAIL=”SomeEmailAddress”
   . vars
   ./clean-all
   ./build-ca #自己填写一下信息,随便填写就行吧貌似
   ./build-key-server server #生成服务器密钥对
   ./build-key client0 #生成客户端密钥对,这个名字是客户端的名字,build-key时CommonName要Unique
   ./build-dh 【若出错,使用 openssl dhparam -out ./keys/dh1024.pem 1024 试一下】

   现在可以把ca.crt, server.crt, client0.crt, client0.key分发给用户了,注意别把ca和server的私钥分发出去了。

第六步,创建服务器端配置文件,可以弄两个,v4,v6各一个,放在/etc/openvpn/2.0/conf/中。
server-v4.conf文件如下:
   local YOUR.SERVER.IPV4.ADDRESS
   port 8888
   proto udp
   dev tun
   ca /etc/openvpn/2.0/keys/ca.crt
   cert /etc/openvpn/2.0/keys/server.crt
   key /etc/openvpn/2.0/keys/server.key  # This file should be kept secret
   dh /etc/openvpn/2.0/keys/dh1024.pem
   server 10.8.0.0 255.255.255.0
   ifconfig-pool-persist /var/log/openvpn/ipp-v4.txt
   push “redirect-gateway def1 bypass-dhcp”
   push “dhcp-option DNS 10.8.0.1″
   push “dhcp-option DNS 8.8.8.8″
   push “dhcp-option DNS 8.8.4.4″
   keepalive 10 120
   cipher AES-128-CBC   # AES
   comp-lzo
   ;max-clients 100
   user nobody
   group nobody
   persist-key
   persist-tun
   status openvpn-status-v4.log
   log         /var/log/openvpn/openvpn-v4.log
   ;log-append  openvpn.log
   verb 3
      这个配置是向客户端分配10.8.0.0网段的IP的。
server-v6.conf文件如下:
   local YOUR.SERVER.IPV6.ADDRESS
   port 9999
   proto udp6
   dev tun
   ca /etc/openvpn/2.0/keys/ca.crt
   cert /etc/openvpn/2.0/keys/server.crt
   key /etc/openvpn/2.0/keys/server.key # This file should be kept secret
   dh /etc/openvpn/2.0/keys/dh1024.pem
   server 10.8.1.0 255.255.255.0
   ifconfig-pool-persist /var/log/openvpn/ipp-v6.txt
   push “redirect-gateway def1 bypass-dhcp”
   push “dhcp-option DNS 10.8.1.1″
   push “dhcp-option DNS 8.8.8.8″
   push “dhcp-option DNS 8.8.4.4″
   keepalive 10 120
   cipher AES-128-CBC # AES
   comp-lzo
   ;max-clients 100
   user nobody
   group nobody
   persist-key
   persist-tun
   status openvpn-status-v6.log
   log /var/log/openvpn/openvpn-v6.log
   ;log-append openvpn.log
   verb 3

   这个配置是向客户端分配10.8.1.0网段的IP的。

第七步,配置iptables的转发。
   上面的配置是使得客户端能够连接到服务器上,现在配置iptables,让服务器通过自己的公网IP转发客户端的请求。对于非VPS和Xen架构的VPS可以使用命令:
      iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE #v4的转发
   iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE #v6的转发

我等OpenVZ架构的只能用下面的(感谢这位兄台的指导!):
      iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j SNAT –to-source 公网IP
   iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o venet0 -j SNAT –to-source 公网IP

然后 service iptables save && service iptables restart 即可。

第八步,修改内核转发设置。
      sysctl -w net.ipv4.ip_forward=1

第九步,启动OpenVPN。
   /usr/local/sbin/openvpn –config /etc/openvpn/2.0/conf/server-v4.conf &
   /usr/local/sbin/openvpn –config /etc/openvpn/2.0/conf/server-v6.conf &

如需要开机启动,可以把他们加入到/etc/rc.local中。

第十步,客户端安装,打补丁,拷证书,写配置。
   Windows用户请下载官网安装包并用补丁替换原来的一个文件。补丁可以留言问我要。
   把前面提到的ca.crt, server.crt, client0.crt, client0.key放在安装目录中的config文件夹中。
   同样这个文件夹中放入一个配置文件client.ovpn,里面这样写:
   client
   dev tun
   proto udp
   remote 【v4版本的IP】 8888
   ca ca.crt
   cert client0.crt
   key client0.key
   ns-cert-type server
   cipher AES-128-CBC
   comp-lzo
   comp-noadapt
   verb 2
   route-method exe
   route-delay 2

或者
   client
   dev tun
   proto udp6
   remote 【v6版本的IP】 9999
   ca ca.crt
   cert client1.crt
   key client1.key
   ns-cert-type server
   cipher AES-128-CBC
   comp-lzo
   comp-noadapt
   verb 2
   route-method exe
   route-delay 2

至此,基本算是大功告成!

还有一个要注意的是,在Windows 7之类的操作系统上,OpenVPN GUI这个程序要用管理员账户运行。之前我一直是能够连上VPN但是不能够上网,开始以为是服务器的iptables转发弄错了,后来搜索一下才知道,可能是客户端的路由没有加进去。查看一下OpenVPN客户端的log,果然如此:
Thu Jun 14 19:34:41 2012 Notified TAP-Win32 driver to set a DHCP IP/netmask of 10.8.1.6/255.255.255.252 on interface {961D3633-CF56-4DE2-8A5F-37F5296ED666} [DHCP-serv: 10.8.1.5, lease-time: 31536000]
Thu Jun 14 19:34:43 2012 ERROR: Windows route add command failed: returned error code1
Thu Jun 14 19:34:43 2012 ERROR: Windows route add command failed: returned error code1
Thu Jun 14 19:34:43 2012 ERROR: Windows route add command failed: returned error code1
Thu Jun 14 19:34:43 2012 Initialization Sequence Completed

管理员权限惹的祸啊~ 害我茫然了好几天。

  19 Responses to “折腾了支持IPv6的VPN出来”

  1. 也是挺爱折腾的啊 呵呵

  2. [...] 5.x,已经安装好了OpenVPN 2.1.1,MySQL [...]

  3. 你好,请问您那边用openvpn 4in6的时候,有没有出现ipv6无法正常访问的情况?
    还请您不吝赐教。谢谢。

    • 我用的时候是没有问题的。连接到IPV6的VPN之后也可以正常访问六维空间之类的网站,VPN只在路由表里加入了V4的路由,V6的没变。

      • 我的情况是这样的,我在server侧push了dns
        然后问题就来了:
        如果我直接在命令框里执行
        ping ipv6.google,com
        就会发现因为TAP-win32的虚拟网卡上根本没有Global的IPv6地址,于是只会向我自己push下去的dns server发送A记录查询,不会继续查询AAAA记录查询,导致无法正常访问IPv6网址。
        刚才我也试了试,不push dns选项的话,确实正常访问ipv6.

  4. [...] 全文基本参照折腾了支持IPv6的VPN出来,当然也参考了很多相同内容的文章,如photonVPS搭建支持ipv6的openvpn一文,都各有千秋,但是大致相同,就不一一列举了。 [...]

  5. 兄弟,给我发个Windows7 的补丁啊。malibo8407@gmail.com 官网被墙了。

  6. 现在openvpn原生支持ipv6了,可以直接安装不用patch,其他还一样吧?

  7. 博主你好,你好,IPV6的VPN客户端补丁能不能发我一份,谢谢 56415760@qq.com
    我自己在GOOGLE上找到一个openvpn.exe-2.1.1-ipv6-0.4.10.zip的补丁,运行时提示 无法定位程序输入点EVP_md2于动态链接库libeay32.dll上 。

  8. 正需要这个。
    开ipv6的VPN,网站会被墙和谐吗?

 Leave a Reply

(必须填写)

(必须填写,邮件地址不会被泄露)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>