一、开篇立论= =..

上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的博文:win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃

不得不说,这是一个痛苦的过程... 毕竟之前没有在Windows上倒腾过服务器,忍不住说一句= = Windows真不适合弄服务器,T T.. 然而别无选择啊,天翼客户端只有Linux版本的!

二、概念介绍

  • 接下来教程开始,首先讲一讲VPN服务的原理

  虚拟专用网VPN(virt ual private network)是在公共网络中建立的安全网络连接,这个网络连接和普通意义上的网络连接不同之处在于,它采用了专有的隧道协议,实现了数据的加密和完整性的检验、用户的身份认证,从而保证了信息在传输中不被偷看、篡改、复制,从网络连接的安全性角度来看,就类似于再公共网络中建立了一个专线网络一样,只补过这个专线网络是逻辑上的而不是物理的所以称为虚拟专用网。VPN系统的结构图1所示,包括VPN服务器,VPN客户机和隧道。由于使用Internet进行传输相对于租用专线来说,费用极为低廉,所以VPN的出现使企业通过Internet既安全又经济的传输私有的机密信息成为可能。

  • 博主使用的VPN服务器软件是OpenVPN,OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。(附OpenVPN软件下载:openvpn-install-2.3.11-I601-x86_64.exe
  • 其他要用到的还有Windows自带的端口转发工具netsh,微软Windows的netsh是一个命令行脚本实用工具。使用netsh工具 ,可以查看或更改本地计算机或远程计算机的网络配置。不仅可以在本地计算机上运行这些命令,而且可以在网络上的远程计算机上运行。(后面会发现然并卵)

三、操作步骤概览

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 Files\TAP-Windows\bin目录下的addtap.bat 文件,来手动添加一个)

b.初始化配置

      (一)使用写字板打开 OpenVPN安装目录\easy-rsa\vars.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.生成根证书CAbuild-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-rsa\keys目录下的

        

        复制到OpenVPN安装目录\config目录下

       (三)打开OpenVPN GUI.exe

        此时在任务栏的右下角将会出现如下图所示的白色小图标,右键该图标,点击connect

        

        紧接着,就会自动弹出如下窗口,右下角图标变为黄色。

        
        连接成功后,窗口自动关闭,右下角的图标变为绿色。

        

    h.配置客户端,连接服务器端,使内网服务器和云服务器变为一个局域网

     (一)把配置文件client.ovpn复制到客户端 OpenVPN安装目录\config 下

     (二)把OpenVPN安装目录\easy-rsa\keys目录下的

        

          复制到OpenVPN安装目录\config目录下

          (三)打开OpenVPN GUI.exe

            和服务器端一样,图标为绿色表示成功。

          (四)验证局域网是否成功

            在服务器端ping客户端地址

            

            在客户端ping服务器端地址

            

  注:如果ping不通,看防火墙是否关闭。这里的OpenVPN设置是为了实现端口转发,如果内网服务器需要通过云服务器上网,请打开云服务器的本地连接的共享(不是OpenVPN的适配器,是云服务器联网的适配器)。

  2.配置端口转发,实现内网服务器对外网的发布(可省略)

    在云服务器端打开Dos命令窗口,

    例,将内网服务器的80端口转发到云服务器的14941端口

    我们在cmd里执行 netsh  实现端口转移。

    

     如果需要查看那些端口已经被转移,则在cmd执行 netsh interface portproxy show all

     如果需要删除那些端口转移,则在cmd执行 netsh

    

五、接下来

到这里OpenVPN的配置就全部完成了= =... 然而这时客户端连接VPN之后还是无法上网的,原因是客户端只是和服务端处于同个虚拟局域网中,但是服务端的外网并没有和虚拟局域网联通,所以无法上网。为了能让客户端连上外网,我们需要在服务端做路由nat转发或者是设置internet连接共享。

后者需要电脑带有双网卡,有双网卡的同学可以试一下,感觉我们的笔记本带有有线网卡和无线网卡应该算是双网卡了吧= =...

