免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: piaobo79
打印 上一主题 下一主题

请问在如何在NF_LOCAL_IN获得TCPv4包的目标(本机)端口? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-07-02 16:42 |只看该作者
楼主是想这么做吗?
tcph = tcp_hdr(sb);
            printk("It's a TCP PACKET.Src:%u dst:%u\n",ntohs(tcph->source),ntohs(tcph->dest));

论坛徽章:
0
12 [报告]
发表于 2008-07-02 17:22 |只看该作者
原帖由 dreamice 于 2008-7-2 14:24 发表
远程地址+端口,作为这一条连接来说,它是不会改变的,如果改变,那这条连接也就断了,需要重新建立。即使你说的假如可以使用本地端口作为判断,那远程地址或者端口变了,你这条连接也得重新建立。


我说的移动IP就是允许远程IP地址变化的同时保证原有的连接不会中断的, 具体的实现其实很简单,就是在本机进行NAT, 把出入的数据包的IP头改成连接建立时的地址就行了;所以远程地址+端口不足以确定一个节点的身份。

论坛徽章:
0
13 [报告]
发表于 2008-07-02 17:23 |只看该作者
原帖由 cablink 于 2008-7-2 16:42 发表
楼主是想这么做吗?
tcph = tcp_hdr(sb);
            printk("It's a TCP PACKET.Src:%u dst:%u\n",ntohs(tcph->source),ntohs(tcph->dest));


这个方法试过了,可是拿到的本地端口是监听端口,不同的连接拿到的都是一样的。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
14 [报告]
发表于 2008-07-02 17:45 |只看该作者
原帖由 piaobo79 于 2008-7-2 17:22 发表


我说的移动IP就是允许远程IP地址变化的同时保证原有的连接不会中断的, 具体的实现其实很简单,就是在本机进行NAT, 把出入的数据包的IP头改成连接建立时的地址就行了;所以远程地址+端口不足以确定一个节点的 ...



我现在比较疑惑的是,当远程ip地址变化后,重新连接后的第一个数据报,你怎么知道就要nat?不知道楼主是不是本身就想解决这个问题。

论坛徽章:
0
15 [报告]
发表于 2008-07-02 17:58 |只看该作者

回复 #13 piaobo79 的帖子

在我这边试好像拿到的端口都不同。我只用ssh试了一下,没试太多的

论坛徽章:
0
16 [报告]
发表于 2008-07-02 21:10 |只看该作者
说实话,我没有太懂LZ在说什么
我猜是不是这样:
LZ理解一个socket在fork之后(2个fd对应一个socket)就认为成了两个。然后试图怎么区分它们(who fork who)

不过这么猜我自己都很怀疑LZ是这样想的



“请问在如何在NF_LOCAL_IN获得TCPv4包的目标(本机)端口?因为本机的TCP服务是监听并fork新的进程的,所以在netfilter里面拿到的只是监听端口而不是真正的端口。”

我真的很不理解为什么这么难表达,反正我是没太看懂,估计大家一样
何为真正的端口,端口都可以修改的,不是很懂,但是我想从conntrack的角度,一个连接由一个tuple决定,对于TCP,就是<sip,sport,dip,dport>
对于LZ一楼的问号之前的问题,目标端口是什么呢?如果不是dport(已经在data中了),那么难道是说tuple.dport?如果这样,我知道的方法是在skb中的skb->nfct 可以得到


LZ还是解释一下"真正的端口"是怎么定义的,端口可能被改,最典型的有监听端口和数据包最原始的dport

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2008-07-03 09:05 |只看该作者
原帖由 flw2 于 2008-7-2 21:10 发表
说实话,我没有太懂LZ在说什么
我猜是不是这样:
LZ理解一个socket在fork之后(2个fd对应一个socket)就认为成了两个。然后试图怎么区分它们(who fork who)

不过这么猜我自己都很怀疑LZ是这样想的



“ ...



flw2说得很有道理。监听端口和dport应该是相同的吧?这个端口大多数时候是建立连接前就协商好的,所以我建议,LZ还是把思维理一下,通过ssh看到的不同的端口,这个有点让人不太理解。

论坛徽章:
0
18 [报告]
发表于 2008-07-03 12:02 |只看该作者
看来是我说的不清楚。我是用VLC作为视频流播放的服务端,使用的HTTP作为流媒体传输协议。试验平台中有2台客户机通过无线网络连接到这台服务器来进行视频点播。项目的目的是要求客户机移动到另外一个无线网络(不同的essid)的时候,视频不会中断。我们采用的是和移动IP(mobile IP)接近的方案叫MSIP,有兴趣的可以查一下。

具体的实现就是在内核中进行本地NAT,对连接建立时的地址和移动后获得的新地址进行转换,从而达到无缝移动的目的。我是使用本地端通信端口对数据包进行归类,看它是属于哪一个连接的。目前普通的单一TCP和UDP连接都是可以用了。新旧IP地址之间的映射是通过SIP来通知的。

可是如果是TCP服务器使用fork()(VLC就是这样的),不同连接使用的本地端口是一样的。所以就无法对数据包进行正确归类了。还有,开始的时候我说的”真正的端口“其实是不正确的,原来我以为 fork()以后就会使用一个新的服务器端端口,这是不对的。另外我没有使用SSH,提到SSH的是15楼。

[ 本帖最后由 piaobo79 于 2008-7-3 12:04 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
19 [报告]
发表于 2008-07-03 13:06 |只看该作者
原帖由 piaobo79 于 2008-7-3 12:02 发表
看来是我说的不清楚。我是用VLC作为视频流播放的服务端,使用的HTTP作为流媒体传输协议。试验平台中有2台客户机通过无线网络连接到这台服务器来进行视频点播。项目的目的是要求客户机移动到另外一个无线网络(不 ...


大致理解了,实际上SIP的NAT帮你完成了这个无缝连接。但是,我似乎没太了解你的具体需求。要完成一个什么功能?达到一个什么目的?你想通过什么方案来实现?

论坛徽章:
0
20 [报告]
发表于 2008-07-03 14:18 |只看该作者
原帖由 dreamice 于 2008-7-3 13:06 发表


大致理解了,实际上SIP的NAT帮你完成了这个无缝连接。但是,我似乎没太了解你的具体需求。要完成一个什么功能?达到一个什么目的?你想通过什么方案来实现?


不是SIP的NAT,我只是使用SIP消息来进行地址的更新而已,和SIP本身的NAT机制无关。

我说了是在服务器和客户端的内核里实现NAT,也就是地址映射。现在的问题是为了正确的映射原有的IP地址,我需要对收到的数据包进行分析来找到相对应的新地址。本来的设计是使用数据接收端的本地端口,也就是数据包中的目标端口,进行索引和查表,这个设计本身对于没有使用fork的连接是可行的,这在试验平台上得到了验证。可是在对VLC进行测试的时候,发现VLC使用fork来服务客户端,对于每一个客户端连接,服务端的端口都是一样的,也就是监听端口。这样一来所有的客户端连接都错误的映射到了同一个地址。

我的目的是找到一个可行的方法来对fork出来每一个连接进行分析,从而找到对应的新ip地址。最好是能在NETFILTER里面实现,因为不想对内核进行太多修改。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP