樱町服务器的网络结构

在某日电信彻底把 80 端口封杀,并且在投诉工信部无果的情况下,樱町服务器不得不使用非常奇怪的网络结构来保证能够继续向外界提供服务了。

其实在把 80 端口封杀之前,电信还把上行速度从原来的 2Mbps 限制到了 0.5Mbps,虽然我也投诉到工信部了,但是工信部没有发挥奇效。在这里不得不吐槽一下,工信部似乎已经不是以前那个工信部了,电信申诉的拔群效果似乎已经没有了。

现在用户访问樱町的时候,会觉得樱町似乎换到了国外服务器上,实际上樱町服务器还是和以前一样,运行在一台连接着电信宽带的家用电脑上。之所以在电信彻底封锁 80 端口之后还是不把樱町转移到国外服务器的原因有两个。第一个原因,樱町上面的数据很多,应该已经有超过 100G 的数据了,廉价的 VPS 没办法提供这么多的空间。第二,如果把数据放到远程服务器的话,备份数据就会变得比较麻烦,数据还是放在本地更安全,备份也方便(虽然我现在没有部署局域网内备份服务,还是通过互联网远程备份)。第三个原因,也是最重要的一个原因是,由于历史遗留问题,樱町论坛现在依旧运行着 ASP,也就是说,如果要转移国外服务器,那就必须使用 Windows 主机,而托微软的福,Windows 主机的价格是很贵的。

其实现在樱町网络的情况很复杂,这也是为什么要专门写一篇文章来进行描述的原因。下面就从最初的情况,也就是樱町还是部署在自家服务器,可以直接访问的时候说起。

最初,樱町的网络情况是这样子的:

图上的 YTS 就是樱町服务器。电信限制了上行速度之后,我还没有做什么动作,不过后来调整网络结构的时候,顺便把上行速度有限这个问题也一并解决了。

接着电信封掉了 80 端口,这下子用户就无法直接访问樱町服务器了。思来想去有没有什么办法可以让用户无痛地继续直接访问樱町服务器。虽然说 443 端口还是开放的,但是要强制把所有的链接改成 HTTPS 不太现实,而且搜索引擎里面很多收录结果都还是 HTTP 的。另外,说不定电信某天就又手贱顺便把 443 端口给封掉,所以改而强制使用 HTTPS 是不行的。

这样的话就完全没有办法了啊,既然不能使用 HTTPS,那更不可能在网址的域名后面加上一个难看的类似“:8080”这种难看的东西了。看来想要让用户继续直接访问 YTS 是不行的了。

于是我决定用反向代理,使用一台国外的 VPS 来进行代理,用户可以直接访问 VPS 的 80 端口,然后 VPS 再去访问樱町服务器的非标准端口。这样,对用户来说,网址完全没有变化,也不会感到有任何的异常。

于是樱町服务器的网络结构就变成了这个样子:

虽然用户可以无痛地继续访问樱町服务器了,但是对我来说还是有点痛,因为我要去修改服务器的端口,而动网的程序又是如此糟糕,如果修改服务器端口的话,某些页面上生成的链接地址会自动带上端口号,所以如果要改端口号的话,就要把糟糕的动网程序一起改掉。这完全是坑爹啊,我才不干。

由于糟糕的动网程序,不能简单地使用非标准端口,还是只能直接访问 80 端口。不过我们不需要用户去访问 80 端口,只要让反向代理服务器,也就让 VPS 能够访问到 80 端口就可以了。

这样子很简单,使用 VPN 就可以解决了。在樱町服务器和 VPS 上面都部署 VPN 服务,然后进行反向代理的时候,使用 VPN 分配的 IP 地址,这样反向代理服务器就可以直接访问樱町服务器的 80 端口了。

