前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Linux虚拟机]OpenVPN安装和基本使用方法,帮你快速理解公司网络

[Linux虚拟机]OpenVPN安装和基本使用方法,帮你快速理解公司网络

作者头像
李鹏华
发布2024-05-24 14:31:31
3190
发布2024-05-24 14:31:31
举报
文章被收录于专栏:网络信息安全网络信息安全
什么是OpenVPN

VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,OpenVPN无疑是Linux下开源VPN的先锋,提供了良好的性能和友好的用户GUI。 [1]

它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。 [1]

OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现,由于SSL协议在其它的词条中介绍的比较清楚了,这里重点对虚拟网卡及其在OpenVpn的中的工作机理进行介绍: [1]

虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安装后在主机上多出现一个网卡,可以像其它网卡一样进行配置。服务程序可以在应用层打开虚拟网卡,如果应用软件(如IE)向虚拟网卡发送数据,则服务程序可以读取到该数据,如果服务程序写合适的数据到虚拟网卡,应用软件也可以接收得到。虚拟网卡在很多的操作系统下都有相应的实现,这也是OpenVpn能够跨平台一个很重要的理由。 [1]

在OpenVpn中,如果用户访问一个远程的虚拟地址(属于虚拟网卡配用的地址系列,区别于真实地址),则操作系统会通过路由机制将数据包(TUN模式)或数据帧(TAP模式)发送到虚拟网卡上,服务程序接收该数据并进行相应的处理后,通过SOCKET从外网上发送出去,远程服务程序通过SOCKET从外网上接收数据,并进行相应的处理后,发送给虚拟网卡,则应用软件可以接收到,完成了一个单向传输的过程,反之亦然。 [1]

openvpn和pptp的区别

PPTP点对点隧道协议(PPTP)是一种实现虚拟专用网络的方法。 PPTP使用用于封装PPP数据包的TCP及GRE隧道控制通道。 OpenVPNOpenVPN是一免费开源软件,以路由器或桥接配置和远程访问设备方式实现虚拟专用网络(VPN)创建安全的点对点或站对站连接的解决方案。它使用SSL / TLS安全加密,具有穿越网络地址转换(NATs)和防火墙的功能。 在PPTP和OpenVPN二者之间做出选择的一个重要考虑因素,也是我们无法控制的因素,就是有时互联网服务供应商会阻止PPTP连接。次情况下我们无计可施,只能选择使用OpenVPN。 PPTP具有一些独特优势,但此刻用OpenVPN会是不错的选择。 PPTP可以应用到几乎所有的操作系统软件,无需安装任何软件。它也兼容许多移动设备,如iphone,ipad和Windows移动,安装简易。相比之下,OpenVPN的安装比PPTP要复杂一点,但只要按照正确的指示安装则无太大困难。请注意OpenVPN不兼容移动设备。 PPTP加密技术使用密码作为密钥,它的数据流载有可获取的混编密码。如果中间有人拦截到了数据流并且破译了密码(尽管可能但很难),那么他就可以破译你的信息。然而OpenVPN使用非常强大的加密(Blowfish)技术。即使有人拦截你的数据流,他们也无计可施。这使得OpenVPN比PPTP安全得多。 选择如果你希望得到高安全性以及更加关注数据安全传输问题,那么你应该使用OpenVPN。如果您为了简便或者想在移动设备上使用VPN那么PPTP适合你。还有其他协议,例如L2P或IPSec,但他们在用户友好或成本上没有优势。

安装vpn
代码语言:javascript
复制
sudo apt-get update
sudo apt-get install openvpn easy-rsa
安装CA

建立CA目录,OpenVPN是一个TLS/SSLVPN,这意味着它需要使用证书来在客户端和服务器之间加密数据。为了发布可信的证书,我需要建立我们自己的简单CA

复制easy-rsa临时目录到home目录

代码语言:javascript
复制
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
vim vars

系统默认如下

代码语言:javascript
复制
exportKEY_COUNTRY="US"
exportKEY_PROVINCE="CA"
exportKEY_CITY="SanFrancisco"
exportKEY_ORG="Fort-Funston"
exportKEY_EMAIL="me@myhost.mydomain"
exportKEY_OU="MyOrganizationalUnit"

我的配置

代码语言:javascript
复制
export KEY_COUNTRY="CN"
export KEY_PROVINCE="SX"
export KEY_CITY="TaiYuan"
export KEY_ORG="SYSU"
export KEY_EMAIL="bjernsen@163.com"
export KEY_OU="SDCS"

# X509 Subject Field
export KEY_NAME="server"

source FileName 作用:在当前bash环境下读取并执行FileName中的命令。

代码语言:javascript
复制
cd ~/openvpn-ca
source vars

