注:本文主要目的是给程序员讲述一些局域网/VPN的基本知识,并不涉及到具体的实操。关于如何安装VPN服务器、配置VPN客户端及修改Windows路由表等具体实操内容,请自行搜索。

RFC

局域网地址为什么是192.168.X.X?简单地说这是RFC的建议,具体请查看: https://tools.ietf.org/html/rfc5735#section-4

准确说,不只有192.168.X.X,一共有3段地址可以作为局域网的地址:


所以看到10开头的或者192.168开头的IPv4地址,那就可以认为是局域网地址了,比较特殊的是172开头的,因为它的掩码是12,不是8的整数倍,所以光看到172开头的地址还不能马上确定是不是局域网地址,要看是否在172.16.X.X至172.31.X.X之间。

既然是建议,那就不是技术上的硬性要求,那么我能不能把局域网地址设置成别的?答案是肯定的。

比如你可以设置成20.8.13.46,看起来像个公网地址对不?但这样并不会有什么好处,反而很可能会引起冲突,想一下假如这真的是一个你要访问的公网地址,那你可能就访问不到了,因为你的网络适配器认为这是个局域网地址,不会走网关到公网去。

我们有个客户的局域网就是类似这种“非标”的,不按套路出牌,造成了不少困扰。

另外提一下RFC,RFC是Request For Comments的意思,意思就是“草案”,Internet开始构建的时候,全世界的工程师们起草的各种文档,不断讨论更新和修正,所以叫RFC,时过境迁,很多文档都成为了事实上的标准,但RFC这个名字惯性太大,保留了下来。

为什么要弄3个网段?

因为这3个网段正好对应了A类、B类和C类地址。

A类地址组成的局域网可以容纳海量主机,B类地址能容纳的主机数量也很多,C类地址则只可以容纳254台主机。

事实上,就算你用了A类地址,你也可以设置子网掩码为24(255.255.255.0的表示,即24个1)来使得这个A类地址和C类地址一样,只容纳254台主机。

但不管怎么说,这是一种广泛被接受的约定,所以当系统看到一个A类地址的时候,如果没有额外的配置说明,就默认它的子网掩码是8,同理,默认B类地址子网掩码为16,C类为24。

那我们应该选择哪个网段好呢?我认为用B类地址最为灵活!为什么?要解释可不是那么容易,接着看吧。

为什么连上公司的VPN就上不了网?

嗯?怎么突然扯这么一个风马牛不相关的问题?没事,接着看呗。

为什么连上公司的VPN就上不了网?这是一个困扰了很多人的问题,“通俗”(但不正确)的说法就是一旦连上了VPN,就相当于接入了目标的内网去,当然不能正常访问其它网络了。我首先声明这种说法并不正确,下面具体来说说。

站在我们的视角来说,VPN干了两件事情:

1,创建一个虚拟网卡,未连接的时候这个网卡是灰色的,即未启用,这个虚拟网卡我们称之为VPN网络适配器
2,连接VPN的时候,虚拟网卡启用,并修改Windows的路由表使得部分或全部网络访问都透过VPN网络适配器

VPN网络适配器可以在Windows的控制面板的“控制面板\网络和 Internet\网络和共享中心”里的“更改适配器设置”里看到。我们程序员先了解到这里即可,至于VPN客户端如何与VPN服务器打交道,使用怎样的隧道协议,过程如何,这个是另一个超级大的话题了,这里不表。

从“适配器”这个驱动层面的东西来看,VPN是比较“底层”的,我们的程序不需要关心这个,不像代理服务器,需要在程序里设。

现在,连VPN就上不了网这个问题应该怎么解释?根据前面提到的那1、2两步,我们不难知道,问题出在第2步上,比如你在家里,你要连接公司的内网,IP地址是192.168.20.0/24,现在连接,成功,你能轻松访问192.168.20.112这台主机了,但不幸的是,根据Windows当前的路由表配置,你的任何网络访问都会走VPN网络适配器,于是你访问taobao.com也会走VPN,但公司的网络限制了对taobao.com的访问啊,所以就出现这个问题了。

很显然,此问题有两种解,一是让你们公司IT开放对taobao.com的访问;二是自己修改Windows路由表,使得对其它网络(包括公网)的访问不走VPN。显然你只能采取第二种方案。

