还为在家远程办公而困扰? openvpn 轻松帮你实现!

一曲冷凌霜 提交于 2020-08-18 04:47:30

前言:

鉴于疫情期间想必大伙可能有居家办公的需求,这样就少不了远程工作,目前最简单的方式就是通过公司路由直接端口映射实现,但这样难免存在安全风险,为此小编临时决定自建openvpn来实现这一功能,说起openvpn大伙可能都比较熟悉了,至于原理网络一大堆小编就不在赘述了,这里只是简单总结一下openvpn的安装部署流程,一来重新回顾一下openvpn工作流程,二来可以理清思绪,借助博客深入原理沉淀下来,对自己对他人都会有很大的帮助。此文只供初学者参考!不喜勿喷,喷者勿入,勤者共勉。^_^

简介:

vpn 介绍:在公共网络上建立的一条私密的安全通道实现互联网远程访问,局域网互联等,OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。

核心原理:

1.openvpn服务端会创建一个名为tun的虚拟网卡,此网卡和物理网卡具有相同的特点,能够配置IP和路由。

2.openvpn服务器需要配置一个虚拟地址池和一个自用的静态IP地址然后会给每个成功建立ssl连接的客户端动态分配一个虚拟IP,这样无理网络中的客户端和openvpn之间就连接成了一个星型的局域网,openvpn服务器成为每个客户端在虚拟网络上的网关,openvpn通过提供对客户端虚拟网卡的路由管理功能。简单的说openvpn服务器就类一个虚拟路由器。

3.当客户端对OpenVPN服务器后端的应用服务器的任何访问时,数据包都会经过路由流经虚拟网卡,OpenVPN程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络.前面提到过openvpen采用是一条私密安全通道,那么他就少不了加密手段,目前openvpn常采用的加密手段是SSL协议,因此使用openvpn之前我们还需要在服务端生成相应的SSL协议的证书秘钥。

环境说明:

