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

olei 8,954 views 3

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

ubuntu 系统为例

安装

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

easy-rsa 为证书生成软件

证书制作

创建默认证书

  1. $ make-cadir /etc/openvpn/ca
  2. $ cd /etc/openvpn/ca

更改证书默认设置

  1. $ vim vars

更改证书的如下内容

  1. export KEY_COUNTRY="US"
  2. export KEY_PROVINCE="CA"
  3. export KEY_CITY="SanFrancisco"
  4. export KEY_ORG="Fort-Funston"
  5. export KEY_EMAIL="me@myhost.mydomain"
  6. export KEY_OU="MyOrganizationalUnit"

有一个 KEY_NAME, 值可自定义,例如 server

  1. export KEY_NAME="server"

保存生效

  1. $ source vars

CA 证书

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

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

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

服务器证书

  1. ./build-key-server --batch server

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

  1. cert server.crt
  2. 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. cert client.crt
  2. key client.key

openvpn 服务器配置

移动证书

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

  1. # cd keys/
  2. # ls -l
  3. total 92
  4. drwx------ 2 root root 4096 Sep 26 20:18 ./
  5. drwx------ 3 root root 4096 Sep 26 20:10 ../
  6. -rw-r--r-- 1 root root 5685 Sep 26 20:15 01.pem
  7. -rw-r--r-- 1 root root 5578 Sep 26 20:18 02.pem
  8. -rw-r--r-- 1 root root 1801 Sep 26 20:12 ca.crt
  9. -rw------- 1 root root 1704 Sep 26 20:12 ca.key
  10. -rw-r--r-- 1 root root 5578 Sep 26 20:18 client.crt
  11. -rw-r--r-- 1 root root 1094 Sep 26 20:18 client.csr
  12. -rw------- 1 root root 1708 Sep 26 20:18 client.key
  13. -rw-r--r-- 1 root root  424 Sep 26 20:17 dh2048.pem
  14. -rw-r--r-- 1 root root  287 Sep 26 20:18 index.txt
  15. -rw-r--r-- 1 root root   21 Sep 26 20:18 index.txt.attr
  16. -rw-r--r-- 1 root root   21 Sep 26 20:15 index.txt.attr.old
  17. -rw-r--r-- 1 root root  142 Sep 26 20:15 index.txt.old
  18. -rw-r--r-- 1 root root    3 Sep 26 20:18 serial
  19. -rw-r--r-- 1 root root    3 Sep 26 20:15 serial.old
  20. -rw------- 1 root root  636 Sep 26 20:37 ta.key
  21. -rw-r--r-- 1 root root 5685 Sep 26 20:15 server.crt
  22. -rw-r--r-- 1 root root 1090 Sep 26 20:15 server.csr
  23. -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. $ cd ../../
  2. $ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
  3. $ gzip -d server.conf.gz
  4. $ vim server.conf

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

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

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

  1. ;push "redirect-gateway def1 bypass-dhcp"
  2. ;push "dhcp-option DNS 208.67.222.222"
  3. ;push "dhcp-option DNS 208.67.220.220"
  4. ;user nobody
  5. ;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. $ iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
  2. $ iptables-save > /etc/openvpn-rule
  3. $ cd /etc/
  4. $ iptables-restore < openvpn-rule

启动服务端

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

客户端文件制作

  1. $ cd /etc/openvpn/ca/keys
  2. $ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .

编辑 client.conf

  1. ;local a.b.c.d
  2. remote my-server-1 1194
  3. ;user nobody
  4. ;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. $ cd
  2. $ mkdir /client/ovpn
  3. $ 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. ca ca.crt
  2. cert client.crt
  3. key client.key
  4. tls-auth ta.key 1

为:

  1. ca [inline]
  2. cert [inline]
  3. key [inline]
  4. tls-auth [inline] 1

进入/client/ovpn 目录,将 client.ovpn 给复制出来,直接复制内容或者用 scp 等,文件一定是.ovpn 结尾的形式

测试工具推荐

账号密码分配

服务端的 server.conf 配置:

  1. $ vim /etc/openvpn/server.conf

追加:

  1. # use username and password login
  2. auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
  3. client-cert-not-required
  4. username-as-common-name
  5. script-security 3 execve

/etc/openvpn/checkpsw.sh 内容

  1. #!/bin/sh
  2. ###########################################################
  3. # checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
  4. #
  5. # This script will authenticate OpenVPN users against
  6. # a plain text file. The passfile should simply contain
  7. # one row per user with the username first followed by
  8. # one or more space(s) or tab(s) and then the password.
  9. PASSFILE="/etc/openvpn/psw-file"
  10. LOG_FILE="/etc/openvpn/openvpn-password.log"
  11. TIME_STAMP=`date "+%Y-%m-%d %T"`
  12. ###########################################################
  13. if [ ! -r "${PASSFILE}" ]; then
  14.   echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
  15.   exit 1
  16. fi
  17. CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
  18. if [ "${CORRECT_PASSWORD}" = "" ]; then
  19.   echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  20.   exit 1
  21. fi
  22. if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
  23.   echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
  24.   exit 0
  25. fi
  26. echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
  27. exit 1

配置账号密码

  1. $ cd /etc/openvpn
  2. $ vim psw-file

形式如下:

  1. xu3352 123456@

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

重启 openvpn

  1. $ /etc/init.d/openvpn restart

最后一步,客户端的文件 client.ovpn
新添加:

  1. auth-user-pass

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

发表评论 取消回复
表情 图片 链接 代码

  1. 鸟叔
    鸟叔 Lv 1

    这种的封的很厉害

    • olei
      olei 站长

      @鸟叔自己团体内部的内部测试网站之类的来使用还是没什么问题的 [aru_1]

      • 123321
        123321 Lv 1

        @olei 老哥,这个服务端和客户端的配置文件要怎么写啊。我改了一份,可是不能用啊

分享