OpenVPN介绍及其搭建
一、VPN 介绍
1、介绍
虚拟专用网络(英语:Virtual Private Network,缩写为VPN)是一种常用于连接中、大型企业或团体与团体间的私人网络的通讯方法。虚拟私人网络的讯息透过公用的网络架构(例如:互联网)来传送内部网的网络讯息。它利用已加密的通道协议(Tunneling Protocol)来达到保密、发送端认证、消息准确性等私人消息安全效果。这种技术可以用不安全的网络(例如:互联网)来发送可靠、安全的消息。需要注意的是,加密消息与否是可以控制的。没有加密的虚拟专用网消息依然有被窃取的危险。
VPN的实质就是利用加密技术在公用网上面封装出一个数据通讯隧道。
以日常生活的例子来比喻,虚拟专用网就像:甲公司某部门的A想寄信去乙公司某部门的B。A已知B的地址及部门,但公司与公司之间的信不能注明部门名称。于是,A请自己的秘书把指定B所属部门的信(A可以选择是否以密码与B通信)放在寄去乙公司地址的大信封中。当乙公司的秘书收到从甲公司寄到乙公司的信件后,该秘书便会把放在该大信封内的指定部门信件以公司内部邮件方式寄给B。同样地,B会以同样的方式回信给A。
在以上例子中,A及B是身处不同公司(内部网路)的计算机(或相关机器),通过一般邮寄方式(公用网络)寄信给对方,再由对方的秘书(例如:支持虚拟专用网的路由器或防火墙)以公司内部信件(内部网络)的方式寄至对方本人。请注意,在虚拟专用网中,因应网络架构,秘书及收信人可以是同一人。许多现在的操作系统,例如Windows及Linux等因其所用传输协议,已有能力不用通过其它网络设备便能达到虚拟专用网连接。
2、vpn分类
根据不同的划分标准,VPN可以按几个标准进行分类划分:
(1)按VPN的协议分类:
VPN的隧道协议主要有三种,PPTP、L2TP和IPSec,其中PPTP和L2TP协议工作在OSI模型的第二层,又称为二层隧道协议;IPSec是第三层隧道协议。
(2)按VPN的应用分类:
① Access VPN(远程接入VPN):客户端到网关,使用公网作为骨干网在设备之间传输VPN数据流量;
② Intranet VPN(内联网VPN):网关到网关,通过公司的网络架构连接来自同公司的资源;
③ Extranet VPN(外联网VPN):与合作伙伴企业网构成Extranet,将一个公司与另一个公司的资源进行连接。
(3)按所用的设备类型进行分类:
网络设备提供商针对不同客户的需求,开发出不同的VPN网络设备,主要为交换机、路由器和防火墙:
① 路由器式VPN:路由器式VPN部署较容易,只要在路由器上添加VPN服务即可;
② 交换机式VPN:主要应用于连接用户较少的VPN网络;
(4)按照实现原理划分:
① 重叠VPN:此VPN需要用户自己建立端节点之间的VPN链路,主要包括:GRE、L2TP、IPSec等众多技术。
② 对等VPN:由网络运营商在主干网上完成VPN通道的建立,主要包括MPLS、VPN技术。
3、VPN的实现方式有很多种方法,常用的有以下四种
(1)VPN服务器:在大型局域网中,可以在网络中心通过搭建VPN服务器的方法来实现。
(2)软件VPN:可以通过专用的软件来实现VPN。
(3)硬件VPN:可以通过专用的硬件来实现VPN。
(4)集成VPN:很多的硬件设备,如路由器,防火墙等等,都含有VPN功能,但是一般拥有VPN功能的硬件设备通常都比没有这一功能的要贵。
二、搭建pptp
1、检查系统是否支持ppp
[root@centos6 ~]# cat /dev/ppp
cat: /dev/ppp: No such device or address
如果出现以上提示则说明ppp是开启的,可以正常架设pptp服务,若出现Permission denied等其他提示,你需要先去VPS面板里看看有没有enable ppp的功能开关。
2、设置内核转发,开启路由转发
[root@centos6 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@centos6 ~]# sysctl -p 查看
3、安装pptp
[root@centos6 ~]# yum -y install pptpd
依赖epel 源
4、配置pptp
(1)配置主配置文件
[root@centos6 ~]# cp /etc/pptpd.conf{,.bak} 配置前备份
[root@centos6 ~]# vim /etc/pptpd.conf
option /etc/ppp/options.pptpd logwtmp localip 39.106.xxx.xxx #本机公网ip remoteip 192.168.1.100-110 #分配给VPN 客户端的地址,一般是内网网段地址
(2)配置账号文件
[root@along ~]# vim /etc/ppp/chap-secrets
client(客户端登录账号) server(服务) secret(密码) IP addresses(ip范围)
along pptpd 123456 * (允许所有ip)
(3)启动服务
[root@along ~]# systemctl start pptpd
检查服务是否开启
[root@along ~]# ps -ef |grep pptpd
[root@along ~]# ss -nutlp |grep pptpd 打开的端口是1723
5、设置SNAT 规则
[root@along ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
6、client 端连接vpn
① 连接新的工作群=区
② 通过VPN的方式
③ 输入IP
④ 输入用户名、密码
⑤ 连接成功
8、查看日志,看是否有client 端连接
[root@along ~]# tail -200 /var/log/messages 确实有client 连接
9、连接后的配置
需断开,设置后,再连接
10、测试连接后IP
搭建 OpenVPN 服务
VPN (CentOS搭建VPN服务)就是虚拟专用通道,是提供给企业之间或者公司个人与公司之间安全数据传输的隧道,OpenVPN是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI(图形用户界面)。
本篇文章包含OpenVPN应用场景,OpenVPN服务端搭建,OpenVPN客户端搭建(windows+linux),OpenVPN密码认证,手把手教大家搭建OpenVPN!
大家在操作的时候一定要小心谨慎,稍有不慎,尤其是windows客户端配置密码认证,稍有不慎就会出很多问题,大家耐心的修改配置文件,再重新尝试即可,希望大家都能做出来。
OpenVPN 应用场景
- 1、个人出差需要访问公司只有内网的服务器
- 2、公司不同地区之间建立服务通信(IDC与IDC之间)
OpenVPN 服务端搭建部署
安装配置证书软件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@Web01 ~]# yum -y install easy-rsa [root@Web01 ~]# mkdir /opt/easy-rsa [root@Web01 easy-rsa]# rpm -ql easy-rsa #查看已安装的RPM包中名为 easy-rsa 的文件列表 [root@Web01 easy-rsa]# cp -a /usr/share/easy-rsa/3.0.8/* . [root@Web01 easy-rsa]# cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars [root@Web01 easy-rsa]# > vars [root@Web01 easy-rsa]# cat 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 "Beijing" set_var EASYRSA_REQ_CITY "Shanghai" set_var EASYRSA_REQ_ORG "koten" set_var EASYRSA_REQ_EMAIL "888888@qq.comm" set_var EASYRSA_NS_SUPPORT "yes" |
创建证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | [root@Web01 easy-rsa]# ./easyrsa init-pki #1、初始化,在当前目录创建PKI目录,用于存储整数 [root@Web01 easy-rsa]# ./easyrsa build-ca #2、创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他提示内容直接回车即可 Enter New CA Key Passphrase: #注意密码不能太短,我这边设置的是123456 Re-Enter New CA Key Passphrase: [root@Web01 easy-rsa]# ./easyrsa gen-req server nopass #3、创建server端证书和私钥文件,nopass表示不加密私钥文件,提示内容直接回车即可 [root@Web01 easy-rsa]# ./easyrsa sign server server #4、给server端证书签名,提示内容需要输入yes和创建ca根证书时候的密码 [root@Web01 easy-rsa]# ./easyrsa gen-dh #5、创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法 [root@Web01 easy-rsa]# ./easyrsa gen-req client nopass #6、创建client端的证书和私钥文件,nopass表示不加密私钥文件,提示内容直接回车即可 [root@Web01 easy-rsa]# ./easyrsa sign client client #7、给client端证书前面,提示内容输入yes和创建ca根证书时候的密码 [root@Web01 easy-rsa]# tree #检查是否有ca根证书、客户端服务端证书、客户端服务端私钥 . ├── easyrsa #管理命令 ├── openssl-easyrsa.cnf ├── pki │ ├── ca.crt #ca根证书,服务端与客户端都需要用 │ ├── certs_by_serial │ │ ├── 633C217979C7B5F1D0A9ECA971006F96.pem │ │ └── 857F9B2E3F6C3D35934672212343B42D.pem │ ├── 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 #服务端私钥 ...... |
安装openvpn并写入服务端配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@Web01 easy-rsa]# yum -y install openvpn [root@Web01 easy-rsa]# cat /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 #给客户端分配的地址池 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数据压缩格式 |
启动并检查端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@Web01 easy-rsa]# systemctl start openvpn@server [root@Web01 easy-rsa]# systemctl enable openvpn@server Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@server.service to /usr/lib/systemd/system/openvpn@.service. [root@Web01 easy-rsa]# ip a s tun0 #查看网段 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::b1:7ea6:1178:8a1a/64 scope link flags 800 valid_lft forever preferred_lft forever [root@Web01 easy-rsa]# ss -lntup|grep 1194 #检查端口 udp UNCONN 0 0 *:1194 *:* users:(("openvpn",pid=47104,fd=6)) [root@Web01 easy-rsa]# ps -ef|grep openvpn #检查pid root 47104 1 0 10:59 ? 00:00:00 /usr/sbin/openvpn --cd /etc/openvpn/ --config server.conf root 47202 40565 0 11:01 pts/0 00:00:00 grep --color=auto openvpn |
OpenVPN客户端配置(linux端)
配置openvpn
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@Web02 ~]# yum -y install openvpn [root@Web02 ~]# cat /etc/openvpn/client.conf client dev tun proto udp remote 10.0.0.7 1194 resolv-retry infinite nobind ca ca.crt cert client.crt key client.key verb 3 persist-key comp-lzo [root@Web01 pki]# scp private/client.key 172.16.1.8:/etc/openvpn/ [root@Web01 pki]# scp issued/client.crt 172.16.1.8:/etc/openvpn/ [root@Web01 pki]# scp ca.crt 172.16.1.8:/etc/openvpn/ [root@Web02 ~]# systemctl start openvpn@client [root@Web02 ~]# systemctl enable openvpn@client Created symlink from /etc/systemd/system/multi-user.target.wants/openvpn@client.service to /usr/lib/systemd/system/openvpn@.service. |
测试连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | [root@Web02 ~]# ifdown eth1 #关闭内网IP [root@Web02 ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:36:19:29 brd ff:ff:ff:ff:ff:ff inet 10.0.0.8/24 brd 10.0.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe36:1929/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether 00:0c:29:36:19:33 brd ff:ff:ff:ff:ff:ff 4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100 link/none inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::b198:27bb:5967:356b/64 scope link flags 800 valid_lft forever preferred_lft forever [root@Web02 ~]# ping 172.16.1.7 #成功通过openvpn ping通 PING 172.16.1.7 (172.16.1.7) 56(84) bytes of data. 64 bytes from 172.16.1.7: icmp_seq=1 ttl=64 time=0.686 ms 64 bytes from 172.16.1.7: icmp_seq=2 ttl=64 time=1.13 ms ^C --- 172.16.1.7 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 0.686/0.908/1.130/0.222 ms |
OpenVPN客户端搭建部署(windows端)
安装OpenVPN软件
最新版本只有32位的程序,可以自行下载需要的即可(这个无法放网盘分享,只能自已去下了),下载地址:https://www.filehorse.com/download-openvpn/。
配置OpenVPN
将ca根证书、client.key、client.crt放入config目录
1 2 3 | [root@Web01 easy-rsa]# sz pki/ca.crt [root@Web01 easy-rsa]# sz pki/private/client.key [root@Web01 easy-rsa]# sz pki/issued/client.crt |
再创建client.ovpn,写入如下内容
1 2 3 4 5 6 7 8 9 10 11 12 | client dev tun proto udp remote 10.0.0.7 1194 #注意此处更改为openvpn服务端代码 resolv-retry infinite nobind ca ca.crt cert client.crt key client.key verb 3 persist-key comp-lzo |
连接测试
双击打开OpenVPN(桌面快捷方式)右下角出现图标,右键连接
等待进度走完会自动连接
右键,状态,详细信息,可以看到ipv4地址是10.8.0.6是我们配置的那个段的地址。
Xshell新开个本地会话,发现可以ping通openvpn服务端的内网,也可以进行ssh连接,当出差在外时,可以先连通openvpn内网再连接要工作的服务器的内网。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [c:\~]$ ping 172.16.1.7 正在 Ping 172.16.1.7 具有 32 字节的数据: 来自 172.16.1.7 的回复: 字节=32 时间=1ms TTL=64 来自 172.16.1.7 的回复: 字节=32 时间<1ms TTL=64 来自 172.16.1.7 的回复: 字节=32 时间<1ms TTL=64 172.16.1.7 的 Ping 统计信息: 数据包: 已发送 = 3,已接收 = 3,丢失 = 0 (0% 丢失), 往返行程的估计时间(以毫秒为单位): 最短 = 0ms,最长 = 1ms,平均 = 0ms ^C [c:\~]$ ssh 172.16.1.7 Connecting to 172.16.1.7:22... Connection established. To escape to local shell, press Ctrl+Alt+]. Last login: Sat May 20 09:07:58 2023 from 10.0.0.1 [root@Web01 ~]# |
直连其他内网服务器
首先确保我们的openvpn服务端开启了内核转发。
1 2 3 4 | [root@Web01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf #确保openvpn开启了ip转发 [root@Web01~]# sysctl -p net.ipv4.ip_forward = 1 |
尝试ping其他内网服务器,会显示请求超时,需要在添加其他内网服务器添加网关后,才可以ping通,才可以直连。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | [c:\~]$ ping 172.16.1.8 #1、无法ping通其他内网服务器,也就是无法直连 正在 Ping 172.16.1.8 具有 32 字节的数据: 请求超时。 ...... [root@Web02 ~]# yum -y install tcpdump #2、安装tcpdump尝试监控流量 [root@Web02 ~]# tcpdump -i eth1 -nn not icmp #3、windows端再次ping,虽然ping显示请求超时,但是tcp监控有流量进入,说明只能接收,不能返回 12:47:58.759367 IP 10.8.0.10 > 172.16.1.8: ICMP echo request, id 1, seq 514, length 40 12:48:03.290454 IP 10.8.0.10 > 172.16.1.8: ICMP echo request, id 1, seq 515, length 40 ...... [root@Web02 ~]# route add -net 10.8.0.0 netmask 255.255.255.0 gw 172.16.1.7 #4、添加路由,临时生效,可以加入/etc/rc.local实现永久生效 [c:\~]$ ping 172.16.1.8 #5、本地成功ping通 正在 Ping 172.16.1.8 具有 32 字节的数据: 来自 172.16.1.8 的回复: 字节=32 时间=1ms TTL=63 来自 172.16.1.8 的回复: 字节=32 时间=2ms TTL=63 ...... [c:\~]$ ssh 172.16.1.8 #6、直连也没有问题 Connecting to 172.16.1.8:22... Connection established. To escape to local shell, press Ctrl+Alt+]. Last login: Sun May 21 12:47:51 2023 from 10.0.0.1 [root@Web02 ~]# |
Openvpn密码认证
服务端配置
1、修改服务端配置文件为支持密码认证
1 2 3 4 5 | [root@Web01 ~]# cat /etc/openvpn/server.conf #添加配置文件 ...... script-security 3 #允许使用自定义脚本 auth-user-pass-verify /etc/openvpn/check.sh via-env #指定认证脚本 username-as-common-name #用户密码登陆方式验证 |
2、编写脚本文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@Web01 ~]# cat /etc/openvpn/check.sh # #!/bin/bash PASSFILE="/etc/openvpn/openvpnfile" #密码文件 用户名 密码明文 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 |
3、给脚本执行权限
1 | [root@Web01 ~]# chmod +x /etc/openvpn/check.sh |