还是先介绍下环境
外网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
经测试,完全可实现,证书+密码验证,并且只能访问到内网的制定服务器。
转载于:https://blog.51cto.com/lodges/1682016