前言:
鉴于疫情期间想必大伙可能有居家办公的需求,这样就少不了远程工作,目前最简单的方式就是通过公司路由直接端口映射实现,但这样难免存在安全风险,为此小编临时决定自建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
来源:oschina
链接:https://my.oschina.net/wangyunlong/blog/4300037