使用 VPN 还有多种好处,它们是:
1. 反向代理服务器和樱町服务器之间的通讯被加密了,没人能够听到它们两台服务器之间说了什么;
2. 工信部网站备案管理中心不知道某台连接着家用电信线路的个人电脑上还对外提供着网页服务。你说我网站没有备案要查封服务器?我的电脑上可没有任何提供 HTTP 服务哦。
3. 加重国内出口带宽的负担。让你丫的不让用自家服务器开网站,我给你把流量转到国外去,而且一来一回还是双倍的流量,国际流量费用可不便宜,嗯。

于是樱町的网络结构变成了下面的样子:

其实到现在为止,樱町服务器的新的网络结构已经完成了。事实上,我也放着这样的网络结构跑了一段时间,期间没有发现有什么大的问题,这样的网络结构已经足够了。

但实际情况没这么简单,由于我使用的是廉价的 VPS,稳定性不怎么好,在线率看上去也就 99% 的样子。这可不行啊,在线率要是比樱町服务器还低的话那算什么。好吧其实我手头上还有另外两个 VPS,干脆把这两个 VPS 也利用起来吧。这样除非三台 VPS 都挂掉了,否则网站都能保持正常在线(樱町服务器自己挂掉的情况不考虑 -_-b)。

三台 VPS 都作为樱町服务器的反向代理,至于用户访问的时候是通过哪个 VPS 进行访问,就由 DNS 轮询来决定。做了 DNS 轮询之后,还能让网站变成看上去很厉害的样子。nslookup 一下,哇,这网站有三台服务器呢!

于是樱町的网络结构就变成了这个样子:

这样一来,除非樱町服务器自己挂掉了,樱町才有可能不能访问。毕竟三台 VPS 服务器同时挂掉的可能性太低太低了。如果每台 VPS 的平均离线时间是 1% 的话,三台 VPS 同时离线的时间就是 \(1\%\times1\%\times1\%=\frac{1}{1000000}\),也就是在线时间达到了 99.9999%。此乃骨干机房的服务器在线水平啊。

虽然现在用户访问樱町服务器的时候要出国转一圈,但实际上对非电信用户来说,访问樱町服务器的速度反而比以前更快。天朝网络的互通互联一直是个大问题,以前非电信的用户直接去访问一个挂在家用电信宽带的服务器,速度不可能快。事实上,根据我长期的观察,有一部分非电信用户根本没法连接到樱町服务器。这其中的原因,估计只有那帮负责运营商网络架设的人才知道是怎么回事了。现在,非电信用户不需要直接访问电信的个人宽带了,他们只需要去访问国际网络即可。而樱町服务器使用的电信连接到国外是非常快的,至少不会比非电信线路连接到国外慢。于是,非电信用户现在访问樱町服务器的时候,可以享受到基本上等于访问国外网站的速度了。那些以前连樱町服务器都无法连接的用户,现在也可以正常地访问樱町服务器了。唯一的问题是,似乎到目前为止,教育网用户还是无法直接访问国外网络,额……这个就不考虑了。

其实还有一个问题。前面说过,电信把上行速度给限制了,这样用户在访问樱町的时候,特别是在下载图片的时候,速度慢得要死。0.5Mbps 的带宽非给一大堆用户已经我自己的程序去使用,能快才怪。

但是,既然现在已经有反向代理服务器了,不如就顺便把静态文件给缓存起来。据我的测试,我的三台 VPS 连接到国内的速度都能达到 2Mbps 以上,三台服务器加起来就有 6Mbps 的速度。nginx 作为反向代理的功能是很强大的,可以根据请求文件的扩展名将静态文件缓存到 VPS 上,这样用户在请求静态文件的时候,就不需要再通过 0.5Mbps 的小水管去樱町服务器上下载了,可以直接在 VPS 上以 2Mbps 的速度迅速地将文件下载回来。

在 nginx 上配置了静态文件缓存之后,运行了一段时间,我再去访问樱町论坛上一个图片比较多的网页,果然速度和以前的 0.5Mbps 的小水管大不相同啊。唯一需要等待一下的,只有动态页面内容了,不过动态页面内容基本上都不大,而且得力于 gzip 的帮助,那些动态页面内容即使是通过 0.5Mbps 的小水管进行下载速度也不算太慢。

