- 论坛徽章:
- 0
|
回复 #8 ssffzz1 的帖子
我的需求是这样的,我的系统是Android(基本没怎么再修改),运行在移动设备上。当接入移动公司内网时,移动会给分配一个10.x.x.x的IP地址,给出一个10.x.x.x+1的网关,并给出两个2xx.xx.xx.xx的DNS,这两个DNS在外网。这时系统使用自定义方法记录着两个DNS(使用nslookup则看到Server是0.0.0.0)。
当我的移动设备上的一些软件请求域名解析时,系统根据它记录的这两个DNS地址发送请求,但实际上根本发送不到,因为移动给的网关就是假的,或者至少不做响应。
这时,我使用Iptables在OUTPUT上截获所有对53端口的请求,并且DNAT到127.0.0.1:27961上。我在27961上则起了一个UDP监听,并成功收到DNS查询请求。
我通过一个自己的列表查找到域名对应的IP地址,并作一个应答包,通过27961端口发送出去(我试验了发送到以下两个目标地址:一个是本机在移动内网内的IP地址10.x.x.x,一个是127.0.0.1。接受端口就是对方、也就是本机软件发出请求时所用的那个端口)。
现在的情况是,发出请求的软件仍然报不能解析域名,我唯一能知道的是,那是个Java程序,报的错是Java的UnknowHost Excption。因为环境所限,我也没法使用其它工具分析具体的情况。那么我估计有两种可能性:
1. 我发出的响应包格式有问题。 如果是这个问题,我想知道的是,一般标准的域名解析客户端对包有什么要求?我发的包中填充了如下信息:
HEADER
opcode: QUERY, status: NOERROR, id: 25444
flags: qr aa ; qd: 1 an: 1 au: 0 ad: 0
QUESTIONS:
www.foobarfoobarhahahah.com., type = A, class = IN
ANSWERS:
www.foobarfoobarhahahah.com. 60 IN A 72.14.203.187
AUTHORITY RECORDS:
空
ADDITIONAL RECORDS:
空
总体格式应该错不了,但是是不是缺少什么内容我不敢确定,有对这方面比较熟的兄弟么?
2. 我怀疑是不是比如Java的网络库验证对方的IP地址,但是这是我瞎想的,一般来说会这么做么?
在这种怀疑下,我就用Iptables在POSTROUTING上做了SNAT,但是一旦我伪装成移动告诉我的那两个DNS地址+53端口号(如果我伪装成其它地址+53端口号,或者DNS地址加其它端口号,则全都没问题),我的响应发包程序就会报错,说没有权限(我查了一下说基本就是防火墙拒绝,而我的Iptables没有任何其它规则)。这就让我很挠头:Linux或者这个系统不允许我装成当前网络设置的DNS?
另外实际上我上面说了,我的响应发包程序是在27961端口发包的,而伪装是IpTables做的(不伪装就畅通无阻,当然客户端发起查询的软件还是不能正确解析,见上面说的)啊...,就算无声无息给我吞了,我都能接受:因为我的响应发包程序没有干任何反人类的事情嘛!!凭什么是我的这个程序内发包的函数调用返回错误、而且还是权限错误呢。
我希望大家帮忙的就是,谁知道这方面的信息,能够提供一下,比如我的包不合适,比如DNS解析时正经的查询方(比如Java的查询程序或者c的gethostbyname函数)会验证应答方是不是自己请求的那个IP,比如Linux对特殊端口有特殊的规定等等。哪怕是跟我解决具体问题没啥关系的,我也想知道知道,普及下知识 
但是如果是这个修改版的Linux自己的什么规定,我并不是说也得有人知道,我只是想知道在一般的Linux上,我这个流程一定能正常工作,我就心满意足了.... 因为当前条件所限,我自己没法测试。
[ 本帖最后由 ilei1e 于 2009-10-24 19:17 编辑 ] |
|