这里博主用的方法是:

  1. 笔记本插上网线,用天翼客户的拨号连接上校园网,此时笔记本已经可以上网了
  2. 笔记本用WIFI连接路由器(假设你已经有了路由器,没有的自行找办法)
  3. 在控制面板里给连接网线的“本地连接”设置Internet共享

  到这里基本就可以上网了。

  额... 可能有的同学电脑没有双网卡的,别急,那就用第一种方法..

  对了... 就是利用Serve系统的功能设置软路由nat转发

  首先确保你使用的操作系统是Server版,或者是XP... win7以上的可以搜索给系统添加netsh routing的方法,找不到就没办法了

  操作步骤如下:

  1. 按Win+R 输入并运行services.msc,在服务里面寻找Routing and Remote Access,右键单击进入属性,将启动类型更改为自动,并点击启动按钮。
  2. 编辑注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter= 1   然后重启电脑
  3. 在cmd控制台中依次输入一下命令
  4. netsh
    routing ip nat
    install
    add interface name="本地连接 2" mode=full //服务器上用于上外网的连接
    add interface name="本地连接 3" mode=private //安装OpenVPN时生成的虚拟连接
    add interface name="内部" mode=private
  5. 输入show interface命令后显示:
    NAT 内部 配置
    ---------------------------
    模式              : 专用接口
    
    NAT 本地连接 2 配置
    ---------------------------
    模式              : 地址和端口转换
    
    NAT 本地连接 3 配置
    ---------------------------
    模式              : 专用接口

    即表示NAT配置成功,重启。
    以上步骤实现后,则VPN+NAT配置成功。可拨入主机,并可通过主机代理出去访问主机所在的资源。如同处在主机带的局域网中。

(PS:由于博主使用的是win10专业版系统,并且通过各种搜索并没有找到能在win10中添加netsh routing模块的方法,所以已经放弃了挣扎。)

这次折腾从周六下午到晚上,花了很长的时间,最终的效果差强人意,不过这还是为绕过天翼限制提供了很好的思路,比如

  1. 自己手机二手配件然后配置一台价格很低的台式机,用台式机连校园网并开启vpn服务,配合路由器可以做到共享网络上网,这时最完美的解决方法,这台二手主机可以二十四小时开机,作为宿舍里的服务器
  2. 买一个openwrt系统的路由器,这种系统的路由器可以充当小型服务器,在路由器上面配置VPN也是没有问题的,在配置完VPN做一个nat转发,把外网的流量转发到宿舍里连接校园网的那台电脑就好了= =... 具体就不展开了(其实是具体操作博主也不会T T... 逃)

不知不觉就写了这么长了,不得不说,Windows真不适合搞服务器,还是Linux好用一些T T... 然而电信更辣鸡!

最新文章

  1. java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 错误的解决办法
  2. 转自coolshell--vim的基本操作
  3. Struts 2.0全面分析
  4. Linux学习笔记(4)Linux常用命令之权限管理命令
  5. Trie树 & 01Trie
  6. 如何判断raid1中哪块硬盘损坏?
  7. OOP设计模式[JAVA]——03职责链模式
  8. uva11082 Matrix Decompressing
  9. Java中4种权限的理解
  10. wemall app商城源码Android短信监听接收器
  11. C++ 将函数作为形参
  12. PHP程序污点型漏洞静态检测方法
  13. 【转】Windows下Python快速解决error: Unable to find vcvarsall.bat
  14. [转帖]以Windows服务方式运行ASP.NET Core程序
  15. Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
  16. deep learning自学知识积累笔记
  17. 内存映射文件(Memory-Mapped File)
  18. python数据分析系列(2)--numpy
  19. 基于jQuery商品分类选择提交表单代码
  20. ionic新手教程第八课-(加更)从无到有说Ionic、绘图说明MVC-U-S

热门文章

  1. SSH免密码登录过程解析和实现
  2. get()和post()方法编码的区别
  3. Photoshop如何实现UI自动切图?
  4. CamanJS – 提供各种图片处理的 JavaScript 库
  5. ruby(&gem) koala安装
  6. JavaScript中的各种变量提升(Hoisting)
  7. JavaScript concat() 方法-连接两个或多个数组
  8. 2013最常用的NoSQL数据库
  9. CSS 选择器 关系
  10. JSOM 对User的操作