Chinaunix

标题: 谁了解linux的sip alg模块? [打印本页]

作者: piginthetree    时间: 2009-06-10 12:00
标题: 谁了解linux的sip alg模块?
最近在做一个项目 要实现sip穿透nat 没有头绪 看了一下 linux有对这个的实现 就是sip alg 但是网上找不到相关资料 谁能谈谈
作者: platinum    时间: 2009-06-10 12:00
原帖由 piginthetree 于 2009-6-10 12:00 发表
最近在做一个项目 要实现sip穿透nat 没有头绪 看了一下 linux有对这个的实现 就是sip alg 但是网上找不到相关资料 谁能谈谈

看 nf_conntrack_sip.c 和 nf_nat_sip.c 以及 RFC-3261 就是对你最大的帮助
作者: jiangzj123    时间: 2009-06-10 13:24
关注,我们曾经做路由器的时候也碰到过这种问题,不过最后是我老大解的,惭愧,我去svn看看能不能给你点提示。PS,我们用的linux2.6.21
作者: piginthetree    时间: 2009-06-10 13:25
原帖由 jiangzj123 于 2009-6-10 13:24 发表
关注,我们曾经做路由器的时候也碰到过这种问题,不过最后是我老大解的,惭愧,我去svn看看能不能给你点提示。PS,我们用的linux2.6.21

哇噻 太好了 等你的好消息
作者: Godbach    时间: 2009-06-10 13:25
SIP穿透NAT是比较麻烦。
作者: Godbach    时间: 2009-06-10 13:26
其实代码就是最好的资料。顺便看一下内核文档中有没有介绍。没有的话,网上搜一下SIP的大致框架介绍,然后对照着啃代码吧。
作者: piginthetree    时间: 2009-06-10 13:29
原帖由 Godbach 于 2009-6-10 13:25 发表
SIP穿透NAT是比较麻烦。

正在看代码呢 但是刚接触linux内核没多久 有点吃力 所以想问大家讨教下
作者: Godbach    时间: 2009-06-10 13:33
仔细的看看SIP的RFC啊,RFC3261。这个应该是介绍SIP是怎么实现的。然后对比Linux的内核代码看就可以了。
作者: Godbach    时间: 2009-06-10 13:34
SIP协议解析与实现:
http://network.51cto.com/art/200701/39084.htm
作者: piginthetree    时间: 2009-06-10 13:37
原帖由 Godbach 于 2009-6-10 13:33 发表
仔细的看看SIP的RFC啊,RFC3261。这个应该是介绍SIP是怎么实现的。然后对比Linux的内核代码看就可以了。

谢谢斑竹。
作者: jiangzj123    时间: 2009-06-10 13:41
对了,你都没有说你遇到的问题,详细描述一下,看跟我们遇到的一样不,当时我们做sip还引起了kernel panic
作者: Godbach    时间: 2009-06-10 13:45
因为还涉及到修改报文吧,报文处理不好的话,很容易引起panic,
作者: piginthetree    时间: 2009-06-10 14:26
问题是这样的 想使用linux做nat网关 通过穿越nat让内网的机器能够使用基于sip协议的网络电话 想在nat上加一个alg能够实现这个需求 内核是2.6.18

[ 本帖最后由 piginthetree 于 2009-6-10 14:27 编辑 ]
作者: Godbach    时间: 2009-06-10 14:57
原帖由 piginthetree 于 2009-6-10 14:26 发表
问题是这样的 想使用linux做nat网关 通过穿越nat让内网的机器能够使用基于sip协议的网络电话 想在nat上加一个alg能够实现这个需求 内核是2.6.18


Google上多搜一些SIP相关的关键字,有不少文章的。
作者: Godbach    时间: 2009-06-10 16:36
SIP消息之逐项讲解:
http://www.cnpaf.net/forum/viewt ... &extra=page%3D1
作者: Godbach    时间: 2009-06-10 16:37
SIP协议栈的设计与实现:
http://www.cnpaf.net/forum/viewt ... &extra=page%3D1

不过好像需要注册一下。
作者: jiangzj123    时间: 2009-06-10 16:46
呵呵,你这个有现成的,弄个路由器就有这个SIP ALG功能
作者: piginthetree    时间: 2009-06-10 18:04
原帖由 jiangzj123 于 2009-6-10 16:46 发表
呵呵,你这个有现成的,弄个路由器就有这个SIP ALG功能

我也想要现成的撒,可惜人家的路由器又不提供给咱源代码啊
作者: emmoblin    时间: 2009-06-11 00:29
我要问一下,什么叫sip穿透nat?
难道做nat的情况小sip不能使用吗?
作者: piginthetree    时间: 2009-06-11 09:18
原帖由 emmoblin 于 2009-6-11 00:29 发表
我要问一下,什么叫sip穿透nat?
难道做nat的情况小sip不能使用吗?

我的理解是这样的,像sip这样的协议,它的连接信息包括ip 端口等是包括在应用层的报文里面,而nat只能修改网络层的包头,无法修改应用层的这部分内容,所以当内网终端与外网终端发生sip会话的时候就会因为读取到的连接信息不对而导致无法会话,所以需要nat穿越

[ 本帖最后由 piginthetree 于 2009-6-11 10:18 编辑 ]
作者: lyl19    时间: 2009-06-11 22:56
有开源的软件,拿过来修改下就可以了。
作者: kouu    时间: 2009-06-12 16:31
标题: 回复 #1 piginthetree 的帖子
按我的理解,sip alg就是SIP协议的应用层网关。既然是应用层网关,应该不会是在内核里面实现的,而是一个应用程序(顶多是一个内核模块)。

很多路由器里面都有sip alg功能,它的作用是把内网用户的SIP报文中携带的内网地址改成路由器的外网地址,然后转发出去。这是为了解决一个矛盾:内网用户不知道自己的外网地址,只能填内网地址;外网用户收到SIP报文后,得到对方的内网地址,但是却无法访问。

除sip alg外,还有一些东西可以解决上面的矛盾。

stun:很多sip uac都有stun功能,在构造SIP报文之前,先通过stun,得到自己的外网地址,然后填入SIP报文;

对端的兼容:对端的SIP报文接收者可能会忽略SIP(应用层)报文中的IP地址信息,而使用IP层/传输层中的地址信息。asterisk就是这么做的。
作者: platinum    时间: 2009-06-12 17:49
内核不是自带 sip helper 吗?
作者: kouu    时间: 2009-06-12 23:03
标题: 回复 #22 platinum 的帖子
啊~内核里面好像还真有这东西…… 长见识了~
作者: yanming_xiao    时间: 2009-06-14 05:22
标题: 回复 #1 piginthetree 的帖子
有那么复杂吗?觉得问题的关键是学会查找。
google一下“sip proxy"即可。
作者: yanming_xiao    时间: 2009-06-14 05:27
标题: 回复 #1 piginthetree 的帖子
随便一查就找到一个:
The partysip SIP proxy server
http://www.nongnu.org/partysip/partysip.html#natsupport
作者: platinum    时间: 2009-06-14 07:13
原帖由 emmoblin 于 2009-6-11 00:29 发表
我要问一下,什么叫sip穿透nat?
难道做nat的情况小sip不能使用吗?

与 FTP 在被动模式下传输一个道理
作者: piginthetree    时间: 2009-06-15 10:36
谢谢大家了 小弟正在研究sip conntrack/nat helper




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2