以
ubuntu
系统为例
安装
- $ sudo su
- $ apt-get update
- $ apt-get install openvpn easy-rsa
easy-rsa
为证书生成软件
证书制作
创建默认证书
- $ make-cadir /etc/openvpn/ca
- $ cd /etc/openvpn/ca
更改证书默认设置
- $ vim vars
更改证书的如下内容
- export KEY_COUNTRY="US"
- export KEY_PROVINCE="CA"
- export KEY_CITY="SanFrancisco"
- export KEY_ORG="Fort-Funston"
- export KEY_EMAIL="me@myhost.mydomain"
- export KEY_OU="MyOrganizationalUnit"
有一个
KEY_NAME
, 值可自定义,例如server
- export KEY_NAME="server"
保存生效
- $ source vars
CA 证书
CA 数字证书认证机构, 负责颁发证书,用于 openvpn 服务器和客户端的认证
- $ ./clean-all
- $ ./build-ca
./build-ca
后一直回车确认,或者./build-ca --batch
保持默认设置,无须回车确认 之后证书的制作命令,直接按照添加--batch
执行,也可不添加,不再单独说明
服务器证书
- ./build-key-server --batch server
server
为之前 vars 里export KEY_NAME="server"
的值 自定义 server 或者其他时后面需要在服务器配置文件中 client 名称可自定义, 如果修改最后在客户端配置文件中,需更改对应如下,作为修改之后的证书
- cert server.crt
- key server.key
制作 Diffie-Hellman key
- $ ./build-dh
生成 HMAC 签名加强 TLS 认证
- $ openvpn --genkey --secret keys/ta.key
客户端证书
- $ ./build-key --batch client
client
名称可自定义, 如果修改最后在客户端配置文件中,更改对应
- cert client.crt
- key client.key
openvpn
服务器配置
移动证书
进入
keys
目录可以看到生成的证书文件 我们需要 ca.crt ca.key server.crt server.key ta.key dh2048.pemserver
为之前自定义的服务器证书名
- # cd keys/
- # ls -l
- total 92
- drwx------ 2 root root 4096 Sep 26 20:18 ./
- drwx------ 3 root root 4096 Sep 26 20:10 ../
- -rw-r--r-- 1 root root 5685 Sep 26 20:15 01.pem
- -rw-r--r-- 1 root root 5578 Sep 26 20:18 02.pem
- -rw-r--r-- 1 root root 1801 Sep 26 20:12 ca.crt
- -rw------- 1 root root 1704 Sep 26 20:12 ca.key
- -rw-r--r-- 1 root root 5578 Sep 26 20:18 client.crt
- -rw-r--r-- 1 root root 1094 Sep 26 20:18 client.csr
- -rw------- 1 root root 1708 Sep 26 20:18 client.key
- -rw-r--r-- 1 root root 424 Sep 26 20:17 dh2048.pem
- -rw-r--r-- 1 root root 287 Sep 26 20:18 index.txt
- -rw-r--r-- 1 root root 21 Sep 26 20:18 index.txt.attr
- -rw-r--r-- 1 root root 21 Sep 26 20:15 index.txt.attr.old
- -rw-r--r-- 1 root root 142 Sep 26 20:15 index.txt.old
- -rw-r--r-- 1 root root 3 Sep 26 20:18 serial
- -rw-r--r-- 1 root root 3 Sep 26 20:15 serial.old
- -rw------- 1 root root 636 Sep 26 20:37 ta.key
- -rw-r--r-- 1 root root 5685 Sep 26 20:15 server.crt
- -rw-r--r-- 1 root root 1090 Sep 26 20:15 server.csr
- -rw------- 1 root root 1704 Sep 26 20:15 server.key
复制证书文件到
/etc/openvpn
当前目录是/etc/openvpn/ca/keys
,所以../../
就是配置目录
- $ cp ca.crt ca.key server.crt server.key ta.key dh2048.pem ../../
修改配置文件
复制配置文件模板到
/etc/openvpn/
, 解压后修改
- $ cd ../../
- $ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
- $ gzip -d server.conf.gz
- $ vim server.conf
以下内容替换为证书的路径名称,同路径下可直接写名称
- ca ca.crt
- cert server.crt
- key server.key
- dh dh2048.pem
服务器证书一开始就命名为
server
默认值,后面就不用修改了
取消下面的注释 (删掉;)
- ;push "redirect-gateway def1 bypass-dhcp"
- ;push "dhcp-option DNS 208.67.222.222"
- ;push "dhcp-option DNS 208.67.220.220"
- ;user nobody
- ;group nogroup
路由器作为 client 的话设置的话,
DNS
那里两行仍然是一个注释
去掉下面的注释,并再下一行添加key-direction 0
- ;tls-auth ta.key 0 # This file is secret
防火墙设置
我们使用云服务商的服务器,千万不要自己设置防火墙,我们做一个
iptables
打开 ip
转发
修改
/etc/sysctl.conf
- $ vim /etc/sysctl.conf
取消注释
- net.ipv4.ip_forward=1
生效
- $ sysctl -p
iptables
设置
- $ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
- $ iptables-save > /etc/openvpn-rule
- $ cd /etc/
- $ iptables-restore < openvpn-rule
启动服务端
- $ systemctl start openvpn@server
- $ systemctl enable openvpn@server
客户端文件制作
- $ cd /etc/openvpn/ca/keys
- $ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
编辑
client.conf
- ;local a.b.c.d
- remote my-server-1 1194
- ;user nobody
- ;group nogroup
去掉里面的
;
,第一个local
后面设置为0.0.0.0
, 第二句的my-server-1
换为server
端的ip
或者自己绑定的域名
删掉分号:
- ;tls-auth ta.key 1
并在下一行添加
- key-direction 1
为了简单,客户端导入的文件我们就只用一个.ovpn 的文件, 在服务端的
ubuntu
运行
- $ cd
- $ mkdir /client/ovpn
- $ cat /etc/openvpn/ca/keys/client.conf <(echo -e '<ca>') /etc/openvpn/ca/keys/ca.crt <(echo -e '</ca>\n<cert>') /etc/openvpn/ca/keys/client.crt <(echo -e '</cert>\n<key>') /etc/openvpn/ca/keys/client.key <(echo -e '</key>\n<tls-auth>') /etc/openvpn/ca/keys/ta.key <(echo -e '</tls-auth>') > ~/client/ovpn/client.ovpn
client.ovpn
由更改:
- ca ca.crt
- cert client.crt
- key client.key
- tls-auth ta.key 1
为:
- ca [inline]
- cert [inline]
- key [inline]
- tls-auth [inline] 1
进入
/client/ovpn
目录,将client.ovpn
给复制出来,直接复制内容或者用scp
等,文件一定是.ovpn
结尾的形式
测试工具推荐
mac
:
tunnelblickwindows
:
openvpn gui
账号密码分配
服务端的
server.conf
配置:
- $ vim /etc/openvpn/server.conf
追加:
- # use username and password login
- auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
- client-cert-not-required
- username-as-common-name
- script-security 3 execve
/etc/openvpn/checkpsw.sh
内容
- #!/bin/sh
- ###########################################################
- # checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
- #
- # This script will authenticate OpenVPN users against
- # a plain text file. The passfile should simply contain
- # one row per user with the username first followed by
- # one or more space(s) or tab(s) and then the password.
- PASSFILE="/etc/openvpn/psw-file"
- LOG_FILE="/etc/openvpn/openvpn-password.log"
- TIME_STAMP=`date "+%Y-%m-%d %T"`
- ###########################################################
- if [ ! -r "${PASSFILE}" ]; then
- echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
- exit 1
- fi
- CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
- if [ "${CORRECT_PASSWORD}" = "" ]; then
- echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
- exit 1
- fi
- if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
- echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
- exit 0
- fi
- echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
- exit 1
配置账号密码
- $ cd /etc/openvpn
- $ vim psw-file
形式如下:
- xu3352 123456@
表示账号密码,一行一个,账号密码空格分开
重启 openvpn
- $ /etc/init.d/openvpn restart
最后一步,客户端的文件 client.ovpn
新添加:
- auth-user-pass
修改之后,客户端文件需要重新导入到本地
openvpn
工具中
本文作者为 olei,转载请注明。
这种的封的很厉害
@鸟叔自己团体内部的内部测试网站之类的来使用还是没什么问题的 [aru_1]
@olei 老哥,这个服务端和客户端的配置文件要怎么写啊。我改了一份,可是不能用啊