openvpn搭建使用用户密码验证并设置固定ip


一、服务端搭建过程

1、安装openvpn和证书生成程序

yum -y install epel-release
yum -y install openvpn easy-rsa
2、将openvpn的实例配置文件拷贝到/etc/openvpn下
cp /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/vars
cp -rf /usr/share/easy-rsa/3.0.8/* /etc/openvpn/
3、生成证书和秘钥
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa build-server-full server nopass
./easyrsa build-client-full client nopass
4、修改openvpn配置文件
[root@openVPN issued]# cat /etc/openvpn/server.conf | grep -v ‘^#’ | grep -v ‘^$’

local 1.70.11.11
port 1194
proto tcp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/server.crt
key /etc/openvpn/pki/private/server.key # This file should be kept secret
dh /etc/openvpn/pki/dh.pem
server 172.16.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 208.67.222.222”
client-to-client
duplicate-cn
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push “compress lz4-v2”
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append openvpn.log
verb 7
explicit-exit-notify 0

二、客户端配置

1、下载客户端

客户端可以在官网下载

2、拷贝证书文件到客户端
/etc/easy-rsa/pki/private/client.key
/etc/easy-rsa/pki/issued/client.crt
/etc/easy-rsa/pki/ca.crt

将这三个文件拷贝至openvpn的安装目录中,然后增加client.opven文件,配置如下:

client
dev tun
proto tcp
sndbuf 0
rcvbuf 0
remote 1.70.11.11 1194
resolv-retry infinite
link-mtu 65500
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
cipher AES-256-CBC
comp-lzo

然后就可以连接测试一下,如失败看一下客户端的日志,有的放矢。

三、通过用户名密码登录

证书登录有一个比较大的缺点,可以将证书拷贝给别的电脑此电脑就可以直接登录了,安全性较低,所以增加用户名密码登录方式。

1、增加用户名密码检查脚本

checkpsw.sh

###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman 
#
# 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
2、配置server.conf

在配置的最后增加以下内容:

script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
username-as-common-name
verify-client-cert none
3、创建psw-file文件,用于存放用户名和密码
[root@Wdp-host openvpn]# cat psw-file 
wdp 123456
test test
4、配置客户端open文件
注释掉密钥
;cert client.crt
;key client.key
在文件最后添加
auth-user-pass
5、重连测试,此时需要输入用户名及密码

四、固定客户端的ip地址

1、server.conf中启动ccd
client-config-dir ccd

在ccd文件夹下按照用户名创建文件

[root@Wdp-host openvpn]# ls
ccd          client    ipp.txt    openvpn-password.log  server       server.conf.bak
checkpsw.sh  easy-rsa  nohup.out  psw-file              server.conf
[root@Wdp-host openvpn]# cd ccd
[root@Wdp-host ccd]# ls
test  wdp
[root@Wdp-host ccd]# cat wdp
ifconfig-push 172.19.51.6 172.19.51.7

这地方经过测试有点问题,在此说明一下:
当客户端使用3.3版本时候ipconfig-push x.x.x.x x.x.x.x+1 都可以,不用考虑x的值,但是如果使用的2.4左右的版本则需要配置252的掩码,也就是只能使用如下地址:https://editor.csdn.net/md/?articleId=119324734

2、重启服务器openvpn是进行测试

五、将VPN服务器端的内网地址推个客户端,添加到客户端的路由表中

配置server.conf

push “route 1.70.0.0 255.255.0.0”

六、资源访问权限限制

通过iptables实现:

iptables -A FORWARD -s 172.16.103.13 -d 1.70.54.148 -j DROP

配置FORWARD链中,禁止源地址172.16.103.13访问1.70.54.148

七、自我总结-避坑

1.ip地址分配时注意ip 4个连起来为一组,选择的两个必须为4个中间那两个,否则无法启动
2.ios导入.ovpn时需注意使用如下格式将ca直接写入

**注意:**要在—>文件—>我的iphone—>创建openVPN文件夹—>里面放放在文件及密钥等

client                  [[指定当前VPN是客户端]]
dev tun                 [[使用tun隧道传输协议]]
proto tcp               [[使用tcp协议传输数据]]
remote 1.117.215.85 1194   [[openvpn服务器IP地址端口号]]
resolv-retry infinite   [[断线自动重新连接,在网络不稳定的情况下非常有用]]
nobind                  [[不绑定本地特定的端口号]]
;ca ca.crt               [[指定CA证书的文件路径]]
;cert client.crt         [[指定当前客户端的证书文件路径]]
;key client.key          [[指定当前客户端的私钥文件路径]]
verb 3                  [[指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细]]
persist-key     [[通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys]]
persist-tun     [[检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup]]
auth-user-pass  			[[使用用户名密码方式登录]]

<ca>
-----BEGIN CERTIFICATE-----
MIIDHjCCAgagAwIBAgIJAOc6xthia87xMA0GCSqGSIb3DQEBCwUAMA8xDTALBgNV
BAMMBGhvcGUwHhcNMjIxMTA0MDIzNDI2WhcNMzIxMTAxMDIzNDI2WjAPMQ0wCwYD
VQQDDARob3BlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApUBSAdKS
/dyQXllzVhfwcB/kozgtaWb2fhp6A4GkFwh5g7z6ZvfLY2ARf1zbH+ZLctcJSS7G
hRd2Hg5aR32anFSgismuRN6V4GTw8fbUu8QgB2YkeDRBSB1i5aXE2DkS+LXTkF+E
HEHEGfUytTVWVwuuGP0pFZl1nhTWHYMCXNqVwRGMdbINaKJvipwL3ju/45MkeXgR
of/E6qdfjSxFWRwMQ9/S4jO+7POVBSquoHkLW3aLtqntHAdLMfOEadK6WIdaMrjw
tHjensAL2qCxsPa1wUFlWiCn9LWOolL2Mill5cV47PQuvMK3txigfZZ1t6shFyt9
npKqARB+Q28i8QIDAQABo30wezAdBgNVHQ4EFgQUgygp+z0yqNs7ChjWJS0nMTkL
Y2QwPwYDVR0jBDgwNoAUgygp+z0yqNs7ChjWJS0nMTkLY2ShE6QRMA8xDTALBgNV
BAMMBGhvcGWCCQDnOsbYYmvO8TAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjAN
BgkqhkiG9w0BAQsFAAOCAQEAFxhMIj1qwyCOcVtcWshLJRLpkfFFOahOArLKXYVs
laDKKIZVbQ6o7379ecYBhumHJbLfHKRccZFIIc0JPv380xwS6SDF3UJRZov4Iz+L
18sc+AfZuNt2Tvtu21JJf8m6aDLlbq5T9OIulgHKJy7sZ9f4N13JcO148004yzF+
lXea41beqRb9i8Q+19bsRsJ8g7ME9oXaiwIZ99+xmZFy2SZLnjcUSeodcOHcwSUn
FwyPPrDMnWapf1b1krg/WeBfWajvENBI7h3eLo8nSMY041Ow6dwxB0UCsJ1sj93I
OBuqLMoNdkZqK3MhZy/3ASZ4f9Ork+SECGXDImgVmQ2XvA==
-----END CERTIFICATE-----
</ca>