到了现在这个样子,樱町的网络可以说已经是非常完美了。然后,在现在的天朝,完美的网络是不存在的。这个网络结构部署完成之后跑了一段时间,表现非常好,确实是只有在樱町服务器自己挂掉的情况下才不能访问樱町。不过好景不长,党的十八大开始了,我使用的 VPN 软件 OpenVPN 遭到史无前例的大规模封杀,虽然我的 OpenVPN 不是用来翻墙的,但是也惨遭杀害。这次 OpenVPN 被封杀得很惨,目测是根据 OpenVPN 进行密钥协商握手时的特征,定端口地进行封杀。使用随机端口也没法破,一个端口几乎是使用了几个小时之后就被封掉了。

这简直是坑爹啊!我一个不抽烟不喝酒的社会主义好公民,用 OpenVPN 来做点人畜无害的事情都被误伤,没天理了啊。

好吧抱怨是没有用的,不过既然惹到了我,我就只好发飙了。

SSH 不是还没有封嘛,虽然针对 SSH 的干扰似乎已经部署在 GFW 上了,但是就目前来看干扰效果不大,而且鬼都不信 GFW 敢完全封锁 SSH,一大堆外贸网站以及跨国公司的服务器都要使用 SSH 以及 SCP 连接到国外的服务器呢。既如此,我就暂时用 SSH 来再做一条通道。

SSH 虽然支持创建 tun 设备来将网络流量转发到 SSH 通道上,但是这个方法部署起来有点麻烦,我还是用最简单的端口转发就可以了。

在樱町服务器上,使用 SSH 连接到 VPS,并在 VPS 打开 2280 端口进行监听。然后,配置 nginx,让 nginx 去访问 localhost:2280。当用户要访问樱町的时候,nginx 就会通过本地的 2280 端口,经由 SSH 提供的安全通道,把请求发送到樱町服务器上,最后由樱町服务器上的 SSH 程序去访问樱町服务器的 80 端口。说起来似乎很复杂的样子,但做起来其实很容易,就是 SSH 的端口映射功能而已。这个方法唯一的不足是,因为不能在 HTTP 头里面设置用户来源 IP,所以网站访问日志里面所有的用户都是来自 127.0.0.1 的。

在 nginx 上还要进行一些设置,虽然 OpenVPN 现在已经完全阵亡了,但是 OpenVPN 毕竟比 SSH 好,所以我还是保留着 OpenVPN 的设置。事实上,我在写一个小东西,用来混淆 OpenVPN 的流量,骗过 GFW,这样就能继续使用 OpenVPN 了,网站的访问日志里面也不会出现一大片的 127.0.0.1 了。nginx 上的 upstream 功能非常实用,可以指定多个目标服务器,当其中的某个服务器不可用时,则自动使用其他可用的服务器。我现在的配置就是,OpenVPN 通道作为首选服务器,SSH 通道作为备用服务器。OpenVPN 现在处于不可用状态,nginx 会自动将 OpenVPN 通道标记为不可用,而去使用 SSH 通道。日后当 OpenVPN 服务恢复后,nginx 就会重新使用 OpenVPN 通道去访问樱町服务器。

最后,樱町的网络结构就变成了这个样子:

这图看上去很复杂,好吧它确实很复杂,因为实际情况其实比这个图还要复杂。其实樱町服务器上不仅仅有 HTTP 服务,还有 HTTPS 服务。因为把域名全部解析到 VPS 上了,所以即使樱町服务器上的 443 端口没有被封,也不能直接访问樱町的 443 端口。HTTPS 也要通过 nginx 进行代理。所以,其实 SSH 通道有两条,一条是 80 端口的通道,一条是 443 端口的通道。OpenVPN 倒还好,只要一条通道就通吃所有端口了。

这网络真的很复杂,我现在都已经不记得这三条 VPN 通道的子网地址分别是多少了。

本文发表于 技术向,并添加了 , , , , , 标记。保存永久链接到书签。

发表评论

电子邮件地址不会被公开。