centos6.8+openvpn实现账户密码连接(通过端口映射的方式
#搭建openvpn(编译安装)
初始化环境
 
#update epel mirror
yum install wget -y
cd /etc/yum.repos.d && rm -rf *
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo


#Yum Packs
echo "install/update gcc make wget vim ntpdate sysstat"
yum install -y gcc gcc-c++ vim ntpdate lsof


#disable selinux
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0

#alias vim
echo 'alias vi="vim"' >>/etc/profile
source /etc/profile

#modify UseDNS

sed -i '#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config


#ntpdate corntab
echo 'ntpdate ntp1.aliyun.com'
echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com' >> /var/spool/cron/root
chmod 600 /var/spool/cron/root
ntpdate ntp1.aliyun.com
cat  << EOF 
 +--------------------------------------------------------------+
 |                    ===System init over===                    |
 +--------------------------------------------------------------+
 +---------------------------by liuhuihuang---------------------+
EOF
echo "##########################################################"
 
 
创建一个专门存放openvpn软件的目录
mkdir -p /home/xianlai/tools/openvpn
通过xftp把lzo-2.06.tar.gz openvpn-2.2.2.tar.gz checkpsw.sh传到/home/xianlai/tools/openvpn目录里
安装 lzo 软件,用于后面文件的压缩
tar zxf lzo-2.06.tar.gz 
cd lzo-2.06 
./configure && make && make install
通过 yum 安装 openssl,openssl-devel 两个软件,没有它俩 openvpn 的安装就会报错
yum -y install openssl openssl-devel
安装 openvpn 软件
tar zxf openvpn-2.2.2.tar.gz
cd openvpn-2.2.2
./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib
make
make install
检查 openvpn 是否安装成功,并且查看其版本
which openvpn
openvpn --version
备份 var 文件,并且修改模板
cd /home/xianlai/tools/openvpn/openvpn-2.2.2/easy-rsa/2.0
cp vars vars.bak
vim vars
export KEY_COUNTRY="CN" 
export KEY_PROVINCE="BJ" 
export KEY_CITY="BJ" 
export KEY_ORG="XL" 
export KEY_EMAIL="528634141@qq.com" 
export KEY_EMAIL=528634141@qq.com 
export KEY_CN=CN 
export KEY_NAME=xianlai 
export KEY_OU=xianlai 
export PKCS11_MODULE_PATH=changeme 
export PKCS11_PIN=1234
执行 source 命令使配置文件生效
source vars
./clean-all
创建 CA 证书,一路回车
./build-ca 
生成服务器端证书和秘钥文件,输入两次y,一路回车
./build-key-server server
Sign the certificate? [y/n]:y 
1 out of 1 certificate requests certified, commit? [y/n]y 

生成客户端证书和 key 文件(用户user1)
./build-key user1 
Sign the certificate? [y/n]:y 
1 out of 1 certificate requests certified, commit? [y/n]y 

生成传输进行秘钥交换时用到的交换秘钥协议文件
./build-dh
生成一个防止恶意攻击的文件(效果似乎一般)
openvpn --genkey --secret keys/ta.key 

创建 openvpn 目录,用于存放配置文件
mkdir /etc/openvpn 

拷贝2.0目录下的 keys 目录,并切换目录拷贝 server.conf client.conf 文件
cp -ap keys/ /etc/openvpn/
cd /home/xianlai/tools/openvpn/openvpn-2.2.2/sample-config-files/
cp client.conf server.conf /etc/openvpn/
编辑 openvpn 的配置文件,在操作前养成好习惯,先进行备份
cd /etc/openvpn
cp server.conf server.conf.bak
可以通过 grep 命令过滤查看配置文件,并通过一个临时文件将过滤后的结果再次导入 server.conf
grep -vE "^;|^#|^$" server.conf > tmp.log
cat tmp.log > server.conf
编辑过滤后的 server.conf 文件
vim server.conf
port 1194 #端口可以更改
proto tcp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1"
push "route 192.168.**.0 255.255.255.0"
push "dhcp-option DNS *.*.*.*"
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
client-cert-not-required #不使用客户端证书,使用密码进行验证 
username-as-common-name #使用认证用户名,不使用证书 
script-security 3 system #允许通过环境变量将密码传递给脚本 
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #指定路径,允许登陆的用户名及密码
打开路由转发功能
vim /etc/sysctl.conf 
net.ipv4.ip_forward = 1
sysctl -p
拷贝启动脚本至/etc/init.d目录
cp /home/xianlai/tools/openvpn/openvpn-2.2.2/sample-scripts/openvpn.init /etc/init.d/openvpn
chmod 700 /etc/init.d/openvpn
chkconfig --add openvpn
修改脚本openvpn
切到148行,把ls *.conf 改为ls server.conf保存即可
#启动openvpn
/etc/init.d/openvpn start
切到/etc/openvpn目录下
cd /etc/openvpn
cp /home/xianlai/tools/openvpn/checkpsw.sh .
创建psw-file文件
touch psw-file 
添加一个用户测试,刑如:liuhuiuhang 123456(用户和密码写在一行,需要添加用户的话往下顺延即可)
分别修改一下这两个文件的权限
chmod +x checkpsw.sh 
chmod 400 psw-file
导出 client.conf ca.crt
sz -y client.conf
sz -y keys/ca.crt
创建一个后缀名为 .ovpn 的文件(my.ovpn),内容如下:
client 
dev tun 
proto tcp 
remote 公网IP 1194  
resolv-retry infinite 
nobind 
persist-key 
persist-tun 
ca ca.crt 
comp-lzo 
verb 3 
auth-user-pass
##特别提示:
#配置防火墙,别忘记保存
iptables -I INPUT -p tcp --dport 1194 -m comment --comment "openvpn" -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
service iptables save
##端口映射
本文使用的是端口映射的方式做的,具体命令如下:
nat server protocol tcp global 公网IP 80 inside 内网IP 80
 
#windows客户端配置
安装openvpn-2.2.2-install.exe,默认安装,一直默认,然后新建一个文件夹vpn,把client.conf、ca.crt、my.ovpn放至文件夹vpn中,然后把vpn拷贝至openvpn的安装目录中的config目录中。
#MAC客户端配置
下载tunnelblick,然后安装,把vpn文件夹拷贝至MAC电脑中,把my.ovpn放至tunnelblick中即可。具体操作可参考链接:http://www.xitongzhijia.net/xtjc/20150414/45176.html
转载:http://aby028.blog.51cto.com/5371905/1886851
附件: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="/etc/openvpn/psw-file"
LOG_FILE="/var/log/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