Linode Debian 5 安装 OpenVPN 笔记

更新记录:

  • 2010年8月1日:初始版本
  • 2012年2月8日:由于我的服务器之前已经有包转发设置,所以这篇笔记没有提到,致使很多读者配置不成功,所以这次更新加入了相关的内容。另外加入了源代码编译安装 OpenVPN 的一个简单笔记。

openvpn_tun

相比 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/

将从服务器下载的几个文件复制到这个文件夹,最终效果应该是这样的:

openvpn_tunnelblick

之后在 Tunnelblick 里面连接就可以了。

如果有多台服务器,可以将配置文件放在 Configurations 下面的子目录中,这样的话 client.conf 里面 ca 文件名前面就需要加路径了,比如 ./linode/ca.crt

UPDATE:路由问题 Google 了一下,远比我想象的要简单。基本思路有两种,一种是保留原有国内网关,设置白名单走 VPN。第二种是默认都走 VPN,然后设置路由表所有国内 IP 都走国内网关。我之前一直用的就是第二种(一个添加路由的 bash 脚本,每次手工执行),这样做好处一是不用随时添加新近被功夫网认证的 IP 段,二是国内到 Fremont 机房的速度还不错,作为访问国外其他网站的跳板也是一个很好的选择。有了 OpenVPN 后,添加国内路由这个操作不再需要手工启动。

首先要介绍下 chnroutes 这个 googlecode 项目,这位作者提供了各个平台下各种 vpn 连接方式的国内路由脚本,具体使用方法可以看这里。OS X 搭配 Tunnelblick 的简要步骤如下:

下载 chnroutes_openvpn_v2.1

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
This entry was posted in 我的慵懒生活, 电脑相关 and tagged , , , , , . Bookmark the permalink.

25 Responses to Linode Debian 5 安装 OpenVPN 笔记

  1. Pingback: Tweets that mention Linode Debian 5 安装 OpenVPN 笔记 | gkp's post -- Topsy.com

  2. Pingback: 使用 Mysql 验证 OpenVPN 用户笔记 | gkp's post

  3. Pingback: Linux 系统连接 OpenVPN 无法获取推送 DNS 服务器的解决 | gkp's post

  4. Pingback: 使用 MySQL 进行 PPP 验证 | gkp's post

  5. moon says:

    博主可否写篇centos下,搭建openvpn的文章?centos下,搭建openvpn,我搞了多次都未搞定。谢谢先了

  6. Pingback: VPS教程合集(Debian/Ubuntu) - 鲜橙多的小屋

  7. Pingback: VPS教程合集(CentOS) - 鲜橙多的小屋

  8. moody says:

    gkp用OpenVPN连youtube慢吗??我这里卡死了。。不知道有没有什么好办法。。

  9. Pingback: 在Linode上搭建OpenVPN « 细节的力量

  10. Winus Peng says:

    Hey, 是不是漏掉了设置 iptable 端口转发的步骤?

  11. Pingback: openvpn流量统计的一些问题的解决 | Michaelize

  12. Pingback: OpenVZ vps openvpn安装 - OpenVZ VPN安装

  13. Pingback: 把 E4200 变成一个 OpenVPN 网关 | gkp's post

  14. 七月 says:

    按照你的教程成功在VPS上运行了OPENVPN服务,但是发现一个问题,一旦VPS重启,一定要重新启用包转发这个过程,否则客户端可以连接服务器,但是无法打开网页
    iptables –table nat –append POSTROUTING –jump MASQUERADE
    想问一下如何解决

  15. sabei says:

    18大开始后就无法连上了,请问你是怎么解决的?另外请教改为tcp模式,服务器端总是启动失败是什么原因?

  16. Pingback: openvz vps上unbuntu做openVPN X-Turtle

  17. axcept says:

    我的openvpn+squid 貌似只能tcp握手一次就访问不了了,tun是存在的,是什么原因呢。

Leave a Reply

Your email address will not be published.