目的

在上一次我们聊了基础的网络配置已经可以正常上网了,但在日常使用中你可能还会遇到以下几个问题:

  1. 境外网游联机慢,甚至无法联机比如switch上的马8、喷射
  2. 部分网站无法访问。
  3. 我家没有公网IP,在有些联机游戏中评级过低甚至无法联机。

今天我们就来讲下网络的优化。解决这个问题。之所以会出现国外网站网络延迟过大是几个原因。你的运营商到服务器的路由绕远了,比如同样是日本东京的IP,我就遇到过有从北京联通直接出口然后进入东京的路径延迟可以控制在100ms左右,也遇到过从北京联通绕到上海出口,走中美海底隧道进入美东,再折回日本东京延迟肯定在200ms以上。

再有就是访问某些网站时不管从哪个出口走,直接99.999%丢包的,这个就已经不是慢的问题了。

还有就是DNS被篡改了,解析有些域名返回的IP是错误的。即使你使用境外的DNS,在返回IP时也会遇到错误的IP先回来情况。

解决方案

我们先讲原理,以上情况我们可以划分为三种情况分开进行解决。

  1. 访问慢,甚至无法访问,比如switch的联机主机就的IP解析出来后的IP为Google这家公司的机房,在大陆访问就会很慢甚至丢包。

    这个目前已知的解决方案都是建立隧道,让你的数据包可以正常出口,然后到隧道的尽头后进行解包再访问正常服务器。这里可以参考下GOOGL.INC的亚太机房主要在台湾彰化县和东京。咱们选隧道尽头的机器时尽量选这两个地点的。

  2. DNS解析错误:返回了错误的IP,也可以按上面的方案解决,把所有已知返回错误IP域名的UDP请求53口的进行一下封装,全部放到隧道出口后进行解析。

    这个就要依赖路由支持应用层解析,也就是第7层。只对指定的域名做这个操作,所以地所有域名都进行如上操作,域名解析回来的都会是境外IP,你的1000兆体验可能会降落到10兆网络的感觉。

  3. 没有公网IP的联机游戏无法拿到A类型:

    首先最低廉的解决方法就是给你的ISP打电话,要求ISP分配给你公网IP。如果投诉无果再考虑走隧道的方式,可以把隧道那头的DMZ指向你的路由,再从你的路由做端口映射到你的主机或游戏机。

今天我们先解决第一个问题也就是让访问谷歌机房的路由通过隧道进行通讯,保证通讯的正常。

在MikroTik上进行实操

ESP-tunnel_wiki.png

  1. 建立隧道,在主界面打开ppp,点击+号小图片就可以创建各种隧道协议,这里我们可以发现隧道协议封包后,会把原始包的头和数据体进行加密然后重新封包。这样会保证数据的安全有效。在这里我们科普一个小知识,大多隧道协议的加密使用的是AES方法也就是一种对称加密算法,如果靠CPU来完成每次加密和解密可能你的路由性能会大打折扣,尽量考虑支持硬件加密解密的设备。从图上我们能看出RB4011王者一般的存在,买他肯定没错。

WX20190611-155125.png

  1. 当隧道建立好后我们接下来就要考虑路由策略让哪些IP通过隧道走,一般有三种方案。
    1. 白名单:既只有在列表中的目标IP走隧道方式,比如我们查询下谷歌机房的所有IP,然后加入到地址表中。优点节省带宽,缺点机房变更IP段后我们无法动态调整可能会出现访问异常不好排查问题。
    2. 黑名单:在列表中只有国内的IP段,其他的IP全走隧道。优点基本不会出太大的问题,各个网站都可以正常进行访问。缺点浪费带宽严重。
    3. 动态:把你需要走隧道的域名放到检测列表中,当发现解析此域名回来的IP会自动加入到白名单中24小时过期。优点同白名单方式并且不用担心机房修改IP的问题。缺点所有域名第一次访问会慢,因为有一个解析域名并加入白名单的过程,并且会消耗CPU资源。
  2. 以上几个方案各有优缺点,我们也可以使用几个方案进行组合来达到最优状态。使用MikroTik就是不断的优化你的脚本并学习的过程。我们今天使用简单一些的第一种方案来举例。首先要做的就是收集IP地址列表。我们首先打开Hurricane Electric网站https://bgp.he.net/我们此次要收集的是谷歌公司的IP列表,就在搜索框内搜索Google。搜索结果一共有三种类型:AS开头接数字这是给边界路由使用的我们不用管,IPv6地址我们也不用管,第三种是我们需要的IPv4地址.今天我们不讲解正则表达式的写法,我直接放上一个整理好的可用的谷歌机房IP段脚本Google-ip-190501.rsc

  3. 将上一步整理好的脚本放到路由设备的Files下,并打开一个控制终端。在终端里输入 import file=Google-ip-190501.rsc 即可

  4. 现在我们在给这些数据包打标记,打开IP->Firewall,选择Mangle标签,点击添加。action=mark-routing chain=prerouting dst-address-list=google-ip new-routing-mark=to-google-cloud完成以上选项后我们所有去向谷歌机房的IP都给打上一个标记。
  5. 接下来我们修改打上标记的路由规则,打开IP->Route菜单,选择添加新路由规则:distance=1 gateway=l2tp-google routing-mark=to-google-cloud.这里要注意distance的序号一定要比默认路由小,让这条路由的优先级变高。
  6. 最后一步增加一个NAT。打开IP->Firewall->NAT点击添加。action=masquerade chain=srcnat dst-address-list=google-ip out-interface=l2tp-google【这条NAT规则不是一个性能最优写法,大家可以翻下上次的课程举一反三下】

按照以上的配置我们已经成功的让谷歌机房的目标IP通过了我们的隧道,现在打开你的游戏机试试已经可以正常联网了,随带的谷歌机房的其它服务也可以正常使用了。

目前的方案我们有效的让数据包通过了隧道,并且因为使用8.8.8.8【这个IP归谷歌公司所有】进行解析域名也让解析的结果正确了,但我们如果让所有的域名解析全部使用8.8.8.8可能DNS分配给我们的IP不是离我们最近的。下一次我们要有效的拦截一些解析结果,让部分域名去ISP商的DNS那里解析,部分域名去隧道另一头进行解析。