如何利用云服务器通过OpenVPN将内网的地址发布到外网
一、目的:
通过云服务器的外网地址,将没有外网的服务器的端口地址转发到外网,使其能够通过外网进行访问。
二、原理:
1.虚拟专用网VPN
虚拟专用网VPN(virt ual private network)是在公共网络中建立的安全网络连接,这个网络连接和普通意义上的网络连接不同之处在于,它采用了专有的隧道协议,实现了数据的加密和完整性的检验、用户的身份认证,从而保证了信息在传输中不被偷看、篡改、复制,从网络连接的安全性角度来看,就类似于再公共网络中建立了一个专线网络一样,只补过这个专线网络是逻辑上的而不是物理的所以称为虚拟专用网。VPN系统的结构图1所示,包括VPN服务器,VPN客户机和隧道。由于使用Internet进行传输相对于租用专线来说,费用极为低廉,所以VPN的出现使企业通过Internet既安全又经济的传输私有的机密信息成为可能。
2.Windows操作系统中利用OpenVPN配置VPN
OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。
3.Windows自带的端口转发工具netsh
微软Windows的netsh是一个命令行脚本实用工具。使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行。
三、环境及软件:
1.本文基于Windows下的环境配置。
2.软件OpenVPN(本文使用openvpn-install-2.3.11-I601-x86_64.exe 64位安装文件)。
四、步骤:
1.安装OpenVPN,实现内网服务器和云服务器变为一个局域网(a.b.c.d.e.f.g 在云服务器完成,h 在内网服务器完成)
a.云服务器安装OpenVPN;
b.初始化配置;
c.生成根CA;
d.生成dh1024.pem文件;
e.生成服务器端证书、客户端证书和TA证书;(以上cmd命令必须在一个cmd完成)
f.对服务器端和客户端配置文件文件进行配置;
g.配置服务器端,为客户端连接做准备;
h.配置客户端,连接服务器端,使内网服务器和云服务器变为一个局域网;
2.配置端口转发,实现内网服务器对外网的发布
五、步骤内容:
1.安装OpenVPN,实现内网服务器和云服务器变为一个局域网。
a.云服务器安装OpenVPN
双击openvpn-install-2.3.11-I601-x86_64.exe开始安装:
安装完毕后,打开 控制面板->网络和 Internet->网络和共享中心->更改适配器设置
出现虚拟网卡为TAP-Windows Adapter V9的新本地连接,将其改名为OpenVPN。
(注:如果没有出现新的本地连接,请双击C:Program FilesTAP-Windowsin目录下的addtap.bat 文件,来手动添加一个)
b.初始化配置
(一)使用写字板打开 OpenVPN安装目录easy-rsaars.bat.sample 文件容(最好用写字板打开,以免记事本打开会破坏文档格式),如下:
注:上面文件信息可以不予更改。但是,由于稍后给客户端生成对应加密证书和私钥时,程序会要求我们输入一些注册信息。如果你需要配置多个客户端,并且许多信息都相同(比如国家、省市、地址、公司名称等)你还可以修改vars.bat.sample文件后面的一些相关变量的默认值,这样在稍后生成客户端证书的时候,如果该信息项不输入就会采用默认值。
(二)运行DOS命令,初始化执行环境。
打开 %OpenVPN的安装目录%easy-rsa 目录,按住 Shift + 右键 选择 在此处打开命令窗口 ,
然后依次输入并执行以下命令:
init-config(初始化配置,将vars.bat.sample文件的内容复制到vars.bat。实际上,你也可以直接双击执行easy-rsa目录下的init-config.bat文件来代替这一步。) vars(设置相应的局部环境变量,就是我们在vars.bat.sample文件中设置的内容) clean-all(相关设置和清理工作) |
c.生成根证书CA:build-ca
如上图所示,在build-ca的时候需要输入一些注册信息。在输入信息的时候,如果你不输入任何信息,就表示采用默认值(前面[]中的内容就是默认值);如果你输入 .(点号) ,则表示当前信息项留空白。值得注意的是,上图中紫色框中的OpenVPN_CA是证书的通用名称(Common Name),相当于我们常说的账号,你也可以自行输入其他名称。
d.生成dh1024.pem文件(创建迪菲·赫尔曼密钥):build-dh
迪菲·赫尔曼密钥交换(Diffie–Hellman key exchange,简称「D–H」) 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。
e.生成服务器端证书、客户端证书和TA证书
(一)生成服务端证书:build-key-server server
如上图所示,命令中的参数server指的是生成的证书文件名称,你可以按照自己的需要进行修改,不过后面的Common Name也应保持一致。第三个红色矩形框中是输入的密码,你也可以根据意愿自行输入。最后程序会询问你是否注册并提交证书,两次均输入y即可。
(二)生成客户端证书:build-key CdtsmClient
如上图所示,命令中的参数client表示生成的证书文件名称,你可以按照自己的需要进行修改,不过后面的Common Name也应保持一致。第三个红色矩形框中是输入的密码,你也可以根据意愿自行输入。最后程序会询问你是否注册并提交证书,两次均输入y即可。
如果你想创建多个不同的客户端证书,只需要重复此步骤即可。切记,Common Name不要重复,这是OpenVPN用来区分不同客户端的关键所在。
(三)生成TA证书:openvpn --genkey --secret keys/ta.key
这一步其实是可选操作,生成的ta.key主要用于防御DoS、UDP淹没等恶意攻击。命令中的第3个参数keys/ta.key表示生成的文件路径(含文件名)。
非常重要的提醒:以上命令都是在同一个DOS窗口中执行的,如果你以后需要打开新窗口来执行命令(比如创建新的客户端证书):你不需要再执行init-config命令,除非你再次改动了vars.bat.sample文件;每一次打开新窗口时都需要先执行vars命令,后面才能执行其他命令。
f.对服务器端和客户端配置文件进行配置
上面我们已经创建了OpenVPN配置所需要的各种证书和私钥,现在我们开始为服务器和客户端编写对应的配置文件,文件目录为 OpenVPN安装目录sample-config 。
对于一个刚刚接触OpenVPN的人来说,我们应该配置些什么呢,又该从哪里入手呢?别着急,OpenVPN已经考虑到了这一点。在OpenVPN的安装目录的sample-config文件夹中存放有3个示例模板文件:server.ovpn、client.ovpn、sample.ovpn。其中,server.ovpn是服务器的配置模板,client.ovpn是客户端的配置模板(sample.ovpn也可用作客户端配置模板,不过配置比较简单,不够全面。按照官方的说法,client.ovpn可用于连接具有多个客户端的服务器端配置文件)。
在OpenVPN的配置文件中,前面带「#」或「;」的表示注释内容。
(一)配置服务端文件:server.ovpn
local 192.168.0.2 #指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。 port 1194 #指定监听的本机端口号 proto udp #指定采用的传输协议,可以选择tcp或udp dev tun #指定创建的通信隧道类型,可选tun或tap ca ca.crt #指定CA证书的文件路径 cert server.crt #指定服务器端的证书文件路径 key server.key #指定服务器端的私钥文件路径 dh dh1024.pem #指定迪菲赫尔曼参数的文件路径 server 10.8.0.0 255.255.255.0 #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.8.0.1。 ifconfig-pool-persist ipp.txt #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。 client-to-client #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接。 keepalive 10 120 #每10秒ping一次,连接超时时间设为120秒。 tls-auth ta.key 0 #开启TLS,使用ta.key防御攻击。服务器端的第二个参数值为0,客户端的为1。 comp-lzo #开启VPN连接压缩,如果服务器端开启,客户端也必须开启 persist-key persist-tun #持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。 status openvpn-status.log #指定记录OpenVPN状态的日志文件路径 verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 |
实际修改内容参见下面的截图。
(二)客户端配置文件:client.ovpn
client #指定当前VPN是客户端 dev tun #必须与服务器端的保持一致 proto udp #必须与服务器端的保持一致 remote 192.168.0.2 1194 #指定连接的远程服务器的实际IP地址和端口号 resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。 nobind #不绑定特定的本地端口号 persist-key persist-tun ca ca.crt #指定CA证书的文件路径 cert client.crt #指定当前客户端的证书文件路径 key client.key #指定当前客户端的私钥文件路径 remote-cert-tls server #指定采用服务器校验方式 tls-auth ta.key 1 #如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行; comp-lzo #与服务器保持一致 verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细 |
实际修改内容参见下面的截图。
g.配置服务器端,为客户端连接做准备
(一)把配置文件server.ovpn复制到服务器端 OpenVPN安装目录config 下
(二)把OpenVPN安装目录easy-rsakeys目录下的
复制到OpenVPN安装目录config目录下
(三)打开OpenVPN GUI.exe
此时在任务栏的右下角将会出现如下图所示的白色小图标,右键该图标,点击connect
紧接着,就会自动弹出如下窗口,右下角图标变为黄色。
连接成功后,窗口自动关闭,右下角的图标变为绿色。
h.配置客户端,连接服务器端,使内网服务器和云服务器变为一个局域网
(一)把配置文件client.ovpn复制到客户端 OpenVPN安装目录config 下
(二)把OpenVPN安装目录easy-rsakeys目录下的
复制到OpenVPN安装目录config目录下
(三)打开OpenVPN GUI.exe
和服务器端一样,图标为绿色表示成功。
(四)验证局域网是否成功
在服务器端ping客户端地址
在客户端ping服务器端地址
注:如果ping不通,看防火墙是否关闭。这里的OpenVPN设置是为了实现端口转发,如果内网服务器需要通过云服务器上网,请打开云服务器的本地连接的共享(不是OpenVPN的适配器,是云服务器联网的适配器)。
2.配置端口转发,实现内网服务器对外网的发布
在云服务器端打开Dos命令窗口,
例,将内网服务器的80端口转发到云服务器的14941端口
我们在cmd里执行 netsh interface portproxy add v4tov4 listenport=14941 connectaddress=10.8.0.6 connectport=80 实现端口转移。
如果需要查看那些端口已经被转移,则在cmd执行 netsh interface portproxy show all
如果需要删除那些端口转移,则在cmd执行 netsh interface portproxy delete v4tov4 listenport=14941
六、结果演示
这里将80设为14980