[root@localhost ~]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.170  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::929e:1636:dee0:c2ba  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:1d:d6:f9  txqueuelen 1000  (Ethernet)
        RX packets 6552391  bytes 1087036063 (1.0 GiB)
        RX errors 0  dropped 13417  overruns 0  frame 0
        TX packets 5193684  bytes 1085287830 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 181  bytes 15442 (15.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 181  bytes 15442 (15.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


1.使用easy-rsa制作相关证书

mkdir -p /home/data/tools
wget -P /data/tools http://192.168.0.167/mt-server-tools/easy-rsa.zip
unzip -d /usr/local /data/tools/easy-rsa.zip

2.编辑vars文件,修改生成证书需要的信息

vi /usr/local/easy-rsa-old-master/easy-rsa/2.0/
vars
export KEY_COUNTRY="cn"
export KEY_PROVINCE="BJ"
export KEY_CITY="GS"
export KEY_ORG="bestyunyan"
export KEY_EMAIL="bestyunyan"
export KEY_CN=123
export KEY_NAME=123
export KEY_OU=123
#主要修改一下内容COUNTRY:国家,PROVINCE:省份,CITY城市,ORG:所在的组织,Email:邮箱,OU单位,NAME服务器名称,key_EXPIRE秘钥有效期默认:3650,CA_EXPIRE证书有效期。
#生成Kes目录
cd /usr/local/easy-rsa-old-master/easy-rsa/2.0/
source vars
./clean-all
#此时会生成keys目录

3.制作CA证书会生成ca.crt和ca.key

./build-ca
#此时会根据我们之前填写的相关信息生成crt和key文件.
#生成Keys目录后查看
[root@localhost keys]# ls 
ca.crt  ca.key  index.txt  serial
#ca.crt ca.key使我们需要的CA证书

4 制作server端证书

#回车即可:
[root@localhost 2.0]# ./build-key-server server
#查看我们生成的证书
[root@abc01 2.0]# ls server*
server.crt server.key server.csr
#这三个文件是我们所需要的.

5 这里我们使用客户端密码方式登录。秘钥方式登录可参考其他资料(也很简单)

#为服务器生成加密交换时的Diffie-Hellman文件
创建迪菲·赫尔曼密钥,会生成dh2048.pem文件次过程比较慢
[root@localhost 2.0]# ./build-dh
#此时查看证书有:
ca.crt,ca.key,server.crt,server.csr,server.crt,dh2048.pem

6 Openvpen安装部署

#安装依赖包
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache
yum install -y lzo lzo-devel openssl openssl-devel pam pam-devel net-tools git lz4-devel

#下载openVPN软件包
wget -P /data/tools http://down.i4t.com/openvpn-2.4.7.tar.gz
cd /data/tools

#安装openVPN
tar zxf openvpn-2.4.7.tar.gz
cd openvpn-2.4.7
./configure --prefix=/usr/local/openvpn-2.4.7
make
make install

# 创建软连接
ln -s /usr/local/openvpn-2.4.7 /usr/local/openvpn

7 Openvpn配置

#创建openvpn文件目录
mkdir -p /etc/openvpn/keys
#生成tls-auth key并将其拷贝到证书目录中(防DDos攻击、UDP淹没等恶意攻击)
/usr/local/openvpn/sbin/openvpn --genkey --secret ta.key
#将生成的ta.key移动至openvpn证书目录
mv ./ta.key /etc/openvpn/keys/
#将我们上面生成的CA证书和服务端证书拷贝到openvpn证书目录
cp /usr/local/easy-rsa-old-master/easy-rsa/2.0/keys/{server.crt,server.key,ca.crt,dh2048.pem} /etc/openvpn/keys/
[root@localhost keys]# ls 
ca.crt  dh2048.pem  server.crt  server.key  ta.key
#拷贝vpn配置文件到/etc/openvpn下
cp /data/tools/openvpn-2.4.7/sample/sample-config-files/server.conf /etc/openvpn/
#修改配置文件
cat /etc/openvpn/server.conf 
port 1194                         #openvpn端口
proto tcp                         #使用的协议
dev tun                           #生成tun虚拟网卡
ca /etc/openvpn/keys/ca.crt       #配置CA证书路径
cert /etc/openvpn/keys/server.crt #配置服务端证书
key /etc/openvpn/keys/server.key  
dh /etc/openvpn/keys/dh2048.pem   #配置加密交换时的Diffie-Hellman文件
server 10.4.82.0 255.255.255.0    #默认虚拟局域网网段,不要和实际的局域网冲突就可以
ifconfig-pool-persist ipp.txt     
push "route 192.168.0.0 255.255.255.0"    #配置路由转发,此当客户端访问192.168.0网段的服务时,转发至本地网卡网关,但是数据包可以出去无法返回,需要在本地路由配置静态路由:目标:10.4.82.0 255.255.255.0 吓一跳:192.168.0.170(本地openvpn ip地址)
client-to-client                          #如果客户端都是用一个证书和密钥连接VPN,需要打开这个选项
duplicate-cn
keepalive 10 120
key-direction 0
tls-auth /etc/openvpn/keys/ta.key 0 # This file is secret
comp-lzo
persist-key
persist-tun
status openvpn-status.log   #状态日志路径
log-append  openvpn.log     #运行日志
verb 3                      #调试信息级别
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env    #指定用户认证脚本
username-as-common-name
verify-client-cert none
#下载官方提供的用户认证脚本无需改写
cat /etc/openvpn/checkpsw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman 
#
# 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="/etc/openvpn/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

#添加执行权限
chmod 755 /etc/openvpn/checkpsw.sh
#密码文件
cat /etc/openvpn/psw-file 
user01 123456
user02 123456
user03 123456

8 服务器开启路由转发功能

echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
sysctl -p

9 启动openvpn服务

cd /etc/openvpn/
/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf
[root@localhost keys]# ss -lntp|grep openvpn
LISTEN     0      1            *:1194                     *:*                   users:(("openvpn",pid=20556,fd=6))
配置开机启动
echo "/usr/local/openvpn/sbin/openvpn --daemon --config /etc/openvpn/server.conf > /dev/null 2>&1 &" >> /etc/rc.local

10 客户端连接测试

#配置客户端client.conf文件
cp /data/tools/openvpn-2.4.7/sample/sample-config-files/client.conf /tmp/
#修改如下,并将client.conf修改为client.ovpn
$ cat /tmp/client.conf
client
dev tun
proto tcp
remote x.x.x.x 1194 #openvpn服务器地址
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt         #配置ca证书
tls-auth ta.key 1 #加密协议配置
key-direction 1   
cipher AES-256-CBC
comp-lzo
verb 3
auth-user-pass    #采用密码验证登陆
auth-nocache
#注意此时配置文件后缀需要改为ovpn
cd /tmp/
mv client.conf client.ovpn
#下载配置文件中涉及到的证书(ca.crt,ta.key)和配置文件到windows客户端:
sz /tmp/client.ovpn
sz /etc/openvpn/keys/ca.crt 
sz /etc/openvpn/keys/ta.key 

11 windows 客户端下载配置

#Windows客户端下载
http://down.i4t.com/openvpn-install-2.4.7-I606-Win10.exe
http://down.i4t.com/openvpn-install-2.4.7-I606-Win7.exe
#安装后打开openvpn安装路径下的config目录将刚才下载的:client.ovpn,ca.crt,ta.key一同放在config目录下
接着双击vpn运行后点击图标选择连接即可。

12 问题处理:

按照上面操作完成后大家可能会发现客户端ping openvpn服务端是连通的;但是ping 和openvpn在同一内网的其他主机无法ping通。
我们分析一下:openvpn服务端我们配置了路由转发:push "route 192.168.0.0 255.255.255.0";当数据包请求过来时openvpn帮我们转发:源地址是10网段的,目标是192网段的,数据可以顺利到达目标主机,但是目标主机将数据包返回的时候:源地址是192网段的,目标ip是10网段的。到达内网路由时,内网路由并不清楚10网段在哪,所以需要在内网路由配置路由转发:目标地址:10.4.82.0 255.255.255.0 下一跳地址:192.168.0.170(openvpn内网地址),然后在测试一切正常.

TCP/IP协议|Openvpn

https://blog.csdn.net/weixin_33811961/article/details/92667539
https://developer.51cto.com/art/201906/597961.htm
http://blog.sina.com.cn/s/blog_a72b50c80102wqbi.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!