赞
踩
万事皆有因。openVPN是在很早之前公司有连接数据库及服务器的需求时就已经开始使用。但仅限于下载软件,倒入配置文件,输入账号密码这样的程度。再或者,就是在公司的服务器上安装软件,根据配置文件启动。这一切都建立在服务端已经完成搭建及配置,个人是以一个用户的角色去使用openVPN。
近日闲置一台云服务器,有公网IP,有流量,但无奈是弹性云服务器,性能方便深感抱歉。个人在搭建了一个trilium做笔记本,以及一个mysql5偶尔使用外,再无法负担其他应用。因此我产生一个想法,既然该服务器有公网IP,有流量。也就是说,我家里的电脑能连接上,我公司的电脑也能连接上,那么能否以该云服务器做中转站,使得我在外面的时候能直接访问到家里的电脑,放置一些中间件使其也能为我所用。
因此我能想到的就有两种方案,1.云服务器上设置端口转发,使用ssh连接,将A电脑的访问通过云服务器转发到B电脑。但一是在公网上使用ssh连接存在安全风险,二是这种使用方式纵使使用密码,也需要设置强密码并定期更换。2.使用VPN工具。
使用VPN工具的话,较多的有SoftEther VPN,openVPN。使用openVPN是公司也要用该工具,我的电脑没必要放置几个VPN工具使用。一般来说,安装东西这类教程网上都很多,但绝大多数都会因为时间,版本,各种细微差别的不同而导致失败,因此本文做一记录,为在其他教程中遇到困难的朋友提供参考。
openVPN的服务器与客户端并没有区分,事实上它是根据配置文件来区分该软件究竟是做服务器角色还是做客户端角色。安装一般来说条件允许的话是可以通过脚本进行一键安装的。
在github上安装脚本的星标反而超过了软件本身。
点进第一个install的脚本,复制他的脚本一键安装,再根据服务器提示的信息逐步操作即可。但该方式的操作是有缺陷的,比如我的服务器,无法连接到脚本中的git.io的服务器。在这种情况下就需要自己手动安装。
如果确定要进行手动安装及配置,那么在时间充裕的情况下,推荐通过官网文档的步骤进行安装https://openvpn.net/community-resources/how-to/#openvpn-quickstart。如果想要快速部署快速测试,则可通过网上其他现成的教程安装,搭配官网文档的说明进行使用。
在此之前,先创建两个文件夹,主要是用来后面处理SSL证书。
mkdir -p ~/ovpn
mkdir -p ~/ovpn/keys
接着安装openVPN。这里操作系统不同命令不同,如果拿捏不准可以dnf,yum,wget都试试。我用的是ubuntu,这里就用apt去下载。
sudo apt install openvpn
接着安装Easyrsa。在此之前先了解一下SSL证书,SSL证书是一种加密网络通信和建立安全连接的数字证书。简言之,连接加密,通讯加密且提供身份验证。而Easyrsa可以用来快速创建SSL证书。
cd ~/ovpn
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.7/EasyRSA-3.1.7.tgz
tar xvf EasyRSA-3.1.7.tgz
mv EasyRSA-3.1.7 easyrsa
cd easyrsa
cd ~/ovpn/easyrsa
./easyrsa init-pki
编辑pki下的vars文件,个人 一般是先备份一下再改动
cd pki
cp vars.save vars1.save
vim vars.save
只保留以下两行
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
生成根证书,在此之后的步骤中,记录自己输入的有关账号,密码等值
./easyrsa build-ca
服务器证书生成并签名
./easyrsa gen-req server nopass
./easyrsa sign-req server server
客户端证书生成并签名
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
生成密钥
openvpn --genkey secret ta.key
并将所需的文档移动到前面创建的另一个文件夹去
cp ~/ovpn/easyrsa/pki/ca.crt ~/ovpn/keys
cp ~/ovpn/easyrsa/ta.key ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/private/server.key ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/issued/server.crt ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/private/client1.key ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/issued/client1.crt ~/ovpn/keys
第三个Diffie-Hellman参数没有创建,暂时也不需要。
先到server.conf文件目录下去
cd ~/ovpn/keys
vim server.conf
port 8083 proto tcp dev tun ca ca.crt cert server.crt key server.key dh none tls-crypt ta.key 0 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt client-to-client //支持客户端之间的连接 push "route 10.0.24.13 255.255.255.0" //自己设备的内网地址 cipher AES-256-GCM auth SHA256 duplicate-cn keepalive 10 120 verb 3 explicit-exit-notify 0 client-config-dir ccd //客户端间连接时路由转发配置文件夹
两个注意点,1.端口自定义,但后续其他文档中要保持一致即可。2.部分文档配置会增加下面两条
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.66.0.4"
push "dhcp-option DNS 10.66.0.5"
需要注意其真实含义
该命令是使用指定的DNS服务器,一般来说先不用直接指定。
一般来说,使用VPN的请求都是在需要使用VPN时才走VPN代理。但该配置会将所有请求都走VPN代理,谨慎使用。
且这里增加了 client-to-client,表明支持客户端之间的连接。
客户端配置文件,修改client1.ovpn即可。
vim client1.ovpn
将码填充为自己服务器的IP即可。
一般来说,将keys文件夹中的ca.crt,ta.key,client1.crt,client1.key,client1.ovpn导出来,在客户端导入client1.ovpn,再找到配置文件夹,将其余文件放在同层即可。
但若需要优化的话,可以将其余文件的内容通过标签的形式粘到client1.ovpn文件中,粘贴在文件最后即可。
<ca> ca.crt </ca>
<cert> client1.crt </cert>
<key> client1.key </key>
<tls-crypt> ta.key </tls-crypt>
此时的配置文件人人可用,若想通过更加严密的加密方式对访客进行验证。账户/密码,双因子认证等openVPN都支持,详情在:https://openvpn.net/community-resources/how-to/#using-alternative-authentication-methods
为什么要进行NAT设置呢?因为云服务器一般都是有防火墙的。因此需要设置一个转发规则。
这里直接拿现成的。
先进/etc/sysconfig看有无该文件夹,若无的话使用mkdir命令新建一个。
vim /etc/sysconfig/nftables.conf
进行如下配置
配置是灵活的,根据自己的实际情况修改即可,把tun0改为本机为openVPN创建的虚拟网卡,eth0修改为本季的真实网卡。
让脚本生效
nft -f /etc/sysconfig/nftables.conf
允许服务器转发
sudo vim /etc/sysctl.conf
新增或取消注释
net.ipv4.ip_forward=1
启动:
cd ~/ovpn/keys
openvpn --config ~/ovpn/keys/server.conf
成功启动后就可以拿上面的client1.conf文件去你的设备上连接VPN了,这时openVPN会分配给你一个IP。可以使用ip addr,ifconfig, ip config 等命令查看openVPN的网卡IP。
这里可以参考https://openvpn.net/community-resources/how-to/#creating-configuration-files-for-server-and-clients及https://xwenw.com/5061.html。
两个内网设备之间需要联通访问,需在配置文件夹新增一个ccd文件夹,官网的说法是当新客户端连接到OpenVPN服务器时,守护程序将检查此目录中是否有与连接客户端的通用名称匹配的文件。如果找到匹配的文件,将读取并处理该文件,以便将其他配置文件指令应用于命名客户端。
由于我们的配置文件全在keys里面,所以直接在keys里面创建ccd,再在ccd里面新增一个client1.conf。值得注意的是,必须与客户端配置文件同名。
这里配置的ip,就是你需要访问到的设备openVPN分配给它的IP。在后续将作出图示说明,另外这里经过实际验证,配置
ifconfig-push 10.8.0.9 10.8.0.10
也是一样可行的。
先确认两台计算机之间无法连通。
计算机A:
计算机B:
假设我的计算机是B,想连接的是A。BpingA,超时。
两台计算机分别连通vpn。
连接后计算机A分配的ip:
这里也正是我们配置在上文ccd文件夹中client1.conf文件中的ip。
连接后计算机B分配的ip:
B先试pingA。
能ping通,延迟稍高是因为设备B用的手机热点测试。
我在A上放置了一个httpd应用,端口80,防火墙开启端口80。B先直接访问。
无法访问,很合理。
B访问openVPN分配给A的IP。
成功访问。至此两台在各自局域网的主机,通过一台架在公网上的openVPN连接了起来。
本文依托大量网络资源,主要还是看https://blog.csdn.net/rockage/article/details/127190263这篇,但也存在一些暗坑,且该文只负责客户端连接服务器,无客户端间的连接,因此写出这篇符合我个人需求的安装文档。
上文只支持B连A,但A是连接不上B的,这也已有解决方案。在文中给出的链接也有过说明,再新生成一份客户端连接配置,比如名为client2.conf(linux) 或者client2.ovpn(windows),在ccd中参照client1,新写一个client2的文件即可。
PS:但我们公司的解决方案应该不是这样,可能是有什么神奇的配置我还没发现,但目前这种使用方式能满足我的需求即可。
可能上述行文也有我个人没有注意到的暗坑,搭配前面给出的官网文档配合使用,官网文档中也给出了示例配置文件的文职可以看看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。