提示如下则正确 NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/sammy/openvpn-ca/keys

但是我的报错如下

代码语言:javascript
复制
**************************************************************
  No /home/ubuntu/openvpn-ca/openssl.cnf file could be found
  Further invocations will fail
**************************************************************
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/ubuntu/openvpn-ca/keys

输入在opencpn-ca目录下,ls指令我们会看到很多个openssl的conf文件,我们将他们更名为openssl.conf就可以了

代码语言:javascript
复制
cp ~/openvpn-ca/openssl-1.0.0.cnf  ~/openvpn-ca/openssl.cnf

然后再输入source vars借口

还是在openvpn-ca目录下 ,构建ca

代码语言:javascript
复制
./clean-all
./build-ca

一直按回车确认即可

创建服务器证书,密钥和加密文档

接下来,我们将生成服务器证书和密钥对,以及加密过程中使用的一些其他文档。首先生成 OpenVPN 服务器证书和密钥对。我们可以通过输入:

代码语言:javascript
复制
./build-key-server server

接下来,我们将生成一些其他项目。 我们可以通过键入生成一个强大的 Diffie-Hellman 密钥,以便在密钥交换期间使用

代码语言:javascript
复制
./build-dh

之后,我们可以生成 HMAC 签名以增强服务器的 TLS 完整性验证功能,这步完成之后会生成一个ta.key在~/openvpn-ca/keys文件夹下

代码语言:javascript
复制
openvpn --genkey --secret keys/ta.key
生成客户端证书和密钥对

在 openvpn 中,这种配置方法是每一个登陆的 VPN 客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接(如果有两个机器安装相同证书,同时拨服务器,都能拨上,但是只有第一个拨上的才能连通网络)。所以需要建立许多份证书。

代码语言:javascript
复制
cd ~/openvpn-casource vars./build-key client1
配置 OpenVPN 服务

开始之前,把我们需要的相关文档复制到/etc/openvpn这个配置目录中去,即把~/openvpn-ca/keys目录下面的 ca.crt,ca.key,server.crt,server.key,HMAC 签名以及 Diffie-Hellman 文档复制到/etc/openvpn 这个目录下面

代码语言:javascript
复制
cd ~/openvpn-ca/keyssudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn

然后从 OpenVPN 自带的配置模板中复制配置文档

代码语言:javascript
复制
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/cd /etc/openvpn/sudo gzip -d server.conf.gz

接下来修改配置文档

代码语言:javascript
复制
sudo vim /etc/openvpn/server.conf

​ 然后找到tls-auth ta.key 0,在下方增加一个 key-direction 参数,设置其参数值为 0

代码语言:javascript
复制
tls-auth ta.key 0key-direction 0

然后找到cipher AES-256-CBC,在下方增加auth SHA256

代码语言:javascript
复制
user nobodygroup nobody
调整服务的网络配置

允许 IP 转发 首先,我们需要让我们的服务器来转发流量,这是我们需要 VPN 服务器来提供的最基本的功能。我们可以通过修改/etc/sysctl.conf 文档来调整网络设置

代码语言:javascript
复制
sudo vim /etc/sysctl.conf

在这个文档里面,找到net.ipv4.ip_forward,去除这一行之前的”#” 来解注释这个参数:

代码语言:javascript
复制
net.ipv4.ip_forward=1

然后保存退出 为了读取 sysctl.conf 文档并且让调整后设置对当前系统的 session 生效,键入如下命令:

代码语言:javascript
复制
sudo sysctl -p

然后保存退出 为了读取 sysctl.conf 文档并且让调整后设置对当前系统的 session 生效,键入如下命令:

代码语言:javascript
复制
sudo sysctl -p
开启 vpn 服务
代码语言:javascript
复制
sudo service openvpn start

查看 vpn 状态

代码语言:javascript
复制
sudo service openvpn status
配置防火墙

查看网卡名,默认eth0

代码语言:javascript
复制
ip route | grep default

可以看到终端中输出了一行内容,我们需要的口号应该是紧跟在“开发”后面的字符串

例如,我的输出如下,则我的公共网络接口为 enp2s0

代码语言:javascript
复制
 $ ip route | grep default default via 172.18.159.254 dev enp2s0  proto static  metric 100

知道接口后,我们就可以进行具体的 UFW 规则配置(为 NAT 表设置POSTROUTING 默认规则),从而为来自 VPN 的任何流量设置伪装连接。

以root权限打开/etc/ufw/before.rules文件,在最开头注释后面 添加如下部分,如下所示:

代码语言:javascript
复制
# NAT table rules*nat:POSTROUTING ACCEPT [0:0]# Allow traffic from OpenVPN client to eth0(changeto the interface you discovered!)-A POSTROUTING -s 10.8.0.0/8 -o eth0 -jMASQUERADE #这里为配置文件设置的虚拟网段COMMIT# END OPENVPN RULES

