使用User/Pass方式验证登录VPN,虽然使用的是User/Pass方式登录,但是在Server端仍然需要证书,这样的VPN和web的HTTPs方式有点类似(不能等同),只需Server端有证书,Client可以不提供自己的证书,Client只需验证Server的合法性即可,所以Client端只需ca.crt(根证书)即可。当然,由于Client不是使用证书验证的,所以安全性方面必然有所下降,但是省去了烦琐的CA管理,我们可以通过用户名和密码来登录VPN,这样使得VPN可以很容易和论坛、邮件系统或者其他统一验证系统结合,使用现成的管理界面。
VPN的安装和配置:
环境:
OS: CentOS 6.5 (在公司网络出口处,做路由或者是NAT设备使用)
eth0: *.*.220.145 (外网地址,直接与Internet相连)
eth1: *.*.28.130 (内网地址)
Client端硬件及网络环境配置:
OS: Windows7,IP地址不固定
#同步系统时间
yum install chrony -y
service chronyd start && chronyc sources && chkconfig chronyd on
或
yum install ntpdate -y
crontab添加
*/1 * * * * /usr/sbin/ntpdate 0.rhel.pool.ntp.org > /dev/null 2>&1
service crond restart
Server端配置
检查pam-devel包是否安装,可yum安装该软件包
rpm -qa | grep pam
pam-1.1.1-17.el6.x86_64
检查mysql是否安装,确认mysql-devel包已经安装
rpm -qa | egrep "Percona|mysql"
mysql-libs-5.1.71-1.el6.x86_64
检查lszo是否安装,确认lzo-devel包已经安装
rpm -qa | grep lzo
#安装以上所需包
yum install epel-release -y
yum install ntpdate -y
yum install openssl openssl-devel lzo lzo-devel pam pam-devel pam_mysql automake pkgconfig gcc gcc-c++
rpm -ivh http://repo.mysql.com/mysql-community-release-el6.rpm
yum -y install mysql-community-client mysql-community-server mysql-community-devel
/etc/init.d/mysqld start
安装openvpn
https://openvpn.net/release/
cd /usr/local/src/
tar -zxvf openvpn-2.4.4.tar.gz
cd openvpn-2.4.4
./configure --prefix=/opt/openvpn
make && make install
cp -a distro/rpm/openvpn.init.d.rhel /etc/init.d/openvpn
#创建启动脚本
ln -s /opt/openvpn/sbin/openvpn /usr/sbin/openvpn
#启动脚本中会用到,也可以不执行此命令,直接在启动脚本中修改
vi /etc/init.d/openvpn
#在85行,修改为:
work=/opt/openvpn
#复制主配置文件模板
cp -a sample/sample-config-files/server.conf /opt/openvpn/
#创建日志及keys目录
mkdir logs
mkdir keys
#详细参数如下
cd /opt/openvpn
mv server.conf server.conf.bak
vim server.conf
port 1195 #使用1195端口
proto tcp #使用tcp传输模式
dev tun #使用tun虚拟网卡设备(还有一种是Tap)
ca keys/ca.crt #指定server端证书路径
cert keys/server.crt #指定server端证书路径
key keys/server.key #Thisfile should be kept secret
dh keys/dh2048.pem
tls-auth keys/ta.key 0
cipher AES-256-CBC
server 10.8.0.0 255.255.255.0 #openvpn使用的网络
push "route 10.8.0.0 255.255.0.0" #添加openvpn路由
ifconfig-pool-persist ipp.txt #客户端连入后使用的IP地址池
push "dhcp-option DNS 223.5.5.5" #客户端连入后使用的DNS
push "dhcp-option DNS 223.6.6.6"
keepalive 10 120 #保持VPN会话
comp-lzo #开启Lzo数据压缩
user nobody
group nobody
persist-key
persist-tun
verb 3
plugin openvpn-auth-pam.so openvpn
#调用openvpn-plugin-auth-pam.so于pam连接
client-cert-not-required #不请求客户的CA证书,使用User/Pass验证
username-as-common-name #使用客户提供的UserName作为Common Name
link-mtu 1500 #设置MTU连接数值
status logs/openvpn-status.log
log logs/openvpn.log
log-append logs/openvpn.log
生成openvpn-auth-pam.so,使用openvpn-2.0.*.tar.gz源码,否则会报错:AUTH-PAM:BACKGROUND: user 'tester' failed to authenticate: Permission denied
tar -zxvf openvpn-2.0.9.tar.gz
cd open-2.0.9/plugin/auth-pam
make
cp -a openvpn-auth-pam.so /opt/openvpn
cd /opt/openvpn && chmod 755 openvpn-auth-pam.so
安装easy-rsa,用来生成证书和密钥:
cd /usr/local/src/
wget http://download.freenas.org/distfiles/easy-rsa-2.2.0_master.tar.gz
#http://download.freenas.org/distfiles/
tar -zxvf easy-rsa-2.2.0_master.tar.gz
cp -a easy-rsa-2.2.0_master/easy-rsa /opt/openvpn/
cd /opt/openvpn/easy-rsa/2.0/
mv vars vars.bak
修改vars文件
vim vars
export EASY_RSA="`pwd`"
export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export PKCS11_MODULE_PATH="dummy"
export PKCS11_PIN="dummy"
export KEY_SIZE=2048 #修改为2048
export CA_EXPIRE=3650
export KEY_EXPIRE=3650
export KEY_COUNTRY="CN" #以下根据自己情况修改
export KEY_PROVINCE="ShaanXi"
export KEY_CITY="XA"
export KEY_ORG="yjz"
export KEY_EMAIL="[email protected]"
export KEY_CN=yjz
export KEY_NAME=yjz
export KEY_OU=yjz
ln -s openssl-1.0.0.cnf openssl.cnf
source vars #全局变量
##生成证书,以下命令全部一直回车
./clean-all
#清空所有证书(keys目录下)
./build-ca
#生成服务器ca证书
./build-key-server server
#生成服务端证书
./build-dh
#生成DH(Diffie-Hellman)验证文件
openvpn --genkey --secret ta.key
#降低DDoS风险
./build-key client
#生成客户端证书(建议以使用者命名)
#拷贝证书到/opt/openvpn/keys目录下
cd /opt/openvpn/easy-rsa/2.0/keys/
cp -a ca.crt server.crt dh2048.pem server.key /opt/openvpn/keys
cd .. && cp ta.key /opt/openvpn/keys
配置数据库用于管理openvpn的账户密码
以管理员身份登录数据库:
mysql> create database vpn;
mysql> GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY 'vpn123';
mysql> flush privileges;
mysql> use vpn;
mysql> CREATE TABLE vpnuser(name char(20)NOT NULL,password char(128) default NULL,active int(10) NOT NULL DEFAULT 1,PRIMARY KEY(name));
mysql> insert into vpnuser (name,password) values('ipad',password('ipad'));
mysql> show tables;
+---------------+
| Tables_in_vpn |
+---------------+
| vpnuser |
+---------------+
1 row in set (0.00 sec)
mysql> select * from vpnuser;
+------+-------------------------------------------+--------+
| name | password | active |
+------+-------------------------------------------+--------+
| ipad | *44249DDD1E67F607625C57A3B32D07FDC4663A14 | 1 |
+------+-------------------------------------------+--------+
1 row in set (0.00 sec)
#创建vpn用户,对vpn这个database有所有操作权限,密码为vpn123
在PAM配置中使用该用户
#active不为1,无权使用VPN
#增加用户 用户名:ipad 密码:ipad
配置pam_mysql模块
cd /etc/pam.d
vim openvpn
auth sufficient pam_mysql.so user=vpn passwd=vpn123 host=127.0.0.1 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2
account required pam_mysql.so user=vpn passwd=vpn123 host=127.0.0.1 db=vpn \
table=vpnuser usercolumn=name passwdcolumn=password \
where=active=1 sqllog=0 crypt=2
crypt(0)-- Used to decide to use MySQL's PASSWORD() function or crypt()
0= No encryption. Passwords in database in plaintext. NOT recommended!
1= Use crypt
2= Use MySQL PASSWORD() function
#crypt=0:明文密码
#crypt=1: 使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)
#crypt=2: 使用MYSQL中的password()函数加密。
#根据mysql内创建用户时配合使用 ipad用户使用password函数加密 所以用crypt=2
openvpn、mysql、pam连通性测试
开启系统的Forward功能
vim /etc/sysctl.conf
net.ipv4.ip_forward= 1 #重要
modprobe bridge && sysctl -p
iptables设置
iptables -t nat -A POSTROUTING -s 10.127.1.0/24 -o eth1 -j SNAT --to-source *.*.154.166
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -p tcp -m tcp --dport 1195 -j ACCEPT
开启openvpn程序
/etc/init.d/openvpn start
lsof -i:1195
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
openvpn 16993 nobody 8u IPv4 35738 0t0 TCP *:rsf-1 (LISTEN)
开启mysql程序
service mysql start
lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 53483 mysql 27u IPv6 204369 0t0 TCP *:mysql (LISTEN)
检查下saslauthd是否有安装可以通过yum安装此测试工具
rpm -qa | grep cyrus-sasl
cyrus-sasl-lib-2.1.23-13.el6_3.1.x86_64
cyrus-sasl-2.1.23-13.el6_3.1.x86_64
yum install cyrus-sasl-devel cyrus-sasl-gssapi cyrus-sasl-md5 cyrus-sasl-plain cyrus-sasl-lib cyrus-sasl
saslauthd -a pam
testsaslauthd -u ipad -p ipad -s openvpn
0: OK "Success." 测试通过。
配置openvpn客户端
安装openvpn-2.4.4-install.exe应用
从VPN服务端下载ca.crt,client.crt,client.key,ta.key证书
将ca.crt,client.crt,client.key,ta.key证书放到C:/Program Files/OpenVPN/config目录下
编辑client.ovpn文件
client
;dev tap
dev tun #使用虚拟网络设备tun 与server配置的必须相同
proto tcp-client #使用TCP传输(tcp-client/tcp-server)
;proto udp
remote *.*.154.166 1195 #openvpn服务所在的公网IP或域名以及开启端口
remote-random
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
auth-user-pass #询问用户名和密码
remote-cert-tls server
tls-auth ta.key 1
route 10.8.0.0 255.255.255.0 #openvpn使用的网络段
comp-lzo #开启Lzo数据压缩
verb 4
link-mtu 1500
保存并测试登陆openvpn.