绕开万网防火墙

从今年7月开始,在被无奈的服务器网络问题郁闷了很久之后,终于让我找到真正的原因,确实在于防火墙的问题。我发现问题原因的过程如下:

公司有2台服务器在万网机房,而且在同一子网中,两台服务器上有同样的两套服务器端程序。我通过ab,对指定的URL发出10个并发总计1000个请求,两台服务器都在200个请求之后,就不能连接了。其中有一台是Windows服务器,我当时还开着远程桌面,ab刚打印出“Completed 200 requests”,远程桌面立刻变灰,随即右上角显示出断开图标,闪烁之后便告诉我链接被终止。另一台是Linux服务器,我开着Putty链接在上面,通过ab测试的时候,到200个请求之后,Putty便报警说链接断开。

至于万网要这样进行限制的原因还不得知,至少即便我打电话,他们不会去改正这个问题更不会承认他们有问题。那么如果我们有放在万网或者类似机房的服务器(比如叫A),又需要在另外的地方放一个反向代理服务器到这个服务器(比如叫B),那么怎么办才能解决这个问题?在这里我找到两种解决方案:

  1. 把A的服务器端移动到服务器B,让A做专门的数据库服务器,B通过长连接(或称持久链接,persistant connection)连接到A。当然如果服务器端应用使用了短链接也是没用的。现在的很多框架如Rails能很好地利用长连接。另外,Memcached的客户端链接一般也是长链接,
  2. 架设一个VPN,然后A,B都接入这个VPN中,并只使用VPN分配的地址进行交互,这个可以完全解决前面出现的问题。

两个方案都可以尝试,复杂程度相当。

就这个问题上,我得出的结论是,压力测试是必须的,如果以后公司再托管服务器,我会先利用工具从外部测试一下其是否满足要求。

2008-03-04更新:

经过长久的深思熟虑之后,我觉得如果服务器分布在不同机房,有必要使用数据加密来防止数据包被嗅探,VPN方案可以采用加密的方式,长链接的方式也可以配置使用ssl。MySQL的SSL配置请参考:http://dev.mysql.com/doc/refman/5.0/en/secure-connections.html

无奈的服务器网络问题

我在万网有台服务器机器A,我在电信某另外机房有台服务器为B,和另外一网通机房有台服务器C

B和C一直做反向代理连接到A,分别服务于电信和网通的用户

突然有一天早晨B和C都链接不到A了,但是还可以正常访问其他各个网站

同时A可以访问其他网站,但无法连接到B和C

而用自己的机器可以用远程桌面或者SSH正常访问A/B/C三台服务器

为解决这个问题,我用了在万网的另外一台服务器D,让B/C链接到D,这样就正常了

但第二天早晨,D到B/C之间的链接出现和A到B/C之间一样的问题,但切换回A又没有问题。

第三天早晨,又出现原来的问题,又要进行切换

于是我猜测是机房的防火墙问题,因为B/C到A/D的频繁链接太多,误认为是DoS攻击而屏蔽,但询问万网机房得到的回答是,他们没有阻止任何单个IP,真不知道是为啥了。