修改路由表是解决这类问题的必杀技,这是可以肯定的,但有时候会比较麻烦,假如你用的VPN客户端不是Windows自带的,而是公司/客户提供的,每次连接的时候,它就会在你的Windows的路由表中塞入一大堆很令人费解的配置,这些乱七八糟配置使得你的正常网络的访问变得不可能,你要一条条把这些配置删除,然后把必要的一条路由规则加进去,符合这条规则的才走VPN,否则走原先默认的适配器,这样是可以的,但是但是,这种VPN一旦断开,你重连的时候,你会发现你辛辛苦苦配的Windows路由表又被它重置了,每次都如此,让人无法接受,前面我提到的那个用“非标”局域网地址的客户的VPN就是这样的……这种情况很难有好的解,现在我们讨论另一种更普遍的情况,那就是使用的是Windows自带的VPN客户端。

可以在前面提到的控制面板的对应的VPN网络适配器里进行下图这样的设置,把“在远程网络上使用默认网关”这个选项去掉。

这样在VPN连接的时候它就基本上不会修改Windows的路由表,我是说基本上不会,实际上,它会默认加一条路由规则,我研究下来是这样的一条规则:

假如你连接的网络是192.168.20.0/24,那它就会加这么一条规则:

192.168.20.0/24 => VPN Adapter

因为Windows认为192开头的这个地址是个C类地址,掩码自然是24,这个时候如果服务主机就在192.168.20.0/24这个网段上,你可以直接访问,并且你访问别的网络照旧,不会受VPN的影响,很好!

但你要注意,很可能你VPN连接到的只是一个VPN LAN的虚拟网络,而真实的服务器的地址是在192.168.21.0/24这个网段,这时候你发现你访问不了服务器,因为对192.168.21.0/24这个地址段的访问不符合路由规则,不走VPN。怎么办?

方法一,自行增加一条路由规则:

192.168.21.0/24 => VPN Adapter

这次不算很麻烦,因为规则明确且只有一条,你可以把这条规则作为永久规则,即便VPN断开之后,它依旧还在,不受影响。但要自己设规则,还是有些麻烦,万一有些人就是不会呢?能不能更加简单点?

方法二,重新规划IP地址!

嗯!绕了半天,终于回来了!

以10.X.X.X作为局域网地址的情况

假如连接目标为10.186.2.0/24,而服务主机所在的网段是10.186.3.0/24,我们看看实际发生什么事。

由于10开头的地址被视作A类地址,它的子网掩码是8。Windows自动增加的路由规则是:

10.0.0.0/8 => VPN Adapter

你尝试访问10.186.3.0/24网段的时候,是符合这条路由规则的,因此你可以访问10.186.3.0/24网段的主机。

是不是很神奇?设置成192.168.X.X有问题,换成10.X.X.X就好了。

但是,这里面可能有问题!那就是前面一直没提到的地址冲突的问题。

假如你所在的局域网也是10.X.X.X这样的地址,那就糟糕了,你会发现你本地网络都没法访问了,原因就是符合了这条路由规则,走了VPN。

那使用192.168.X.X地址有没有可能出现冲突?当然有,比如你的本地网络是192.168.1.0/24,目标网络也是192.168.1.0/24,这非常有可能啊,网管们都喜欢这么设置,那么冲突是肯定的。

以172.X.X.X作为局域网地址的情况

我前面提到了,并不是172开头的地址都表示是局域网地址,只有172.16.X.X到172.31.X.X才是。大家注意,172是属于B类地址,它默认的掩码是16,这就很有趣了,请看下面这个图:

按照我的掩码设计,A、B、C、D是4个不同的网络,而根据B类地址默认的掩码,A和B是同一个网络,C和D是同一个网络。假如我是网管,我就用IP地址的第二个数字来区分厂区,厂区和厂区间不直连,而厂区内再用IP地址的第三个数字来区分不同的内网,这就是我前面所说的“灵活”。

现在你在图中的“你的位置”,即A网中,由于直接的物理连接,你是能直接访问B网的,现在你要用VPN拨到D网,想想会怎样?按前面说的,Windows会创建这么一条路由规则:

172.19.0.0/16 => VPN Adapter

OK不OK?非常OK,你能顺利访问D网,且访问本地的A网和B网都不受影响。你要注意的只是好好规划地址,避免直接的冲突就行,比如用172.21.14.0/24这种偏冷门的地址。

