Fork me on GitHub

openvpn的搭建、使用以及设置分配用户密码

ubuntu系统为例

安装

1
2
3
$ sudo su
$ apt-get update
$ apt-get install openvpn easy-rsa

easy-rsa为证书生成软件

证书制作

  • 创建默认证书

    1
    2
    $ make-cadir /etc/openvpn/ca
    $ cd /etc/openvpn/ca
  • 更改证书默认设置

1
$ vim vars
  • 更改证书的如下内容
1
2
3
4
5
6
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
1
export KEY_NAME="server"
  • 保存生效
1
$ source vars
  • CA证书

    CA数字证书认证机构,负责颁发证书,用于openvpn服务器和客户端的认证

1
2
$ ./clean-all
$ ./build-ca

./build-ca 后一直回车确认,或者./build-ca --batch保持默认设置,无须回车确认 之后证书的制作命令,直接按照添加--batch执行,也可不添加,不再单独说明

  • 服务器证书
1
./build-key-server --batch server

server为之前vars里export KEY_NAME="server"的值 自定义server或者其他时后面需要在服务器配置文件中 client名称可自定义,如果修改最后在客户端配置文件中,需更改对应:

1
2
cert server.crt
key server.key

作为修改之后的证书

  • 制作Diffie-Hellman key
1
$ ./build-dh
  • 生成HMAC签名加强TLS认证
1
$ openvpn --genkey --secret keys/ta.key
  • 客户端证书
1
$ ./build-key --batch client

client名称可自定义,如果修改最后在客户端配置文件中,更改对应

1
2
cert client.crt
key client.key

openvpn服务器配置

  • 移动证书

    进入keys目录可以看到生成的证书文件 我们需要ca.crt ca.key server.crt server.key ta.key dh2048.pem server为之前自定义的服务器证书名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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,所以../../就是配置目录

1
$ cp ca.crt ca.key server.crt server.key ta.key dh2048.pem ../../
  • 修改配置文件

    复制配置文件模板到/etc/openvpn/,解压后修改

1
2
3
4
cd ../../
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
gzip -d server.conf.gz
vim server.conf

以下内容替换为证书的路径名称,同路径下可直接写名称

1
2
3
4
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

服务器证书一开始就命名为server默认值,后面就不用修改了
取消下面的注释(删掉;)

1
2
3
4
5
;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

1
;tls-auth ta.key 0 # This file is secret

防火墙设置

我们使用云服务商的服务器,千万不要自己设置防火墙,我们做一个iptables

  • 打开ip转发
    修改/etc/sysctl.conf
1
$ vim /etc/sysctl.conf

取消注释

1
net.ipv4.ip_forward=1

生效

1
sysctl -p
  • `iptables·设置
1
2
3
4
$ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
$ iptables-save > /etc/openvpn-rule
$ cd /etc/
$ iptables-restore < openvpn-rule

启动服务端

1
2
$ systemctl start openvpn@server
$ systemctl enable openvpn@server

客户端文件制作

1
2
$ cd /etc/openvpn/ca/keys
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
  • 编辑client.conf
1
2
3
4
;local a.b.c.d
remote my-server-1 1194
;user nobody
;group nogroup

去掉里面的;,第一个local后面设置为0.0.0.0,第二句的my-server-1换为server端的ip或者自己绑定的域名
删掉分号:

1
;tls-auth ta.key 1

并在下一行添加

1
key-direction 1
  • 为了简单,客户端导入的文件我们就只用一个.ovpn的文件,在服务端的ubuntu运行
1
2
3
$ 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更改:
1
2
3
4
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1

为:

1
2
3
4
ca [inline]
cert [inline]
key [inline]
tls-auth [inline] 1
  • 进入/client/ovpn目录,将 client.ovpn给复制出来,直接复制内容或者用scp等,文件一定是.ovpn结尾的形式

测试工具推荐:

账号密码分配

  • 服务端的server.conf配置:
1
$ vim /etc/openvpn/server.conf

追加:

1
2
3
4
5
# 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内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/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
  • 配置账号密码
1
2
$ cd /etc/openvpn
$ vim psw-file

形式如下:

1
xu3352 123456@

表示账号密码,一行一个,账号密码空格分开

  • 重启openvpn
1
$ /etc/init.d/openvpn restart
  • 最后一步,客户端的文件client.ovpn
    新添加:
1
auth-user-pass

修改之后,客户端文件需要重新导入到本地openvpn工具中

禹都一只猫,热爱IT,支持原创