openvpn使用 参考:
VPN说明 虚拟专用网络的诞生 internet不安全,企业专线又太贵,而且不能随地用,不灵活,vpn技术就可以很好的解决这个问题
虚拟专用网络介绍 VPN(全称Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信网络的技术;
可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。
在VPN中任意两点之间的连接并没有传统专网所需的端到端的物理链路,而是利用公共网络资源动态组成的;
可以理解为通过私有的隧道技术在公共数据网络上模拟出来的和专网有同样功能的点到点的专线技术;
所谓虚拟是指不需要去拉实际的长途物理线路,而是借用了公共Internet网络实现。为了便于理解VPN概念,利用一个网络示意图进行说明:
优点:
在远端用户、驻外机构、合作伙伴、供应商与公司总部之间建立可靠的连接,保证数据传输的安全性。
这对于实现电子商务或金融网络与通讯网络的融合特别重要。
利用公共网络进行信息通讯,企业可以用更低的成本连接远程办事机构、出差人员和业务伙伴。
支持出差VPN用户在任何时间、任何地点的移动接入,能够满足不断增长的移动业务需求。
由于VPN为逻辑上的网络,物理网络中增加或修改节点,不影响VPN的部署。
虚拟专用网络分类 01 根据VPN建设单位不同进行划分:
运营商的虚拟专线网络大多数都是使用MPLS VPN;企业通过购买运营商提供的VPN专线服务实现总部和分支机构间的通信需求;VPN网关为运营商所有。
https://blog.csdn.net/LiMITV/article/details/134961629
企业内部自建基于Internet环境的vpn网络,常见的有IPSec VPN、GRE VPN、L2TP VPN、SSL VPN
Ipsec
GRE VPN
L2TP VPN
SSL VPN
企业自己购买VPN网络设备,搭建自己的VPN网络,实现总部和分支机构的通信,或者是出差员工和总部的通信;
02 根据VPN组网方式不同进行划分:
这种方式适用于出差员工拨号接入VPN的方式,员工可以在只要有Internet的地方都可以通过VPN接入访问企业内网资源。最常见类型有:SSL VPN、L2TPVPN
这种方式适合用于企业两个局域网互通的情况;例如企业的分支机构访问总部;最常见类型有:MPLS VPN、IPsecVPN
03 根据VPN工作网络层次进行划分:
应用层VPN:SSLVPN
网络层VPN:IPseC VPN、GREVPN
链路层VPN:L2TP2 VPN、PPTPVPN
隧道技术说明 VPN技术的基本原理其实就是用的隧道技术;
就类似于火车/地铁的轨道一样,从A站点到B站点都是直通的,不会堵车。对于乘客而言,就是专车;
隧道技术其实就是对传输的报文进行封装,利用公网建立专用的数据传输通道,从而完成数据的安全可靠传输;
省略了nat技术,将需要发送的数据进行封装,通过隧道到对端,对端再解封装。
环境搭建
主机
内网
外网
CentOS 7 (openvpn服务端)
172.16.30.102
192.168.174.142
Windows10(客户端)
N/A
192.168.177.199
CentOS7(内网web服务器)
172.16.30.101
N/A
服务端 准备一台CentOS 7虚拟机,配置双网卡
在CentOS 7上安装一个NetWorkManager,使用nmtui来配置网卡,配置之前的ip a看下网卡名字
可以看到ens36网卡是没有地址的
添加以太网卡,不用配网关
确认即可,然后重启网络服务
systemctl restart network
客户端 因为vm的虚拟网卡8是nat模式,这里我就直接用本机的环境测试了,ping的通服务端即可,然后这里是ping不通内网网段的
web端 这里可以直接克隆服务端的ctos,然后修改网卡配置
进入系统进行同样的ip配置,记得克隆完不要一起启动,容易导致ip冲突,这里配置完可能需要重启才会修改网卡的ip地址
可以看到内网卡是通的,ping不通外网,简易的搭建一个web网站测试一下
记得提前关闭SELinux以及防火墙
python -m SimpleHTTPServer 80 //python2 python -m http.server 80 //python3
在服务端是可以访问的,试试本机的windows环境
建立隧道
数据通过隧道传到openvpn服务端,openvpn服务端转发数据给web服务器,web服务器返回的数据,再通过openvpn服务端经隧道转发给客户端
操作系统基础优化配置 系统默认的selinux安全策略优化 # 临时关闭SELinux策略 [root@localhost ~]# setenforce 0 [root@localhost ~]# getenforce Permissive #永久关闭SELinux策略 [root@localhost ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted [root@localhost ~]# sed -i '7s#enforcing#disabled#g' /etc/selinux/config [root@localhost ~]# reboot
系统默认防火墙福务优化说明 # 查看防火墙状态 [root@localhost ~]# systemctl status firewalld.service ● firewalld.service Loaded: masked (/dev/null; bad) Active: inactive (dead) Warning: firewalld.service changed on disk. Run 'systemctl daemon-reload' to reload units. [root@localhost ~]# systemctl is-active firewalld.service inactive [root@localhost ~]# systemctl is-enabled firewalld.service masked
系统软件下载优化方法
CentOS换源
系统基础软件程序下载安装 # 企业应用基础工具程序 yum install -y tree nmap lrzsz dos2unix nc lsof wget -y # 企业应用扩展程序 yum install -y psmisc net-tools bash-completion vim-enhanced git -y
tree :
这是一个递归地列出目录内容的命令行工具,它会以树状图的形式显示目录结构,非常适合查看文件和文件夹的层级关系。
nmap :
网络映射器(Network Mapper),这是一个开源的网络扫描和安全审计工具,用于发现网络上的设备,检测开放的端口,确定运行在网络设备上的服务及其版本信息,检测潜在的安全漏洞等。
lrzsz :
这是一个用于在Unix和类Unix系统之间传输文件的工具集,包括rz(接收文件)和sz(发送文件)两个命令。它们通过串行端口或调制解调器进行文件传输。
dos2unix :
这个工具用于将DOS/Windows风格的文本文件格式转换为Unix风格的文本文件格式,主要改变文件中的换行符(CR LF转换为LF)。
nc (netcat):
这是一个功能强大的网络工具,用于阅读和写入数据,可用于创建网络连接、监听端口、传输文件等。它常被称为“网络瑞士军刀”。
lsof :
列出打开的文件(List Open Files),这是一个列出当前系统打开文件的工具。它可以用来查看哪些进程打开了哪些文件,包括常规文件、目录、网络文件系统、流管道等。
wget :
这是一个非交互式的文件下载工具,可以从网络上下载文件。它支持HTTP、HTTPS和FTP协议,可以递归下载,支持断点续传等。
psmisc :
这个包提供了一些额外的进程管理工具,最著名的是pstree命令,它可以以树状图的形式显示进程之间的父子关系,以及fuser命令,用于查找访问特定文件、套接字或文件系统的进程。
net-tools :
这是一个网络工具包,包含了许多用于网络配置和诊断的工具,如ifconfig(用于配置和显示Linux内核中网络接口的网络参数)、netstat(显示网络端口和路由表信息)、route(显示和操作路由表)等。
bash-completion :
这是一个为Bash shell提供自动补全功能的软件包。它允许用户在输入命令时自动补全命令、文件名、变量名等,提高命令行的效率和易用性。
vim-enhanced :
这是Vim编辑器的一个增强版,包含了额外的功能和插件,如语法高亮、代码折叠、自动缩进等,使得Vim更加强大和易于使用。
git :
这是一个分布式版本控制系统,用于跟踪代码变更、协调多人协作开发。Git是目前世界上最流行的版本控制系统,被广泛用于软件开发项目中。
证书制作 根据之前的openvpn软件工作原理说明,在部署虚拟专用网络服务之前,需要进行相关证书文件制作;
证书文件制作过程,需要使用到easy-rsa.zip工具进行制作证书。
制作证书工具下载:https://github.com/OpenVPN/easy-rsa将证书制作
工具上传到主机中:
rz -y unzip easy-rsa-old-master.zip cd /easy-rsa-old-master/easy-rsa/2.0/ ls
编辑vars文件,这个文件是一些个人信息,用来表明身份的
# 改最底下的这部分就行 export KEY_COUNTRY="CN" export KEY_PROVINCE="FJ" export KEY_CITY="FZ" export KEY_ORG="XIAO" export KEY_EMAIL="123@qq.com" export KEY_CN=youzipii export KEY_NAME=youzipii export KEY_OU=youzipii export PKCS11_MODULE_PATH=changeme export PKCS11_PIN=1234 # 快速生效 [root@localhost 2.0]# source ./vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa-old-master/easy-rsa/2.0/keys # 这里新部署的话是没有的,这里是我们生成的私钥,证书之类的存放目录,我们可以先自己创建一个,注意位置 [root@localhost 2.0]# mkdir keys [root@localhost 2.0]# ./clean-all [root@localhost 2.0]# ll keys/ total 4 -rw-r--r--. 1 root root 0 Dec 9 17:24 index.txt -rw-r--r--. 1 root root 3 Dec 9 17:24 serial
生产根证书文件和私钥文件 [root@localhost 2.0]# ./build-ca
这里会让我们填写个人信息,但我们刚刚在vars文件里填写过了,所以直接回车使用默认就行,然后我们可以查看keys目录下有没有新生产的私钥和证书
[root@localhost 2.0]# ls -l keys/ total 12 -rw-r--r--. 1 root root 2329 Dec 9 17:27 ca.crt //证书 -rw-------. 1 root root 3272 Dec 9 17:27 ca.key //私钥 -rw-r--r--. 1 root root 0 Dec 9 17:24 index.txt -rw-r--r--. 1 root root 3 Dec 9 17:24 serial
生产服务端证书和私钥文件 [root@localhost 2.0]# ./build-key-server youzipii //youzipii可任意换
同样回车就行,password看这里,我这里默认为空,不影响,最后输两个y确认一下即可,然后去查看keys目录下有没有服务端证书
[root@localhost 2.0]# ll keys/ total 48 -rw-r--r--. 1 root root 8061 Dec 9 17:30 01.pem -rw-r--r--. 1 root root 2329 Dec 9 17:27 ca.crt -rw-------. 1 root root 3272 Dec 9 17:27 ca.key -rw-r--r--. 1 root root 114 Dec 9 17:30 index.txt -rw-r--r--. 1 root root 21 Dec 9 17:30 index.txt.attr -rw-r--r--. 1 root root 0 Dec 9 17:24 index.txt.old -rw-r--r--. 1 root root 3 Dec 9 17:30 serial -rw-r--r--. 1 root root 3 Dec 9 17:24 serial.old -rw-r--r--. 1 root root 8061 Dec 9 17:30 youzipii.crt //服务端证书 -rw-r--r--. 1 root root 1744 Dec 9 17:30 youzipii.csr //证书请求文件,实验中没有找合法的机构申请,所以csr没什么用这里 -rw-------. 1 root root 3272 Dec 9 17:30 youzipii.key //服务端私钥
生成客户端证书和密钥文件 [root@localhost 2.0]# ./build-key client //客户端我就用client了,也是可以随意替换的
同样是一直回车,最后输入两个y确认即可,然后我们去查看下客户端的证书是否生成
[root@localhost 2.0]# ll keys/ total 80 -rw-r--r--. 1 root root 8061 Dec 9 17:30 01.pem -rw-r--r--. 1 root root 7937 Dec 9 17:36 02.pem -rw-r--r--. 1 root root 2329 Dec 9 17:27 ca.crt -rw-------. 1 root root 3272 Dec 9 17:27 ca.key -rw-r--r--. 1 root root 7937 Dec 9 17:36 client.crt -rw-r--r--. 1 root root 1744 Dec 9 17:36 client.csr -rw-------. 1 root root 3268 Dec 9 17:36 client.key -rw-r--r--. 1 root root 226 Dec 9 17:36 index.txt -rw-r--r--. 1 root root 21 Dec 9 17:36 index.txt.attr -rw-r--r--. 1 root root 21 Dec 9 17:30 index.txt.attr.old -rw-r--r--. 1 root root 114 Dec 9 17:30 index.txt.old -rw-r--r--. 1 root root 3 Dec 9 17:36 serial -rw-r--r--. 1 root root 3 Dec 9 17:30 serial.old -rw-r--r--. 1 root root 8061 Dec 9 17:30 youzipii.crt -rw-r--r--. 1 root root 1744 Dec 9 17:30 youzipii.csr -rw-------. 1 root root 3272 Dec 9 17:30 youzipii.key
可以看到同样生成了
生成密钥交换文件信息(Diffie-Hellman密钥交换算法) 这一步比较耗时间
root@localhost 2.0]# ./build-dh Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ........
这会在keys目录下生成一个密钥文件
[root@localhost 2.0]# ll keys/ total 84 .... -rw-r--r--. 1 root root 424 Dec 9 17:39 dh2048.pem
最终会生成重要的7哥文件,ca2个、server2个、client2个、DH一个。
OpenVPN服务配置 如果之前换源,一起换了epel源就可以直接在系统里安装下载了
[root@localhost yum.repos.d]# yum install -y openvpn 阿里云镜像的版本是2.4.12
最好是服务端和客户端版本保持一致
编写修改openvpn福务配置文件
# 建立存好openvpn服务加载证文件目录 [root@localhost yum.repos.d]# cd /etc/openvpn/ [root@localhost openvpn]# mkdir keys [root@localhost openvpn]# ls client keys server # 将之前生成的证书文件信息进行拷贝迁移,我这里youzipii指代的是server端 [root@localhost openvpn]# cp /root/easy-rsa-old-master/easy-rsa/2.0/keys/youzipii.crt ./keys/ [root@localhost openvpn]# cp /root/easy-rsa-old-master/easy-rsa/2.0/keys/youzipii.key ./keys/ [root@localhost openvpn]# cp /root/easy-rsa-old-master/easy-rsa/2.0/keys/ca.crt ./keys/ [root@localhost openvpn]# cp /root/easy-rsa-old-master/easy-rsa/2.0/keys/dh2048.pem ./keys/ [root@localhost openvpn]# ll keys/ total 20 -rw-r--r--. 1 root root 2329 Dec 9 17:56 ca.crt -rw-r--r--. 1 root root 424 Dec 9 17:56 dh2048.pem -rw-r--r--. 1 root root 8061 Dec 9 17:56 youzipii.crt -rw-------. 1 root root 3272 Dec 9 17:56 youzipii.key # 拷贝openvpn服务模板配置文件 [root@localhost openvpn]# pwd //别拷到keys里了 /etc/openvpn [root@localhost openvpn]# cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf ./ [root@localhost openvpn]# ll server.conf -rw-r--r--. 1 root root 10784 Dec 9 17:59 server.conf
编辑openvpn服务模板配置文件 [root@localhost openvpn]# vim server.conf 78 ca keys/ca.crt 79 cert keys/youzipii.crt 80 key keys/youzipii.key 85 dh keys/dh2048.pem 更改配置加载的证书文件路径信息 101 server 10.8.0.0 255.255.255.0 当vpn拨号建立连接成功后,会生成的隧道连接网段信息 143 push "route 10.8.0.0 255.255.255.0 144 push "route 172.16.30.0 255.255.255.0 表示路由信息推送,可以让拨号的客户端主机路由表中,添加以上两个路由条目信息;最终实现和企业私网以及vpn隧道私网建立通信 246 tls-auth keys/ta.key 0 表示拒绝服务攻击的道书 254 cipher AES-256-GCM 表示设置数据传输的加密模式,从2.4版本之后不能使用CBC模式了,需要改为GCM
tips: 命令行模式下/+要搜索的字符串,回车后可以快速查询
将相关配置文件替换为自己生成的证书和密钥
tips: vim 命令行模式下 :set nu可以显示行号
自定义隧道地址,我这里用默认的10.8.0.0
添加路由,我们可以到客户端看看,路由表是没有这条的
tips:yy复制,p粘贴
这里还有一个用来抵御DOS攻击的参数,这个文件目前
最后2.4版本后加密模式不能用CBC,得改成GCM
保存并退出,然后设置开启openvpn服务器路由转发
# 启用路由转发功能 [root@localhost openvpn]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf # 生效指令 [root@localhost openvpn]# sysctl -p net.ipv4.ip_forward = 1
建立ta.key文件,记得修改配置文件,不然启动不了
[root@localhost keys]# pwd /etc/openvpn/keys [root@localhost keys]# openvpn --genkey --secret ta.key [root@localhost keys]# ls ca.crt dh2048.pem ta.key youzipii.crt youzipii.key
遇到报错了
[root@localhost openvpn]# systemctl status openvpn@server.service
刚刚生成ta.key没有配置进去
启动运行openvpn服务程序
[root@localhost openvpn]# openvpn --daemon --config server.conf [root@localhost openvpn]# netstat -lntup | grep 1194 udp 0 0 0.0.0.0:1194 0.0.0.0:* 55134/openvpn
因为第二天重启了虚拟机,临时配置的selinux策略恢复了,openvpn挂了
重新配置一下
OpenVPN客户端 编写配置openvpn客户但程序配置文件 先在服务端创建一个用于汇总客户端信息的文件夹
[root@localhost ~]# mkdir client [root@localhost client]# pwd /root/client # 复制客户端文件 [root@localhost client]# cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf /root/client// [root@localhost client]# ls client.conf # 编辑配置文件 [root@localhost client]# vim client.conf
添加外网网卡的IP
修改加密方式
导出保存openvpn客户端证书相关文件 # 汇总拷贝整理客户端相关证书文件 [root@localhost client]# cp ~/easy-rsa-old-master/easy-rsa/2.0/keys/client.key /root/client/ [root@localhost client]# cp ~/easy-rsa-old-master/easy-rsa/2.0/keys/client.crt /root/client/ [root@localhost client]# cp ~/easy-rsa-old-master/easy-rsa/2.0/keys/ca.crt /root/client/ [root@localhost client]# cp /etc/openvpn/keys/ta.key /root/client/ # 检查信息 [root@localhost client]# ll total 24 -rw-r--r--. 1 root root 2329 Dec 10 20:28 ca.crt -rw-r--r--. 1 root root 3614 Dec 10 20:26 client.conf -rw-r--r--. 1 root root 7937 Dec 10 20:28 client.crt -rw-------. 1 root root 3268 Dec 10 20:28 client.key -rw-------. 1 root root 636 Dec 10 20:29 ta.key # 修改客户端文件后缀名称信息 [root@localhost client]# pwd /root/client [root@localhost client]# mv client.conf client.ovpn [root@localhost client]# ll client.ovpn -rw-r--r--. 1 root root 3614 Dec 10 20:26 client.ovpn
将所有openvpn客户端所需文件数据打包并下载保存
[root@localhost ~]# pwd /root [root@localhost ~]# zip client.zip client/* adding: client/ca.crt (deflated 31%) adding: client/client.crt (deflated 46%) adding: client/client.key (deflated 24%) adding: client/client.ovpn (deflated 54%) adding: client/ta.key (deflated 40%) [root@localhost ~]# ll client.zip -rw-r--r--. 1 root root 11222 Dec 10 20:43 client.zip [root@localhost ~]# sz -y client.zip
下载windows使用的客户端
下载好对应的文件,一直下一步即可
运行启动客户端软件程序,并将之前下载的客户端相关证书与配置文件导入到客户端软件程序中:
修改客户端程序设置中的高级选项配置信息,双击是不会跳出来的,右键右下角的隐藏图标才可以,选择选项
然后再右键这个图标,选择client节点,选择连接
在ipconfig中也可以看到配置
我们进入网络适配器看看具体信息
那说明我们服务端也该有个ip才对
测试连通性,以及问题解决
客户端
服务端
10.8.0.1
内网卡: 172.16.30.102
内网主机:172.16.30.101
客户端ping服务端
ping不通内网的web服务器。。。
试试服务端ping客户端
ping不通客户端的地址,不懂为什么,试着换了下vm的windows,就可以了
win-ipconfig
服务端配置nat转发 [root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j MASQUERADE # 有些可能会有问题,可以按下面这个配置 [root@localhost ccd]# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens36 -j MASQUERADE [root@localhost ccd]# iptables -I FORWARD 1 -i tun0 -o ens36 -j ACCEPT [root@localhost ccd]# iptables -I FORWARD 1 -i ens36 -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens36 -j MASQUERADE
这个命令添加了一条规则到 nat 表的 POSTROUTING 链。
-A 表示追加(Append)规则。
-s 10.8.0.0/24 指定源地址为 10.8.0.0/24 子网。
-o ens36 指定输出接口为 ens36。
-j MASQUERADE 表示使用 MASQUERADE 目标,这是一种特殊的 NAT 模式,用于动态 IP 地址转换,通常用于拨号或移动网络。
iptables -I FORWARD 1 -i tun0 -o ens36 -j ACCEPT
这个命令向 FORWARD 链插入(-I 表示插入)了一条规则,位置在链的第1条。
-i tun0 指定输入接口为 tun0。
-o ens36 指定输出接口为 ens36。
-j ACCEPT 表示如果匹配这条规则,则接受(ACCEPT)数据包。
iptables -I FORWARD 1 -i ens36 -o tun0 -j ACCEPT
这个命令同样向 FORWARD 链插入了一条规则,位置在链的第1条。
-i ens36 指定输入接口为 ens36。
-o tun0 指定输出接口为 tun0。
-j ACCEPT 表示如果匹配这条规则,则接受(ACCEPT)数据包。
但还是ping不通,但ping 10.8.0.1是通的,监听一下网卡tun0看看
[root@localhost openvpn]# tcpdump -i tun0
可以看到是有数据包过来的,应该是准发规则没做好,搜了下,找到 一篇文章,重新配置过nat,就可以了
查看配置
# 查看 FORWARD iptables -vL FORWARD --line-numbers # 查看 POSTROUTING iptables -t nat -vnL POSTROUTING --line-numbers
功能测试 之前不是搭建了简单的web站点在30.101,我们现在客户端上访问试试
可以看到也是成功访问到了