配置防火墙默认允许转发包,DROP改成ACCEPT

代码语言:javascript
复制
DEFAULT_FORWARD_POLICY="ACCEPT"

调整防火墙本身,以允许流量到OpenVPN,如果更改了配置文件中端口号,这里需要对应

代码语言:javascript
复制
ufw allow 1193/udpufw allow OpenSSH

重启防火墙,到这里我们的服务器可以正确地处理OpenVPN流量了

代码语言:javascript
复制
ufw disableufw enable
配置客户端

config文件夹中应该有5个东西,ca.crt,client.crt,client1.ket,ta.key以及配置文件cilent.ovpn

代码语言:javascript
复制
############################################### Sample client-side OpenVPN 2.0 config file ## for connecting to multi-client server.     ##                                            ## This configuration can be used by multiple ## clients, however each client should have   ## its own cert and key files.                ##                                            ## On Windows, you might want to rename this  ## file so it has a .ovpn extension           ################################################ Specify that we are a client and that we# will be pulling certain config file directives# from the server.client# Use the same setting as you are using on# the server.# On most systems, the VPN will not function# unless you partially or fully disable# the firewall for the TUN/TAP interface.;dev tapdev tun# Windows needs the TAP-Win32 adapter name# from the Network Connections panel# if you have more than one.  On XP SP2,# you may need to disable the firewall# for the TAP adapter.;dev-node MyTap# Are we connecting to a TCP or# UDP server?  Use the same setting as# on the server.;proto tcpproto udp# The hostname/IP and port of the server.# You can have multiple remote entries# to load balance between the servers.remote 81.70.205.40 1194;remote my-server-1 1194;remote my-server-2 1194# Choose a random host from the remote# list for load-balancing.  Otherwise# try hosts in the order specified.;remote-random# Keep trying indefinitely to resolve the# host name of the OpenVPN server.  Very useful# on machines which are not permanently connected# to the internet such as laptops.resolv-retry infinite# Most clients don't need to bind to# a specific local port number.nobind# Downgrade privileges after initialization (non-Windows only)user nobodygroup nobody# Try to preserve some state across restarts.persist-keypersist-tun# If you are connecting through an# HTTP proxy to reach the actual OpenVPN# server, put the proxy server/IP and# port number here.  See the man page# if your proxy server requires# authentication.;http-proxy-retry # retry on connection failures;http-proxy [proxy server] [proxy port #]# Wireless networks often produce a lot# of duplicate packets.  Set this flag# to silence duplicate packet warnings.;mute-replay-warnings# SSL/TLS parms.# See the server config file for more# description.  It's best to use# a separate .crt/.key file pair# for each client.  A single ca# file can be used for all clients.ca ca.crtcert client1.crtkey client1.key# Verify server certificate by checking that the# certicate has the correct key usage set.# This is an important precaution to protect against# a potential attack discussed here:#  http://openvpn.net/howto.html#mitm## To use this feature, you will need to generate# your server certificates with the keyUsage set to#   digitalSignature, keyEncipherment# and the extendedKeyUsage to#   serverAuth# EasyRSA can do this for you.remote-cert-tls server# If a tls-auth key is used on the server# then every client must also have the key.tls-auth ta.key 1key-direction 1# Select a cryptographic cipher.# If the cipher option is used on the server# then you must also specify it here.;cipher xcipher AES-256-CBCauth SHA256# Enable compression on the VPN link.# Don't enable this unless it is also# enabled in the server config file.comp-lzo# Set log file verbosity.verb 3# Silence repeating messages;mute 20

用到的链接:

https://james-yip.github.io/2017/11/23/construct-VPN/

https://www.dazhuanlan.com/wuxinxiangshan/topics/1100854

https://cloud.tencent.com/developer/article/1840491

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是OpenVPN
  • openvpn和pptp的区别
  • 安装vpn
  • 安装CA
  • 创建服务器证书,密钥和加密文档
  • 生成客户端证书和密钥对
  • 配置 OpenVPN 服务
  • 调整服务的网络配置
  • 开启 vpn 服务
  • 配置防火墙
  • 配置客户端
相关产品与服务
VPN 连接
VPN 连接(VPN Connections)是一种基于网络隧道技术,实现本地数据中心与腾讯云上资源连通的传输服务,它能帮您在 Internet 上快速构建一条安全、可靠的加密通道。VPN 连接具有配置简单,云端配置实时生效、可靠性高等特点,其网关可用性达到 99.95%,保证稳定、持续的业务连接,帮您轻松实现异地容灾、混合云部署等复杂业务场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档