使用 OpenVPN Access Server 轻松搭建 VPN 服务器

平时很少用 VPN,需要的时候一般用 ssh -D 搞定,或者 sshuttle 也是个不错的工具。自己配置 OpenVPN 虽然不是很麻烦,但对第一次配置 VPN 的新手来说还是挺费神费事的,如果急用或者怕麻烦的话可以选用 OpenVPN 的商业收费版本 OpenVPN Access Server,其免费的 license 可以支持2个 VPN 用户的同时在线,对个人用户来说足够用了。OpenVPN Access Server 装完即可用,无需配置。

安装

在 CentOS 6.x 上下载和安装 OpenVPN Access Server:

# yum update
# yum upgrade

# wget http://swupdate.openvpn.org/as/openvpn-as-2.0.7-CentOS6.i386.rpm

# rpm -ivh openvpn-as-2.0.7-CentOS6.i386.rpm
Preparing...                ########################################### [100%]
   1:openvpn-as             ########################################### [100%]
The Access Server has been successfully installed in /usr/local/openvpn_as
Configuration log file has been written to /usr/local/openvpn_as/init.log
Please enter "passwd openvpn" to set the initial
administrative password, then login as "openvpn" to continue
configuration here: https://173.252.243.254:943/admin
To reconfigure manually, use the /usr/local/openvpn_as/bin/ovpn-init tool.

Access Server web UIs are available here:
Admin  UI: https://173.252.243.254:943/admin
Client UI: https://173.252.243.254:943/

# passwd openvpn

在 Ubuntu 14.04 上下载和安装 OpenVPN Access Server(写这篇文章的时候 Ubuntu 14.04 刚刚发布,for Ubuntu 14.04 的官方版本还没有出来,可以使用 Ubuntu 13.10 的):

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install iptables
$ wget http://swupdate.openvpn.org/as/openvpn-as-2.0.7-Ubuntu13.i386.deb
$ sudo dpkg -i openvpn-as-2.0.7-Ubuntu12.i386.deb
$ sudo passwd openvpn

使用

打开管理界面 https://173.252.243.254:943/admin 使用用户名 openvpn 和密码登录,进去随便看一下就可以了,不用做任何配置就可以用:

OpenVPN Access Server

打开客户端界面 https://173.252.243.254:943/ 使用用户名 openvpn 和密码登录后下载 OpenVPN Connect for Mac OS X 客户端,安装后点击连接就可以用了,很方便。

OpenVPN Access Server

如果你想使用其他的 OpenVPN 客户端的话,比如 Tunnelblick,就需要下载客户端的配置文件 Yourself (user-locked profile) 或者 Anyone at this server (server-locked profile). 下载后的文件名是 client.ovpn,这个文件稍后会在配置 Tunnelblick 时用到。

Tunnelblick 是 Mac 上比较流行的一个开源 OpenVPN 客户端,另一个好用的客户端 Viscosity 是收费的。

下载 Tunnelblick 后安装,然后导入刚才下载的 client.ovpn 配置文件就可以了,导入的方法比较奇怪,桌面上会自动创建一个 Empty Tunnelblick VPN Configuration 文件夹,把 client.ovpn 拖进去后重命名文件夹(注意是文件夹不是文件)为 Empty Tunnelblick VPN Configuration.tblk 后双击文件夹导入,导入后点击 Connect 会弹出登录对话框,输入用户名 openvpn 及其密码就可以了。

OpenVPN Access Server

在 NetBSD 上安装和配置 OpenVPN

关于 OpenVPN 在 Linux 上的安装配置都写烂了,搜索一下到处都有,但是 NetBSD 上的资料并不多,VPSee 在这里简单记录一下在 NetBSD 上配置 OpenVPN 的过程,步骤和流程都是和 Linux 一样的,只不过具体操作的细节不同,相信我们的客户和熟悉 Linux 上 OpenVPN 的朋友能很快用我们的 64MB NetBSD VPS 架设一台经济实惠的个人用 OpenVPN 服务器出来。以下步骤在我们的 NetBSD VPS 上执行通过:

安装 OpenVPN Server

源码安装 OpenVPN 服务器(如果自己 /usr/ 下没有 pkgsrc 这个目录的话参考这篇文章:下载 pkgsrc 去下载解压一个):

# cd /usr/pkgsrc/net/openvpn
# make install clean clean-depends

拷贝 openvpn 启动配置文件到 NetBSD 的启动配置目录下,然后编辑 /etc/rc.conf 以便系统启动的时候自动运行 NetBSD:

# cp  /usr/pkg/share/examples/rc.d/openvpn /etc/rc.d

# vi /etc/rc.conf 
openvpn=YES

拷贝创建认证需要的一些脚本到 openvpn 的配置目录:

# cp /usr/pkg/share/openvpn/easy-rsa/* /usr/pkg/etc/openvpn/

给 vars 文件加写权限,然后做一些必要的编辑和定制:

# chmod +w /usr/pkg/etc/openvpn/vars
# vi /usr/pkg/etc/openvpn/vars

