更新记录:
- 2010年8月1日:初始版本
- 2012年2月8日:由于我的服务器之前已经有包转发设置,所以这篇笔记没有提到,致使很多读者配置不成功,所以这次更新加入了相关的内容。另外加入了源代码编译安装 OpenVPN 的一个简单笔记。
相比 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 ,第二种是追加模式
2012年2月8日更新开始
修改包转发设置
for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done vi /etc/sysctl.conf 修改 net.ipv4.ip_forward = 1 sysctl -p
启用包转发
iptables --table nat --append POSTROUTING --jump MASQUERADE
2012年2月8日更新结束
编辑客户端配置文件
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 的开关开启,但是没有状态提示真是别扭呀。
2012年2月8日更新,源代码安装 OpenVPN Server
今天需要在一台 CentOS 服务器上安装 OpenVPN Server,由于这台机器的 yum 有一些问题,所以采用源代码编译安装,步骤基本一样,说一下和用包管理安装的区别吧。
1,从官方下载源代码
2,解压缩,按照 README 的说明,依次执行安装:
./configure make make install
3,easy-rsa 目录在源代码的目录下
4,示范配置文件在源代码目录的 sample-config-files 目录下
5,配置文件位置无所谓,我放到了 /usr/local/etc/openvpn,所以启动命令就是:
/usr/local/sbin/openvpn /usr/local/etc/openvpn/server.conf
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
Pingback: OpenVZ vps openvpn安装 - OpenVZ VPN安装
Pingback: 把 E4200 变成一个 OpenVPN 网关 | gkp's post
按照你的教程成功在VPS上运行了OPENVPN服务,但是发现一个问题,一旦VPS重启,一定要重新启用包转发这个过程,否则客户端可以连接服务器,但是无法打开网页
iptables –table nat –append POSTROUTING –jump MASQUERADE
想问一下如何解决
放到 rc.local 里面执行
不太明白,因为刚接触linux不太熟悉命令,能详细一些吗?
已经解决,谢谢
恭喜!
18大开始后就无法连上了,请问你是怎么解决的?另外请教改为tcp模式,服务器端总是启动失败是什么原因?
OpenVPN已死
我这里还活着,嘿嘿
Pingback: openvz vps上unbuntu做openVPN X-Turtle
我的openvpn+squid 貌似只能tcp握手一次就访问不了了,tun是存在的,是什么原因呢。