可能有不少人知道VPN的,在其中有一部分人应该知道并在使用OpenVPN或其相关技术。看看你的网络连接,是不是有TAP/TUN之类的虚拟网卡?是不是用过一些软件穿墙而出?有一些VPN类型的穿墙工具其实也是基于OpenVPN的,只不过可能自己再封装一个图形界面程序仅此而已。今天我要说的并不是穿墙的事,而是……如题。
普及一下IP与网络互访的问题
我们知道我们现在要访问网络上的机器,我们需要通过TCP/IP协议,利用IP地址找到对应的主机。IP地址分有几类,有一类是公网IP地址,也就是这个地址是全球唯一标识你的机器的(排除所有钻牛角尖的情况),那么通过这个IP地址我可以直接访问到你的机器。还有一类是IP地址是私有IP地址,一般会在局域网内用到,这类地址有一个范围,包括10.开头的(10.x.x.x)、172.16到172.31的和192.168开头的(192.168.x.x)。
私有的IP地址一般在局域网内用到,而局域网是有很多很多的,整个暨大内部可以组成一个局域网,你宿舍里面用路由器可以组一个局域网,你家里用路由器也可以组一个局域网。正因为局域网用的私有IP是不能在整个网络上唯一标识你的(在局域网内可以唯一标识你的机器),所以跨网络或者跨地区(指明显不在同一个局域网内)的时候,你无法直接访问一台只有私有IP地址而没有公网IP地址的机器。
一般的家庭ADSL宽带上网貌似都能拿到一个公网IP,如果你在家里就你一台机器接上MODEM拨号上网,那么公网IP就在你的机器上唯一标识你的机器,全世界都可以通过这个IP访问到你的机器(排除各种防火墙阻挡的情况),而问题是如果你在一个局域网下没有公网IP地址的时候,访问的障碍就产生了,这种情况很常见哦,例如你在家里用个路由器来自动拨号,或者用它来把网络共享给多个电脑,这样公网IP就分配在路由器上面了,你的机器将会得到的路由器所建立的局域网内的局域网私有IP,这个时候外部就算访问路由器得到的公网IP也只能访问到路由器这一层,而无法穿越到路由下的局域网内的机器(这也是路由器隔离隐蔽作用的体现,路由器之下还是有一些办法能够让外边机器访问到内网机器的,例如端口转发,但是不一定适合需求,后详)。
如果说两个机器有一个有公网IP而另外一个没有,那还是可以实现单向的访问的,但是如果两个机器都在局域网内怎么办?这个时候就需要一个中继来辅助了(排除TCP/UDP打洞穿越NAT等技术,什么东西都是有例外的,所以这文章这么多排除排除……)
VPN的再认识
VPN这个东西如果你没有穿过墙没有撞过墙恐怕在企业上班工作之前甚至一辈子都不会接触到(感谢郭嘉用这么强硬的手段来督促我们学习相关技术)。VPN中文是虚拟专用网络,P是private也可以理解为私有,上面说的局域网就是一种私有的网络。我们知道像局域网这样,局域网内的机器是可以通过局域网内私有IP地址互相访问的(再次排除各种防火墙和网关限制)。而VPN正是要去虚拟一个私有网络环境(暂时也理解成局域网吧),来让连接到VPN的机器组成一个虚拟的局域网,可以做一些局域网才能做或者才比较好做的事情(例如互访,访问特定资源)。
说这么多虚的来举下例子,很多企业他们有一些企业内部的资源会存放在企业内部的服务器上面,这个服务器并不允许一般人从外网直接访问,只能在内部局域网访问(例如公司里边办公室组成一个局域网之类的)。但是这家公司有多个地方的分公司,又或者要允许公司里面的人可以在家里办公,可以访问这个内部服务器。那么他们一般会有一个VPN服务器,这台服务器可以对外网提供服务,当外边其他地方的机器通过VPN的客户端软件连接到VPN服务器,那么它就相当于连接到了公司内部的网络(发现这个有点不好解释)。又例如我们暨大的图书馆资源,只能是学校内部网络上的机器可以访问,那么回家了怎么办?也是通过VPN这种方式把外网机器接入到暨大内部网络从而实现访问,很多高校的图书馆都是这么做的。
VPN有好几种类型,例如PPTP VPN,L2TP VPN和标题里面的OpenVPN等等。Openvpn是我看来一种比较好的方式,实现简单支持的设备多,作为服务器安装的OpenVPN可以装在各种服务器上面,包括OpenVZ的VPS,而PPTP VPN就不行。另外作为VPN的客户端,OpenVPN在各个平台下都有相应的工具,覆盖Win/Linux/Mac甚至各种移动平台,另外OpenVPN一般使用证书作为认证手段,默认一个人一个证书,并且默认不允许多人共用一份证书,相对安全一些。
OpenVPN的安装配置过程我就不想说了,网上一搜一大把,一般按照默认配置,我这里提几个关键的东西,例如服务器的配置中:
;push “redirect-gateway def1 bypass-dhcp” 这一行是说是否推送默认网关的设置,推送了的话连接到服务器的所有客户的流量都会转发到服务器那里过(一般穿墙用的就是这么整的),如果去掉了分号注释的话就推送,还需要额外配置iptables和转发的配置,如果只是为了标题说的机器间互访则不需要推送的。
client-to-client 这一行配置是允许及其之间互访的,默认是不允许的(前面有分号注释)。
说了这么多到底切到题没有我也不清楚,OpenVPN服务器客户端配置都不难,都能找到资料。连接上之后那个TAP/TUN的虚拟网卡就会拿到一个虚拟网络的内网IP,默认是10.8开头的,连进去的机器就可以通过这个IP实现互访,是互访哦不是单方向。