局域网地址为什么是192.168.X.X?为什么连上公司的VPN就上不了网?的更多相关文章

  1. 【科普】为什么ip地址通常以192.168开头?

    开源Linux 回复"读书",挑选书籍资料~ 我们做运维的,与ip地址接触最多,无论是运维的哪方面,都需要跟ip地址打交道,通常我们也会经常听到公网.内网?那什么是公网ip地址呢? ...

  2. 安装禅道提示:ERROR: 您访问的域名 192.168.110.128 没有对应的公司

    您访问的域名 192.168.110.128 没有对应的公司. in /usr/local/nginx/html/zentaopms/module/common/model.php on line 8 ...

  3. 编写shell脚本获取本机的网络地址。  比方:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是 192.168.100.1/255.255.255.

    ubuntu@ubuntu:~$ vim getlocalip.sh #!/bin/bash #ifconfig | grep inet | awk '$2' | awk -F : '$2' IP=` ...

  4. 为什么局域网IP是192.168开头?

    IPv4地址分为A.B.C.D.E五类,除去特殊作用的D.E两类,剩下的A.B.C三类地址是我们常见的IP地址段.A类地址的容量最大,可以容纳16777214个主机,B类地址可以容纳65534个主机, ...

  5. [转帖]IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

    IP地址.子网掩码.网络号.主机号.网络地址.主机地址以及ip段/数字-如192.168.0.1/24是什么意思? 2016年03月26日 23:38:50 JeanCheng 阅读数:105674  ...

  6. 工业控制或办公局域网中的192.168.X.X网段

    IPv4地址分为A.B.C.D.E五类,除去特殊作用的D.E两类,剩下的A.B.C三类地址是我们常见的IP地址段.A类地址的容量最大,可以容纳16777214个主机,B类地址可以容纳65534个主机, ...

  7. 启动dhcp出错:No subnet declaration for eth0 (192.168.0.1

    XUbuntu 8.04 i386.装了dhcp3-server.使用 sudo /etc/init.d/dhcp3-server start 出错:Apr 30 14:24:03 s dhcpd: ...

  8. amap -bq 192.168.5.9 80 3306

    amap -bq 192.168.5.9 80 3306 查看运行在指定端口上运行的服务

  9. mysql 使用ip地址连接不上;MySQL 可以用localhost 连接,但不能用IP连接的问题,局域网192.168.*.* 无法连接mysql

    原因: Mysql 默认是没有开启这个权限的(只允许使用 host:localhost,或者 host:127.0.0.1),如果想用 host:192.168.1.* (IP地址),来访问mysql ...

随机推荐

  1. NPOI插件生成导出word文档

    因为之前没有接触NPOI过这个插件,所以几乎都是自己一边百度摸索一边学习. 这个插件对于Excel的数据导入和导出,可以说是很方便了, 但是对于导出word文档,可以说是很少的,百度了很多....也不 ...

  2. 【JavaEE】之MyBatis查询缓存

    为了减轻数据压力,提高数据库的性能,我们往往会需要使用缓存.MyBatis为我们提供了一级缓存和二级缓存. (1)一级缓存是SqlSession级别的缓存,在操作数据库的时候需要创建一个SqlSess ...

  3. Linux监控平台介绍、zabbix监控介绍、安装zabbix、忘记Admin密码如何做

    7月6日任务 19.1 Linux监控平台介绍19.2 zabbix监控介绍19.3/19.4/19.5 安装zabbix19.6 忘记Admin密码如何做 19.1 Linux监控平台介绍 一般大公 ...

  4. 小白的springboot之路(四)、mybatis-generator自动生成mapper和model、dao

    0-.前言 在用mybatis开发项目中,数据库动辄上百张数据表,如果你一个一个去手动编写,比较耗费时间:还好,我们有mybatis-generator插件,只需简单几步就能自动生成mybatis的m ...

  5. JavaScript实现返回顶部效果

    仿淘宝回到顶部效果 需求:当滚动条到一定位置时侧边栏固定在某个位置,再往下滑动到某一位置时显示回到顶部按钮.点击按钮后页面会动态滑到顶部,速度由快到慢向上滑. 思路: 1.页面加载完毕才能执行js代码 ...

  6. ImSQL:海量数据,可信存储

    数据造假.数据不可信等问题的存在,给金融监管及风控等众多应用场景带来了严峻的挑战,也正成为阻碍数据大规模互联互通.共享共用的一大障碍.数据的真实可信问题长期影响着社会的各个领域,在更依赖数据的人工智能 ...

  7. 高德APP全链路源码依赖分析工程

    一.背景 高德 App 经过多年的发展,其代码量已达到数百万行级别,支撑了高德地图复杂的业务功能.但与此同时,随着团队的扩张和业务的复杂化,越来越碎片化的代码以及代码之间复杂的依赖关系带来诸多维护性问 ...

  8. HTML+Jquery实现多图片上传预览功能

    HTML:使用input的onchange事件,它一改变就触发事件 <p id="p3"> <input name="File" onchan ...

  9. pringBoot-MongoDB 索引冲突分析及解决【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  10. Python微信公众号教程基础篇——收发文本消息

    1. 概述: 在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果 ...