openvpn_logoOpenVPN是一个用于创建VPN加密通道的软件包,最早由James Yonan编写。大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Windows 2000/XP/Vista上运行,並包含了许多安全性的功能。

服务端

1.安装基础编译工具和OpenSSL
CentOS: yum install gcc gcc-c++ kernel-devel openssl-devel
Ubuntu: apt-get install build-essential libssl-dev
2. 下载LZO和OpenVPN以及IPv6 Patch并编译安装
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz
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 –no-check-certificate
gunzip -d openvpn-2.1.1-ipv6-0.4.11.patch.gz
tar zxvf *.tar.gz
patch –p0 < openvpn-2.1.1-ipv6-0.4.11.patch
cd lzo-2.04 && ./configure && make && make install
cd ../openvpn-2.1.1 && ./configure && make && make install
cd .. && cp -r ./openvpn-2.1.1/easy-rsa/ -r /etc/openvpn  #拷贝配置文件到/etc/openvpn

Tips:

如果patch文件这样生成 diff –uN from-file to-file > to-file.patch

patch –p0 < to-file.patch

如果patch文件这样生成 diff –uNr from-docu to-docu >to-docu.patch

patch –p1 < to-docu.patch

3.生成证书

初始化PKI

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="logicmd" #引号要用英文半角符号
export KEY_EMAIL="i[at]logicmd.net" #引号要用英文半角符号
. vars
4.创建证书颁发机构(CA)
./clean-all #这行命令是清空Keys文件夹下的所有文件
./build-ca

接下来的信息你可以自己填写

5. 建立server key
./build-key-server server

接下来的信息你可以自己填写

6. 生成client key
./build-key client1 # client1 可以自定义 这个是客户的名字

接下来的信息你可以自己填写

7.以此类推建立其他客户端 key

当然你也可以不用,也可以在使用中在添加,不过比较麻烦,文章后会有教程

./build-key client2
./build-key client3

注意在进入 Common Name (eg, your name or your server’s hostname) []: 的输入时, 每个证书输入的名字必须不同.

8. 生成Diffie Hellman参数 (这个很重要)
./build-dh

(如果这里发生错误,请尝试:openssl dhparam -out ./keys/dh1024.pem 1024)

9. 将 keys 下的client.key/crt和ca.crt打包下载到本地(可以通过winscp,http,ftp等等……)
#排除掉ca.key和server.key
find ./ -name "*.crt" -or -name "*.key" -not -name "server.key" -not -name "ca.key" |  xargs tar czvf yourkeys.tar.gz
10.创建服务端配置文件
mkdir /etc/openvpn/2.0/conf
cp /root/openvpn-2.1.1/sample-config-files/server.conf /etc/openvpn/2.0/conf/server.conf
11.用你最喜欢的编辑器编辑配置文件

(但是不建议记事本/notepad.exe),这里直接放出ipv4和ipv6的OpenVPN的配置文件

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-udp.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-udp.log
log         /var/log/openvpn/openvpn-udp.log
;log-append  openvpn.log
verb 3
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/ipp-udp6.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 /var/log/openvpn-status-udp6.log
log         /var/log/openvpn/openvpn-udp6.log
;log-append  openvpn.log
verb 3
12.OpenVPN 访问外网的设置(如果不设置,你连上后只能在你和VPS之间建立VPN)

如果你跟偶一样很多类型VPN,很多NAT的话直接

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

如果你想精细控制不同NAT地址转发情况的话,可以分别设置

#OpenVPN IPv4
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
#OpenVPN IPv6
iptables -t nat -A POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE

(如果你运行上面的出现 iptables: Unknown error 4294967295 这样的错误,可以尝试下面的)

/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -j SNAT –to-source [你的IP地址]

对于OpenVZ的VPS讲eth0换成venet0即可

继续输入

service iptables save
service iptables restart

修改包转发设置

sysctl -w net.ipv4.ip_forward=1
13. 设置 OpenVPN 服务器 reboot后自动启动 openvpn
vim /etc/rc.local
#添加以下内容
/usr/local/sbin/openvpn --config /etc/openvpn/2.0/conf/server-udp.conf &
/usr/local/sbin/openvpn --config /etc/openvpn/2.0/conf/server-udp6.conf &
sysctl -w net.ipv4.ip_forward=1
iptables --table nat --append POSTROUTING --jump MASQUERADE

虽说是前面save了iptables到系统文件,但是根据我的经验,VPS down掉重启后,还是需要重新设置iptables。

14.最后启动 OpenVPN
/usr/local/sbin/openvpn --config /etc/openvpn/2.0/conf/server-udp.conf &
/usr/local/sbin/openvpn --config /etc/openvpn/2.0/conf/server-udp6.conf &
#如要看到日志可以如此观看
tail -f /var/log/openvpn/openvpn-udp.log
#或者
tail -f /var/log/openvpn/openvpn-udp6.log
15.添加一个小脚本,用于继续添加客户端的KEY
#!/bin/bash
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_ORG="logicmd"
export KEY_EMAIL="i[at]logicmd.net"
export KEY_COUNTRY=US
export KEY_PROVINCE=CA
export KEY_CITY=SanFrancisco
./vars
./build-key 

客户端

1.分发配置文件给用户

将配置文件vpn.ovpn,证书 ca.crt client.crt client.key分发给用户。

client
dev tun
proto udp
remote YOUR.SERVERS.IPV4.DOMAINNAME 8888
resolv-retry infinite
nobind
#个人感觉客户端不必,降权后不利于路由表管理
;user nobody
;group nobody
persist-key
persist-tun
ca ca.crt
cert logicmd.crt
key logicmd.key
ns-cert-type server
cipher AES-128-CBC   # AES
comp-lzo
verb 2
mute 20
script-security 2
# Here comes the route table.
max-routes 1500

接下来按照 给VPN添加路由表 添加路由表即可。

2.客户端的安装

具体详见VPN配置手册

FAQ

1.Windows路由表速度过慢

删掉以下

route-method exe
route-delay 2

2.满屏幕的路由信息看着烦.opvn改成

verb 2
mute 20

即可。