openvpn多数人用来科学上网,能保证安全性与速度,同时配置和稳定性也非常好。我在生产环境中也使用了很久,但比较懒一直都没有整理文档,这次正好有两台服务器之间要做加密连接,简单整理了一下

一、安装

下载:


wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.11.tar.gz

依赖包:

yum install gcc gcc-c++ make  -y
yum install lzo lzo-devel -y
yum install pam pam-devel -y
yum install openssl openssl-devel -y

编译和安装:

./configure --prefix=/usr/local/openvpn
make && make install

epel源里有openvpn,也可以用yum 安装:


yum install -y epel-release
yum install openvpn easy-rsa

二、SSL证书生成

easy-rsa是openvpn生成服务端证书的脚本,自openvpn 2.3开始easy-rsa已经独立出来,下载:

git clone https://github.com/OpenVPN/easy-rsa
cd easy-rsa/easyrsa3/

初始化生成证书所需的信息,按实际情况修改:

cp vars.example vars

取消并修改以下选项:

set_var EASYRSA_REQ_COUNTRY     "CN"
set_var EASYRSA_REQ_PROVINCE    "Hongkong"
set_var EASYRSA_REQ_CITY        "Hongkong"
set_var EASYRSA_REQ_ORG         "NIXOPS.ME"
set_var EASYRSA_REQ_EMAIL       "admin@nixops.me"
set_var EASYRSA_REQ_OU          "Nixops Openvpn"

其它参数可以默认,也可以按需修改

初始化并创建ca根证书:

./easyrsa init-pki
./easyrsa build-ca

一路回车即可,ca证书需要输入密码,这个密码是给服务器端和客户端签名时用的
创建并签名服务器端证书:

./easyrsa gen-req server-ssl nopass
./easyrsa sign server server-ssl

同样一路回车即可
创建Diffie-Hellman证书,该证书主要作用是确保共享KEY安全穿越不安全网络:

./easyrsa gen-dh

创建并签名客户端证书:

./easyrsa gen-req client-ssl nopass
./easyrsa sign client client-ssl

所有证书文件:

[root@nixops.me easyrsa3]# tree pki
pki
├── ca.crt    -->ca证书, server/client 都需要
├── certs_by_serial
│   ├── 01.pem
│   └── 02.pem
├── dh.pem    -->Diffie-Hellman证书,server端需要
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── issued
│   ├── client-ssl.crt    --> 客户端证书
│   └── server-ssl.crt    --> 服务器端证书
├── private
│   ├── ca.key
│   ├── client-ssl.key    --> 客户端私钥
│   └── server-ssl.key    --> 服务器端私钥
├── reqs
│   ├── client-ssl.req
│   └── server-ssl.req
├── serial
└── serial.old

三、配置openvpn服务器端和客户端

3.1 服务器端配置

openvpn的源码目录中已经有配置模版了,复制模版:

[root@nixops.me openvpn-2.3.11]# cp   sample/sample-config-files/server.conf  /etc/openvpn/

复制证书文件:

[root@nixops.me easyrsa3]# cp pki/ca.crt pki/issued/server-ssl.crt pki/private/server-ssl.key /etc/openvpn/

贴一份服务器端配置:

#openvpn监听本地ip地址,可选
;local a.b.c.d
#监听tcp或udp端口,如果有多个服务端,要设置不同的端口
port 1194
#tcp模式还是udp模式
proto tcp
#虚拟网络接口类型:1. TUN :路由模式,工作在三层,无物理地址,效率高;无法与物理网卡桥接,会无视广播包,客户端可以是TUN/TAP
#2. TAP :桥接模式,工作在二层,有物理地址,效率不如TUN;可以与物理网卡桥接,广播包可以通过,客户端必须是TAP
dev tun
#证书配置
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server-ssl.crt
key /etc/openvpn/server-ssl.key
dh /etc/openvpn/dh.pem
#客户端使用的网段
server 10.8.0.0 255.255.255.0
#维持客户和ip的对应关系,重连后能保持虚拟ip
ifconfig-pool-persist ipp.txt
#为客户端推送路由,允许客户端访问其它网段
;push "route 192.168.10.0 255.255.255.0"
#设置所有客户端默认网关为VPN,所有流量经过vpn
;push "redirect-gateway def1 bypass-dhcp"
#为客户端推送DNS
;push "dhcp-option DNS 208.67.222.222"
#允许客户端之间互相访问
client-to-client
#允许多个客户端使用相同证书连接
duplicate-cn
#存活检测,每10秒检测一次,120秒未响应则认为连接丢失
keepalive 10 120
#对数据进行压缩,server和client 需保持一致
comp-lzo
#最大客户端数量
;max-clients 100
#重新连接时,不重新读取key和保持tun/tap设备在线
persist-key
persist-tun
#记录openvpn状态信息
status openvpn-status.log
#记录并追加日志
;log         openvpn.log
;log-append  openvpn.log
#日志级别
verb 5

前台启动,检查配置是否正确:

/usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server.conf

如果启动没有错误,即可以daemon后台运行server:

/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf

开启路由转发:

sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
sysctl -p

防火墙策略配置:

允许vpn客户端所在网段流量转发到其它网卡:

iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT

将vpn客户端的流量转到eth0,允许vpn客户端上网,即NAT:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j  MASQUERADE

还需根据vpn服务器端的工作模式放开tcp/udp的1194端口,这个规则就不写了

3.2 客户端配置

客户端各系统下都有现成包,配置是通用的,我这里还是在linux下使用openvpn的客户端。

复制一份样板:

cp sample/sample-config-files/client.conf /etc/openvpn/

直接贴一份配置:

client
dev tun
proto tcp
remote openvpn.nixops.me  1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client-ssl.crt
key /etc/openvpn/client-ssl.key
remote-cert-tls server
comp-lzo
verb 3

多个vpn client在不同的内网时,可以在client.conf中根据client的网段push路由,会比在server.conf中指定更方便
测试启动:

/usr/local/sbin/openvpn --config /etc/openvpn/client.conf 

启动:

/usr/local/sbin/openvpn --daemon --config /etc/openvpn/client.conf --log /var/log/openvpn.log

总的来说配置还是比较简单的