现象

网站出现服务异常的问题,具体表现:

1、访问80端口的HTTP请求,页面被拦截篡改了,都转到127.0.0.1
2、其它端口的服务都正常

排查

1、服务端启动测试用程序

# python mini_websrv.py (bind 80)
import tornado.ioloop
import tornado.web
import tornado.autoreload

class MainHandler(tornado.web.RequestHandler):
  def head(self, *args, **kwargs):
    msg = "HEAD OK, %s" % self.request.remote_ip
    print msg
    self.write(msg)

  def get(self, *args, **kwargs):
    msg = "GET OK, %s" % self.request.remote_ip
    print msg
    self.write(msg)

  def post(self, *args, **kwargs):
    msg = "POST OK, %s" % self.request.remote_ip
    print msg
    self.write(msg)

application = tornado.web.Application([
  (r"/", MainHandler),
])

if __name__ == "__main__":
  application.listen(80)
  loop = tornado.ioloop.IOLoop.instance()
  tornado.autoreload.start()
  loop.start()

2、curl server_ip
显示异常:

<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://127.0.0.1">here</a>.</p>

服务端有时会提示:

WARNING:root:Read error on 10: [Errno 104] Connection reset by peer
WARNING:root:Read error on 11: [Errno 104] Connection reset by peer

3、抓包分析
POST 抓包正常

1   0.000000    192.168.1.33    server_ip   TCP 74  40597 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSval=53302394 TSecr=0 WS=128
2   0.008753    server_ip   192.168.1.33    TCP 74  http > 40597 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=44399665 TSecr=53302394 WS=128
3   0.008783    192.168.1.33    server_ip   TCP 66  40597 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSval=53302403 TSecr=44399665
4   0.008903    192.168.1.33    server_ip   HTTP    309 POST / HTTP/1.1 (application/x-www-form-urlencoded)
5   0.017803    server_ip   192.168.1.33    TCP 66  http > 40597 [ACK] Seq=1 Ack=244 Win=6912 Len=0 TSval=44399674 TSecr=53302403
6   0.018834    server_ip   192.168.1.33    HTTP    196 HTTP/1.1 200 OK (text/html)

GET 抓包异常

26  110.708168  192.168.1.33    server_ip   TCP 74  55311 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 TSval=53413102 TSecr=0 WS=128
29  110.718900  server_ip   192.168.1.33    TCP 74  http > 55311 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 SACK_PERM=1 TSval=44510279 TSecr=53413102 WS=128
30  110.718934  192.168.1.33    server_ip   TCP 66  55311 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSval=53413113 TSecr=44510279
31  110.718988  192.168.1.33    server_ip   HTTP    236 GET / HTTP/1.1
32  110.724590  server_ip   192.168.1.33    HTTP    418 HTTP/1.1 301 Moved Permanently (text/html)

a、TCP 握手 [SYN] [SYN, ACK] [ACK] 正常,服务端开启tcpdump抓包,显示接入正常
b、客户端发起GET请求,客户端发送数据正常,服务端没有收到
c、从客户端抓包看到,31和32之间缺少了服务端的应答[ACK]
正常的一次请求,包是这样的:

[SYN] [SYN, ACK] [ACK]
GET / HTTP/1.1
[ACK]
HTTP/1.1 200 OK (text/html)
[ACK] [FIN, ACK] [FIN, ACK] [ACK]

解决

排查各种想到的可能问题:
1、联系IDC,排除机房问题
2、检测ARP;其实吧,arp攻击,无法达到这种效果
3、远程重装了系统

最后明白了!是的,我忘了我们有个大型防火墙,她贯穿整个国内互联网。 只是,我不清楚为啥拦截我的服务器?域名已经备案,网站还未完成,首页还是nginx的默认首页,违规内容更是无从谈起

几天后,服务器又正常了。 轻轻的她走了,正如她轻轻的来,只剩下哥在那郁闷,或许,她只是提醒一下辛苦的站长,她正在无微不至的关怀着你 只是,我希望她在篡改的网页中能留下关怀我的原因,以及我如何去感谢她的联系方式

我真是爱死她了,这几天我学到不少Linux、网络、运维方面的知识


Comments