apt-get update
apt-get install openvpn 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数字证书认证机构,负责颁发证书,用于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服务器配置
cd keys/
ls -l
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem ../../
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
# 防火墙设置
net.ipv4.ip_forward=1
sysctl -p
启动服务端
$ systemctl start openvpn@server
$ systemctl enable openvpn@server
#客户端文件制作
cd /etc/openvpn/ca/keys
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
# vi 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结尾的形式
# 测试工具推荐:
windows:
openvpn gui: https://openvpn.net/index.php/open-source/downloads.html
# 账号密码分配
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
cat /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工具中