因为 vars 脚本需要 bash 才能运行,所以要先在 NetBSD 上安装 bash:

# cd /usr/pkgsrc/shells/bash2
# make install clean clean-depends

安装完 bash 后切入到 bash shell,然后运行:

# bash
bash-2.05b# source /usr/pkg/etc/openvpn/vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/pkg/etc/openvpn/keys

现在开始创建 certificate authority (CA):

# cd /usr/pkg/etc/openvpn/
# ./build-ca

给服务器创建 certificates 和 private key:

# ./build-key-server server

给客户端创建 keys:

# ./build-key client

创建 Diffie Hellman 密钥,Diffie–Hellman 是一种安全协议,可让双方在没有任何对方预先信息的条件下通过不安全隧道创建一个密钥,并且这个密钥可用在后续的通讯中来加密通讯内容。OpenVPN 必须要 Diffie Hellman 密钥:

# ./build-dh

拷贝 OpenVPN Server 的样例配置文件到 openvpn 的配置文件目录(如果客户端不幸需要通过 http 代理访问 openvpn server 的话,可以在 server.conf 做一些设置,具体看:用代理连接 OpenVPN 的问题):

# cp /usr/pkg/share/examples/openvpn/config/server.conf /usr/pkg/etc/openvpn/

启动 OpenVPN 服务器,首次启动出错是因为没有找到 dh1024.pem 文件,把 dh1024.pem 等文件从 /usr/pkg/etc/openvpn/keys 里拷到上级目录后再次启动就成功了:

# /etc/rc.d/openvpn start
Starting openvpn.
Aug  4 20:20:19  openvpn[1266]: Cannot open dh1024.pem for DH parameters: error:02001002:system library:fopen:No such file or directory: error:2006D080:BIO routines:BIO_new_file:no such file

# mv /usr/pkg/etc/openvpn/keys/* /usr/pkg/etc/openvpn/

# /etc/rc.d/openvpn start
Starting openvpn.
add net 10.8.0.0: gateway 10.8.0.2

查看 OpenVPN 服务器正常启动后是否生成 tun 设备:

# ifconfig -a
tun0: flags=8051 mtu 1500
        inet 10.8.0.1 -> 10.8.0.2 netmask 0xffffffff
        inet6 fe80::216:3eff:fe55:4f16%tun0 ->  prefixlen 64 scopeid 0x3

在内核打开 IP 转发功能,并把 IP 转发写到启动文件:

# sysctl -w net.inet.ip.forwarding=1

# vi /etc/sysctl.conf
net.inet.ip.forwarding=1

安装 OpenVPN Client

OpenVPN 客户端软件有多种、有支持 Linux, MacOS X 和 Windows 的、有图形界面的、也有命令行的,根据自己系统和喜好挑一个客户端,在 Mac 上 VPSee 推荐开源的 Tunnelblick,不同客户端的配置都差不多,主要是把服务器上的 ca.crt, client.crt, .csr, .key 等文件拷到客户端,然后调整一下客户端的配置以连接上服务器。

连接测试

连接后就会在客户端的日志看到类似这样的成功连接信息:

tunnelblick

用代理连接 OpenVPN 的问题

很多人在公司、学校都是通过代理服务器上的网,需要设置代理。我们有位客户在公司用代理上 OpenVPN 时遇到一个问题,他在我们的 VPS 上安装和配置好了 OpenVPN 服务,客户端也设置了代理 http-proxy 192.168.0.1 3128,可是就是连不上去。OpenVPN 客户端报错如下:

2010-05-16 15:46:48 Attempting to establish TCP connection with 192.168.0.1:3128 [nonblock]
2010-05-16 15:46:48
2010-05-16 15:46:49 TCP connection established with 192.168.0.1:3128
2010-05-16 15:46:49 Send to HTTP proxy: ‘CONNECT 206.221.200.200:1194 HTTP/1.0’
2010-05-16 15:47:40 recv_line: TCP port read timeout expired: Operation now in progress (errno=36)
2010-05-16 15:47:40 TCP/UDP: Closing socket
2010-05-16 15:47:40 process exiting

这是因为大部分代理服务器都封掉了非标准端口,并且很多管理员因为安全因素都封掉了非标准端口的 HTTP CONNECT,所以像 OpenVPN 的默认 1194 端口而且需要CONNECT 方法支持就不行。既然不能去要求公司管理员把 1194 端口打开,我们就只能在自己 VPS 上想办法,幸运的是大部分代理服务器都会开 443 端口并且可以 CONNECT,所以我们只需要修改自己 VPS 上 OpenVPN 服务器的监听端口,把它改成 443 就可以了,使用代理的话还必须用 TCP:

# vi /etc/openvpn/server.conf

# Which TCP/UDP port should OpenVPN listen on?
# If you want to run multiple OpenVPN instances
# on the same machine, use a different port
# number for each one.  You will need to
# open up this port on your firewall.
;port 1194
port 443

# TCP or UDP server?
proto tcp
;proto udp