OpenVPN2.3.10基于用户名密码验证方式组成局域网(Ubuntu16.04)

 

本文所设计的配置方式仅用于组成虚拟局域网,无法通过该局域网访问外网。

本文中所有命令都在ROOT权限下运行。

 

*******************实战服务端配置**************************

 

1、软件准备:

#apt install openvpn

#apt install easy-rsa

 

2、建立目录及秘钥和证书

#mkdir /usr/local/openvpn

#cd /usr/local/openvpn

#make-cadir  ca     // easy-rsa中的命令,生成一个ca目录

#cd ca

#vim vars    //修改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"

 

# X509 Subject Field

export KEY_NAME="EasyRSA"

 

#source ./vars    //导入vars中的变量

#./clean-all

#./build-ca      // 在keys目录中生成 ca.crt、ca.key

#./build-dh     // 运行时间比较长,生成keys/dh2048.pem

#./build-key-server    //在keys目录中生成server.crt、server.key、server.csr

 

至此我们已经准备好了秘钥、证书

 

3、编写服务端配置文件server.openvpn

#cd /usr/local/openvpn

#vim server.openvpn

 

port 1194             #指定监听的本机端口号

proto tcp      #指定采用的传输协议,可以选择tcp或udp

dev tun               #指定创建的通信隧道类型,可选tun或tap

ca /usr/local/openvpn/ca/keys/ca.crt          #指定CA证书的文件路径

cert /usr/local/openvpn/ca/keys/server.crt    #指定服务器端的证书文件路径

key /usr/local/openvpn/ca/keys/server.key   #指定服务器端的私钥文件路径

dh /usr/local/openvpn/ca/keys/dh2048.pem    #指定迪菲赫尔曼参数的文件路径

server 192.168.100.0 255.255.255.0   #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用192.168.100.1。

ifconfig-pool-persist ipp.txt   #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。

tls-auth /usr/local/openvpn/ca/keys/ta.key 0    #开启TLS-auth,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。

keepalive 10 120      #每10秒ping一次,连接超时时间设为120秒。

comp-lzo              #开启VPN连接压缩,如果服务器端开启,客户端也必须开启

client-to-client      #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接

persist-key

persist-tun           #持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。

status /var/log/openvpn/openvpn-status.log

log /var/log/openvpn/openvpn.log

log-append /var/log/openvpn/openvpn.log           #日志保存路径

verb 4                #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细

auth-user-pass-verify /usr/local/openvpn/checkpsw.sh via-env  #用户密码认证脚本

client-cert-not-required  #关闭证书认证方式

username-as-common-name    #用户登陆

script-security 3    #安全脚本方式认证

 

 

4、编写checkpsw.sh(网上找到的脚本都有错误,这里我修正了错误)

 

#vim 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="/usr/local/openvpn/psw-file"

LOG_FILE="/usr/local/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 '{if($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

#chmod +x  checkpsw.sh

 

5、编写密码文件:

#vim psw-file

test1 t123456

test2 t123456

test3 t123456

 

 

***************实战客户端配置************************

 

6、编写客户端配置文件:client.openvpn

在客户机的home目录下建立目录openvpn

#mkdir openvpn

#cd openvpn

#vim client.openvpn

client #指定当前VPN是客户端

dev tun #必须与服务器端的保持一致

proto udp

remote  xxx.xxx.xxx.xxx 1194 #指定连接的远程服务器的实际IP地址和端口号

resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下(例如:笔记本电>脑无线网络)非常有用。

nobind #不绑定特定的本地端口号

persist-key

persist-tun

ca ca.crt #指定CA证书的文件路径

#cert client2.crt #指定当前客户端的证书文件路径,被注销

#key client2.key #指定当前客户端的私钥文件路径,被注销

ns-cert-type server #指定采用服务器校验方式

tls-auth ta.key 1 #如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行;

comp-lzo #与服务器保持一致

script-security 3

log-append openvpn.log

verb 4 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细

auth-user-pass #用户密码认证

route-nopull      //拒绝按服务器要求配置路由

route 192.168.100.0 255.255.255.0 vpn_gateway   //指定该网段通过VPN访问

 

7、复制两个证书、秘钥到客户端

把服务端的ca.crt、ta.key两个文件复制到客户机home目录的openvpn目录中。

 

*******************启动服务端和客户端程序*********************

 

8、运行服务端和客户端

服务端:

#openvpn --config /usr/local/openvpn/server.openvpn --cd /usr/local/openvpn

 

客户端:

#cd $HOME/openvpn

#openvpn --config client.openvpn

 

警告:利用openvpn私自搭建可以访问国外网络的服务器牟利是违法的,请自重!