首页 > 其他, 分享 > 正向代理中non-http临时解决方法

正向代理中non-http临时解决方法

2013年5月24日     浏览数:2,941 发表评论 阅读评论

在使用正向代理中,都会要面临non-http这个问题。我们做的数据转发规则都只是针对TCP 80。并不能保证它一定会是HTTP协议的请求。现在有一些应用也使用TCP 80端口,但它们并不遵守HTTP协议。腾讯就有很多游戏是这样的,如QQ劲舞,在游戏商城结算的时候就会一直超时。
数据转发配置请参考我前面的文章:ATS正向代理数据转发规则配置

  • 为什么会出现这样的问题?

我们可以使用WireShark这样的抓包工具抓个包就明白了。(晚些补上抓包的图)。标准的HTTP请求在数据段是包含URL地址的。ATS通过对这个URL进行DNS解析来获得源服务器的目的IP。而non-http包的数据部分都是各应用自定义的协议,没有URL,也就是没有办法获得目的IP。这样的包就无法正常处理,所以有些应用就不正常了。
正常的HTTP包如下
http1

non-http数据包,wireshark能识别出来
QQ截图20130524211110
non-http数据包,数据段内容如下
QQ截图20130524211148

  • 临时解决方法

目前也没有找到完美的解决方法。但为了能断续测试,所以找了这么一个临时方案。我在网上有看到像海蜘蛛这样的软件路由软件在开启WEB缓存时,有一个例外地址的设置,如:web缓存例外IP。我现在就讲一下如何在我们自己搭建的Linux路由上设置例外。
我在上一篇文章中讲了DNAT规则的配置如下:

iptables -t nat -A PREROUTING -i eth0 ! -s 192.168.1.16 -p tcp –dport 80 -j DNAT –to 192.168.1.16:8080
iptables -t nat -A POSTROUTING -d 192.168.1.16 -p tcp –dport 8080 -j SNAT –to 192.168.1.1

我们只要稍加修改就可以实现例外了。利用IPSET组保存例外地址,将第一条规则修改成如下 :

iptables -t nat -A PREROUTING -i eth0 ! -s 192.168.1.16 -m set ! --set cache_exception dst -p tcp –dport 80 -j DNAT –to 192.168.1.16:8080

cache_exception就是例外IP组,可以将自己收集到的IP添加进IPSET组。

以上就实现了例外地址组。

在想这个问题的时候我想到了要在第一条规则中加入L7 HTTP的识别,但这样是不行的。在客户PC发送一条HTTP请求时,会发送三次握手,数据传输控制等一些数据包,这些包的数据部分长度为零,我们无法对这些包做识别。我们能识别的是真正开始发送HTTP请求数据部分的包,而这时客户PC已与ATS建立连接了,再想让它做例外就晚了。
但我还是用L7 识别对上面的规则改进了一下,让识别出一的non-http包的目的IP自动加入到例外组中去,这么做就是第一次请求可能会失败,但也得考虑一个应用会尝试多个IP的情况,可能会经历多次传输失败,但我试过了,对于腾讯的游戏它会自动重试几次,使用这种访法后腾讯游戏就正常了。我的规则如下:

ipset -q -N cache_exception iphash
iptables -t mangle -A PREROUTING -p tcp --dport 80 -m  layer7  --l7proto http -j RETURN #正常的HTTP包放过
iptables -t mangle -A PREROUTING  -p tcp --dport 80 -m  layer7  --l7proto nonNULL -j SET --add-set cache_exception dst

L7协议的识别我是这样写的,仅供参考

http
^(get|post|connect|delete|head|icp_query|options|purge|put|trace|push) /.* http/(0\.9|1\.0|1\.1)\x0d\x0a
nonNULL
.+

我说过这只是一个临时解决方案,也不是我想要的。我也是刚刚才开始研究ATS代码的,暂时还给不出其它好的方法,写出这个方法来给有需要的朋友应急。如果有错误请指正! list of websites .

Unter allen teilnehmern, die im mai 2017 an der www.hausarbeit-agentur.com/masterarbeit/ befragung teilnehmen, verlose ich 3 amazon-gutscheine im wert von jeweils 50 euro
分类: 其他, 分享 标签:
  1. 纸鸢
    2013年5月24日17:46 | #1

    尘分享的正向代理缓存内容很不错啊。。。学习了~

  2. alaxe
    2013年5月25日09:07 | #2

    写的非常棒,发人深思。。。。

  3. cyb322
    2013年5月26日01:50 | #3

    给用ATS上正向缓存的朋友一个解决方案。虽然是临时的,也非常好!希望ATS后续版本中能解决这个问题

  4. ash
    2013年12月6日12:49 | #4

    这个方案用的是l7filter吧,本身的识别率可能就不是太好,还有性能问题如何解决?!

  1. 本文目前尚无任何 trackbacks 和 pingbacks.