还是先介绍下环境

外网pc客户端  119.119.119.119

内网出口IP    112.112.112.112  

open***服务器 192.168.0.250

open××× ip池  172.18.1.0/24

内网服务器    192.168.0.1


安装步骤请参考之前文章,或者tar包下载源码安装即可。


配置支持用户名密码验证

服务器端配置文件:

###cat server.conf 

local 192.168.0.250  监听本地IP

port 11940              监听端口

proto udp               UDP方式

dev tap                 TAP模式

ca ca.crt                根证书

cert server.crt          服务端证书

key server.key           

dh dh2048.pem         

server 172.18.1.0 255.255.255.0  open***客户端ip地址池

ifconfig-pool-persist ipp.txt   记录客户端分配IP

push "route 192.168.0.0 255.255.255.0"  客户端可访问网络

keepalive 10 120

comp-lzo

persist-key

persist-tun

status open***-status.log

verb 3

script-security 3       脚本安全参数(具体起什么作用还没农明白)

auth-user-pass-verify /etc/open***/checkpsw.sh via-env  通过这个脚本来检测用户名和密码

#client-cert-not-required   注释则表示需要使用证书+用户名密码方式验证

username-as-common-name     使用客户提供的UserName作为Common Name


脚本检测文件

cat  checkpsw.sh 

#!/bin/bash

PASSFILE="/etc/open***/psw-file"

LOG_FILE="/var/log/open***-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


# chmod +x checkpsw.sh


用户名密码文件:最好做最低的权限400

cat psw-file 

test1 123456



配置支持用户名密码验证

客户端配置文件:

##cat client.o***

client

dev tap

proto udp

remote  112.112.112.112 11940  记得做端口映射

resolv-retry infinite

nobind

persist-key

persist-tun

ca ca.crt

cert client.crt

key client.key

remote-cert-tls server

comp-lzo

verb 3

auth-user-pass    密码验证参数(这里测试加到最后只输入一次就可以,放到其他位置可能会让输入两次)


至此服务端客户端配置文件就完成,下面可进行连接测试。


这里已经测试成功,客户端使用的是windows下面的gui程序,输入正确用户名密码后,服务器端会在日志中记录用户名。

还需要对客户端进行访问限制,只能访问指定设备,这里通过iptables来进行

[root@open***]# cat /etc/sysconfig/iptables

*filter

:INPUT ACCEPT [28:2917]

:FORWARD DROP [0:0]

:OUTPUT ACCEPT [24:2292]

-A FORWARD -i tap0 -o eth0 -s 172.18.1.0/24 -d 192.168.0.1 -j ACCEPT 

-A FORWARD -i tap0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -i eth0 -o tap0 -j ACCEPT

COMMIT

*nat

:PREROUTING ACCEPT [2817:544359]

:POSTROUTING ACCEPT [0:0]

:OUTPUT ACCEPT [11:639]

-A POSTROUTING -j MASQUERADE 

COMMIT

经测试,完全可实现,证书+密码验证,并且只能访问到内网的制定服务器。