场景:
公司内网只能在公司内使用,出差时需访问公司内网,所以搭建一个局域网于公网的VPN
需要一点Linux动手能力
需有一台固定的公网IP服务器,如云服务器。
如下以Centos7服务器为例
一、服务端:证书免密模式
1、安装证书软件easy-rsa,运行如下命令:
yum -y install easy-rsa
#创建目录
mkdir /opt/easy-rsa
#查看已安装的RPM包中名为 easy-rsa 的文件列表
rpm -ql easy-rsa
#进入目录进行操作
cd /opt/easy-rsa
cp -a /usr/share/easy-rsa/3.0.8/* .
cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars
#编辑文件
vim vars
#源文件vars的内容比较多,精简配置如下,可以使用如下配置替换vars内容
#修改加粗处
if [ -z "$EASYRSA_CALLER" ]; then
echo "You appear to be sourcing an Easy-RSA
'vars' file." >&2
echo "This is no longer necessary and is
disallowed. See the section called" >&2
echo "'How to use this file' near the top
comments for more details." >&2
return 1
fi
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "GuangDong"
set_var EASYRSA_REQ_CITY "ShenZhen"
set_var EASYRSA_REQ_ORG "公司简称"
set_var EASYRSA_REQ_EMAIL "邮箱@qq.comm"
set_var EASYRSA_NS_SUPPORT "yes"
2、创建证书
继续执行如下命令:
#1、初始化,在当前目录创建PKI目录,用于存储整数
./easyrsa init-pki
#2、创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他提示内容直接回车即可
./easyrsa build-ca
Enter New CA Key Passphrase: #注意密码不能太短,例如设置123456
Re-Enter New CA Key Passphrase: #再次输入密码
#3、创建server端证书和私钥文件,nopass表示不加密私钥文件,提示内容直接回车即可
./easyrsa gen-req server nopass
#4、给server端证书签名,提示内容需要输入yes和创建ca根证书时候的密码,步骤2的密码
./easyrsa sign server server
#5、创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法
./easyrsa gen-dh
#6、创建client端的证书和私钥文件,nopass表示不加密私钥文件,提示内容直接回车即可
./easyrsa gen-req client nopass
#7、给client端证书前面,提示内容输入yes和创建ca根证书时候的密码,步骤2的密码
./easyrsa sign client client
#检查是否有ca根证书、客户端服务端证书、客户端服务端私钥
tree
#如下加粗部分是后续需要的文件,可以先下载下来
├── easyrsa #管理命令
├── openssl-easyrsa.cnf
├── pki
│ ├── ca.crt #ca根证书,服务端与客户端都需要用
│ ├── certs_by_serial
│ ├── dh.pem #认证算法 服务端
│ ├── index.txt
│ ├── index.txt.attr
│ ├── index.txt.attr.old
│ ├── index.txt.old
│ ├── issued
│ │ ├── client.crt #客户端证书
│ │ └── server.crt #服务端证书
│ ├── openssl-easyrsa.cnf
│ ├── private
│ │ ├── ca.key
│ │ ├── client.key #客户端私钥
│ │ └── server.key #服务端私钥
3、服务器端:安装openvpn
yum -y install openvpn
#编辑配置文件
/etc/openvpn/server.conf
#参考如下内容,修改自己的配置,加粗部分需注意
port 1194 #端口
proto udp #协议
dev tun #采用路由隧道模式
ca /opt/easy-rsa/pki/ca.crt #ca证书的位置
cert /opt/easy-rsa/pki/issued/server.crt #服务端公钥的位置
key /opt/easy-rsa/pki/private/server.key #服务端私钥的位置
dh /opt/easy-rsa/pki/dh.pem #证书校验算法
server 10.8.0.0 255.255.255.0 #给客户端分配的地址池,10.8.0.0 可以自定义
push "route 172.16.1.0 255.255.255.0" #允许客户端访问的内网网段
ifconfig-pool-persist ipp.txt #地址池记录文件位置,未来让openvpn客户端固定ip地址使用的
keepalive 10 120 #存活时间,10秒ping一次,120秒如果未收到响应则视为短线
max-clients 100 #最多允许100个客户端连接
status openvpn-status.log #日志位置,记录openvpn状态
log /var/log/openvpn.log #openvpn日志记录位置
verb 3 #openvpn版本
client-to-client #允许客户端与客户端之间通信
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的,否则网络会先linkdown然后再linkup
duplicate-cn #客户端密钥(证书和私钥)是否可以重复
comp-lzo #启动lzo数据压缩格式
4、启动服务端opvenvpn
systemctl start openvpn@server
#设置开机启动
systemctl enable openvpn@server
#查看网段
ip a s tun0
5、Linux安装客户端,与服务端不是同一服务器,可以是内网服务器
安装
yum -y install openvpn
#编辑配置文件
vim /etc/openvpn/client.conf
#内容如下,加粗部分需改为服务端公网IP
client
dev tun
proto udp
remote 公网IP 1194
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
verb 3
persist-key
comp-lzo
#上传服务端client.key、client.crt、ca.crt到客户端服务器,目录:/etc/openvpn/
#启动客户端,此时客户端ip是根据服务端server 10.8.0.0 255.255.255.0自动分配
systemctl start openvpn@client
#开机自启
systemctl enable openvpn@client
#检查是否连上openvpn服务端,如服务端的ip为:10.8.0.1,在客户端ping这个ip
6、Windows安装客户端amd64.msi
msi安装文件自行下载:OpenVPN-2.6.8-I001-amd64.msi
也可以使用百度网盘:链接: https://pan.baidu.com/s/1JXnFgZXPRz3dpcLIJHxOvw?pwd=bg7w 提取码: bg7w
直接安装,有两种模式,具体安装哪一种已忘记,可以都试一下,安装后目录如下:
将ca根证书、client.key、client.crt放入config目录
编写client.ovpn文件
内容如下:
client
dev tun
proto udp
remote 公网ip 1194 #注意此处更改为openvpn服务端代码
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
verb 3
persist-key
comp-lzo
连接测试,双击打开OpenVPN(桌面快捷方式)右下角出现图标,右键连接
可以使用windows客户端,使用vpn分配的对应ip,访问已安装的OpenVPN的Linux服务端或客户端。
7、Windows安装客户端connect.msi(较6操作更便捷)
安装openvpn-connect-3.5.0.3818_signed.msi
链接: https://pan.baidu.com/s/1DWJRufbz_mrol6XFn2dj1g?pwd=xx62 提取码: xx62
编写client.ovpn文件
内容如下:
client
dev tun
proto udp
remote 公网ip 1194 #注意此处更改为openvpn服务端代码
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
verb 3
persist-key
comp-lzo
client.ovpn文件,同级目录需要有ca.crt、client.crt、client.key
上传client.ovpn文件,输入账号密码
8、Mac安装客户端
链接: https://pan.baidu.com/s/1Gpher8QRe5opIjHvOmzx2Q?pwd=wfxw 提取码: wfxw
下载对应软件地址:https://openvpn.net/,网络可能访问不通,
二、服务端配置用户以及用户固定ip
以上配置,客户端ip为服务端动态分配,多人使用时会经常发生变化,所以为每位同事创建了账号和密码
1、服务端,修改server.conf配置文件
#服务端,修改server.conf配置文件,增加如下配置:
client-config-dir /etc/openvpn/ccd #允许使用自定义脚本,用户配置账号和指定ip
script-security 3 #脚本路径
auth-user-pass-verify /etc/openvpn/check.sh via-env #用户密码登陆方式验证
client-cert-not-required
username-as-common-name
#编辑/etc/openvpn/check.sh 文件
#!/bin/sh
###########################################################
PASSFILE="/etc/openvpn/openvpnpass"
LOG_FILE="/etc/openvpn/logs/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
#编辑文件/etc/openvpn/openvpnpass里配置用户名和密码
vim /etc/openvpn/openvpnpass
#参考如下,前面为账号名, 后面为密码,使用空格隔开
#在ccd文件夹下创建用户名相同的文件
#编辑用户名文件,设置ip和网关,前面为ip,后面为网关,需成对配置,参考如下:
ifconfig-push 10.8.0.21 10.8.0.22
#ip和网关的
配置规则如下,不按规则配置会无法使用:
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
2、客户端使用用户名密码登录
#客户端修改client.ovpn配置文件,增加一行如下配置
auth-user-pass #用户密码登录是配置
#客户端重新登录opvenvpn,会提示需要输入账号密码
#Linux客户端,先停止服务,停止命令:
systemctl stop openvpn@client
#再启动,或者直接使用restart重启
systemctl start openvpn@client
#会提示输入账号密码,