
相比 IPSec+L2TP 来说,OpenVPN 有很多优点,比如其可以开在任意端口上,并且和 PPTP / L2TP 等并不冲突。于是周末在 Linode 上的 Debian 5 中安装了一个 Server,以备不时之需,笔记如下(该用 sudo 的地方自行使用,我这里都省略了):
安装:
aptitude install openvpn
准备工作:
cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ cd /etc/openvpn gzip -d server.conf.gz
初始化:
cd easy-rsa/2.0 source vars ./clean-all ./build-ca // 这里会问你很多问题,都回车默认就行了
生成服务器证书和密钥,同样一路回车吧,最后 Sign the certificate? 的时候要选择 yes,commit 也是 yes
./build-key-server server
生成客户端证书和密钥,把 client 换成客户端的名字,即 common name,操作和上一步一样
./build-key client
创建 Diffie Hellman,这步不需要干涉,就是比较慢。
./build-dh
编辑服务器端配置文件:
vi /etc/openvpn/server.conf
一些可能需要修改的关键部分:
;local a.b.c.d local YOUR.IP.ADDRESS // 这行是服务器的外网 IP 地址 port 1194 // 端口,客户端配置文件和服务器保持一致就行了,想玩狠一点就放在 53 上 ;proto tcp proto udp // 这两个二选一,默认是 udp,同样客户端和服务器端保持一致,但是我用 tcp 的时候非常慢,所以推荐使用 udp ;dev tap dev tun // 使用默认 tun (tunnel)模式 ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt cert /etc/openvpn/easy-rsa/2.0/keys/server.crt key /etc/openvpn/easy-rsa/2.0/keys/server.key # This file should be kept secret dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem // 证书和 dh 文件的位置 server 10.8.0.0 255.255.255.0 // 给客户端分配的 IP 段,千万不要和现有网段冲突 push "redirect-gateway def1 bypass-dhcp" // 把 openvpn 服务器作为网关 push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" // 推送 Google DNS 服务器到客户端 ;duplicate-cn // 每个用户只允许一个链接 ;max-clients 100 // 最多客户端数 ;user nobody ;group nogroup // 启动所用用户组 log openvpn.log ;log-append openvpn.log // 单独的日志,会出现在 /etc/openvpn ,第二种是追加模式
编辑客户端配置文件
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~ vi ~/client.conf
proto 等内容需要和 server.conf 保持一致,需要修改的部分:
remote SERVER.IP.ADDRESS 1194 // IP 和 端口按照服务器实际情况填写 ca ca.crt cert client.crt key client.key //后面两个要根据实际证书文件名修改
下载证书和配置文件,将服务器上如下四个文件下载到本地,放到某个文件夹中
/etc/openvpn/easy-rsa/2.0/keys/ca.crt /etc/openvpn/easy-rsa/2.0/keys/client.crt /etc/openvpn/easy-rsa/2.0/keys/client.key ~/client.conf
由于权限问题建议先打包再下载到本地解压
tar zcvf openvpn.tar.gz gkp.crt gkp.key ca.crt client.conf
启动 openvpn 并检查
/etc/init.d/openvpn start
我这里第一次启动失败,看 openvpn.log 提示
Note: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)
没有 tun 模块?
modprobe tun FATAL: Module tun not found.
果然。修正一下
mkdir -p /dev/net mknod /dev/net/tun c 10 200 chmod 600 /dev/net/tun
重新启动
/etc/init.d/openvpn start Starting virtual private network daemon: server.
没问题了。
Mac OS X 客户端程序选用开源的 Tunnelblick,我用的是最新的 3.1 beta 10,点击下载。
安装后,第一次启动会有向导,依次选择:
I have configuration files –> OpenVPN Configuration(s) –> Open Private Configurations Folder
会自动在 Finder 打开 Tunnelblick 的配置文件文件夹,也就是
~/Library/Application\ Support/Tunnelblick/Configurations/
将从服务器下载的几个文件复制到这个文件夹,最终效果应该是这样的:
之后在 Tunnelblick 里面连接就可以了。
如果有多台服务器,可以将配置文件放在 Configurations 下面的子目录中,这样的话 client.conf 里面 ca 文件名前面就需要加路径了,比如 ./linode/ca.crt
UPDATE:路由问题 Google 了一下,远比我想象的要简单。基本思路有两种,一种是保留原有国内网关,设置白名单走 VPN。第二种是默认都走 VPN,然后设置路由表所有国内 IP 都走国内网关。我之前一直用的就是第二种(一个添加路由的 bash 脚本,每次手工执行),这样做好处一是不用随时添加新近被功夫网认证的 IP 段,二是国内到 Fremont 机房的速度还不错,作为访问国外其他网站的跳板也是一个很好的选择。有了 OpenVPN 后,添加国内路由这个操作不再需要手工启动。
首先要介绍下 chnroutes 这个 googlecode 项目,这位作者提供了各个平台下各种 vpn 连接方式的国内路由脚本,具体使用方法可以看这里。OS X 搭配 Tunnelblick 的简要步骤如下:
wget http://chnroutes.googlecode.com/files/chnroutes_openvpn_v2.1
执行脚本,从 apnic 获取最新的中国 IP 段并且生成路由脚本
python chnroutes_openvpn_v2.1
结束后会生成一个 routes.txt 并提示你在配置文件的头部添加一条 max routes 的命令,注意实际添加时的数字要比脚本告诉你的稍微多出几十,容纳服务器推送过来的路由。然后将 routes.txt 的内容复制到本地配置文件(client.conf)的最后
cat routes.txt >> ~/Library/Application\ Support/Tunnelblick/Configurations/client.conf
重新连接 Thnnelblick 即可实现自动添加国内路由。
iPhone 上的客户端安装也十分方便,不过就是感觉意义不大,必须越狱而且没有状态提示,用户无法直观看到现在状态,而且不支持 max-routes 命令。
简单说一下吧,越狱后将没有 max-routes 的客户端配置文件(linode-iphone.conf)和三个证书文件扔到
/var/mobile/Library/OpenVpn
进 Cydia ,如果你没安装 SBSettings 的话安装一个,还有 OpenVpn Toggle for SBSettings
vi /var/mobile/Library/SBSettings/Commands/com.offinf.openvpnup
内容:
#!/bin/sh /bin/rm /var/mobile/Library/SBSettings/Toggles/OpenVpn/OFF cd /var/mobile/Library/OpenVpn/ /usr/bin/openvpn-iphone --script-security 2 --config /var/mobile/Library/OpenVpn/linode-iphone.conf &
测试执行:
chmod +x /var/mobile/Library/SBSettings/Commands/com.offinf.openvpnup sh /var/mobile/Library/SBSettings/Commands/com.offinf.openvpnup
如果没报错,并且测试 iPhone 网关已经变成 OpenVPN 服务器的 IP 的话就搞定了,以后可以随时使用 SBSettings 的开关开启,但是没有状态提示真是别扭呀。

Pingback: Tweets that mention Linode Debian 5 安装 OpenVPN 笔记 | gkp's post -- Topsy.com
Pingback: 使用 Mysql 验证 OpenVPN 用户笔记 | gkp's post
Pingback: Linux 系统连接 OpenVPN 无法获取推送 DNS 服务器的解决 | gkp's post
Pingback: 使用 MySQL 进行 PPP 验证 | gkp's post
博主可否写篇centos下,搭建openvpn的文章?centos下,搭建openvpn,我搞了多次都未搞定。谢谢先了
centos 应该和 debian 没什么区别,只不过使用 yum 安装软件包。你主要卡在哪里了?
Pingback: VPS教程合集(Debian/Ubuntu) - 鲜橙多的小屋
Pingback: VPS教程合集(CentOS) - 鲜橙多的小屋
gkp用OpenVPN连youtube慢吗??我这里卡死了。。不知道有没有什么好办法。。
Pingback: 在Linode上搭建OpenVPN « 细节的力量
Hey, 是不是漏掉了设置 iptable 端口转发的步骤?
Pingback: openvpn流量统计的一些问题的解决 | Michaelize