免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6131 | 回复: 6
打印 上一主题 下一主题

[nat和rtp]遇到个问题,udp包可以nat和forward,但是rtp却不行,求指导。 [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-11 16:01 |只看该作者 |倒序浏览
这次做了个内外网转发rtp包的程序。过程和组网环境如下:

话机1   ------------------------    服务器0 --------------------  dsp  ----------------------- 服务器0 --------------------------话机2

使用服务器0隔离dsp和外部网络,话机1和话机2都处在外部网络。
话机1:  10.0.1.60
话机2:  10.0.1.50

服务器0:对外网口 10.0.1.10
                对内网口  192.100.1.1

dsp:      192.100.1.100

服务器上的NAT配置如下:
root@p2041rdb:~# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10000 to:10.0.1.50:11798
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10000 to:192.100.1.100:10000
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10001 to:10.0.1.50:11799
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10001 to:192.100.1.100:10001
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10001 to:10.0.1.60:10060
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10001 to:192.100.1.100:10002
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10002 to:10.0.1.60:10061
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10002 to:192.100.1.100:10003

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10001 to:10.0.1.10:10001
SNAT       udp  --  10.0.1.50            anywhere             udp spt:11798 to:192.100.1.1:10000
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10000 to:10.0.1.10:10001
SNAT       udp  --  10.0.1.50            anywhere             udp spt:11799 to:192.100.1.1:10001
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10003 to:10.0.1.10:10002
SNAT       udp  --  10.0.1.60            anywhere             udp spt:10060 to:192.100.1.1:10001
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10002 to:10.0.1.10:10002
SNAT       udp  --  10.0.1.60            anywhere             udp spt:10061 to:192.100.1.1:10002

话机2发出RTP包后,服务器0回复了一个ICMP,提示端口不可达。(上述奇数端口为RTCP,NAT配置还有些问题,有重复,但是偶数是正确的,应该)

但是,在上述条件不变的情况下,拆下话机2,使用PC机,并PC机的IP改为话机2的IP,即10.0.1.50
在PC机上运行自己写的程序,向服务器0发出UDP包(UDP包头信息和话机2发出的RTP包一致,主要是IP和port),这个UDP包的数据是0x0a0b,这种情况下,服务器0能将该UDP包NAT和forward到DSP去。

为什么这个NAT,UDP包可以,而RTP包不可以???
抓包见附件。

包流程描述:
话机2发出的RTP包或者PC机发出的UDP包src <ip 10.0.1.50 port 11794> dst<ip 10.0.1.10 port 10000>,
经过NAT和forward后,理论上,包头信息作如下改变:
dst经DNAT处理后,变为192.100.1.100:10000
src经SNAT处理后,变为192.100.1.1:10000

但是,从实际测试情况来看,如果是话机2发出的RTP包,是没有抓到从服务器0出去到DSP的包;如果是PC机发出的UDP包(包内容为0a0b0a0b......)成功NAT+forward了,能抓到从服务器0发向DSP的包,包的内容为0a0b0a0b......

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
2 [报告]
发表于 2013-11-11 18:46 |只看该作者
版主,帮忙看一下,谢谢!

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
3 [报告]
发表于 2013-11-12 17:21 |只看该作者
又一天了,问题有一点进展了。

我通过在kernel内打桩,发现,RTP包没有在PREROUTING链路上匹配成功,导致包在经过ip_rcv_finish之后,进入了LOCAL链路。
start to send icmp, type = 3, code = 3
drop packet, src ip:0x0a000132, port: 0x2e06, dst ip:0x0a00010a, port:0x2710.
Call Trace:
[ee1c7c70] [c00077d8] show_stack+0x48/0x15c (unreliable)
[ee1c7cb0] [c04c3e3c] icmp_send+0x1c0/0x3e0
[ee1c7da0] [c04c0e74] __udp4_lib_rcv+0x37c/0x614
[ee1c7de0] [c04972c8] ip_local_deliver_finish+0x110/0x30c
[ee1c7e00] [c0496db0] ip_rcv_finish+0x60/0x468
[ee1c7e20] [c0463898] __netif_receive_skb+0x348/0x3fc
[ee1c7e70] [c046506c] netif_receive_skb+0x4c/0xd0
[ee1c7ea0] [c0399104] _dpa_rx+0x1b4/0x2e8
[ee1c7ee0] [c03992ac] ingress_rx_default_dqrr+0x74/0x140
[ee1c7f10] [c043b7d0] qman_poll_dqrr+0x170/0x1d4
[ee1c7f40] [c0397b44] dpaa_eth_poll+0x20/0x58
[ee1c7f60] [c046538c] net_rx_action+0x11c/0x1d0
[ee1c7fa0] [c003874c] __do_softirq+0xf0/0x180
[ee1c7ff0] [c000d4a0] call_do_softirq+0x14/0x24
[e326dee0] [c000451c] do_softirq+0x98/0xc4
[e326df00] [c0038ab0] irq_exit+0xac/0xc8
[e326df10] [c000420c] do_IRQ+0x94/0x188
[e326df40] [c000f14c] ret_from_except+0x0/0x18
照理的话,他应该会匹配上NAT表在PREROUTING上的一条规则,如果匹配了,应该就走ip_forward的了,就不会出现ICMP-目的端口不可达。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
4 [报告]
发表于 2013-11-15 17:43 |只看该作者
怎么没人回啊?

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
5 [报告]
发表于 2013-11-15 17:43 |只看该作者
说说,这一个礼拜的进展。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
6 [报告]
发表于 2013-11-15 17:43 |只看该作者
本帖最后由 shaohui973 于 2013-11-15 17:45 编辑

当前的情况是这样的:
root@p2041rdb:/mnt/sata# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10000 to:10.0.1.60:10104
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10000 to:192.100.1.100:10000
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10001 to:10.0.1.60:10105
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10001 to:192.100.1.100:10001
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10002 to:10.0.1.50:11794
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10002 to:192.100.1.100:10002
DNAT       udp  --  anywhere             192.100.1.1          udp dpt:10003 to:10.0.1.50:11795
DNAT       udp  --  anywhere             10.0.1.10            udp dpt:10003 to:192.100.1.100:10003

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10000 to:10.0.1.10:10000
SNAT       udp  --  10.0.1.60            anywhere             udp spt:10104 to:192.100.1.1:10000
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10001 to:10.0.1.10:10001
SNAT       udp  --  10.0.1.60            anywhere             udp spt:10105 to:192.100.1.1:10001
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10002 to:10.0.1.10:10002
SNAT       udp  --  10.0.1.50            anywhere             udp spt:11794 to:192.100.1.1:10002
SNAT       udp  --  192.100.1.100        anywhere             udp spt:10003 to:10.0.1.10:10003
SNAT       udp  --  10.0.1.50            anywhere             udp spt:11795 to:192.100.1.1:10003
ip_forward为1.

从NAT规则来看,如果一个udp包的src <ip:port> == 10.0.1.60:10104,dst <ip:port> == 10.0.1.10:10000经过系统,地址信息会被修该为
                              src <ip:port> == 192.100.1.1:10000,dst <ip:port> == 192.100.1.100:10000.

现在的情况是这样的:
                  IP PHONE1  -----------   linux-host -----------other network
                  pc1
如果IP PHONE1 和 pc1发出的udp包,src ip:port ( 10.0.1.60:10104)和 dst ip:port (10.0.1.10:10000)都一样,且协议均为UDP。这个时候,两种包都无法NAT和FORWARD,linux-host会回复目的端口不可达,我跟踪过包,貌似包路由去了LOCAL。此时,如果话机IP PHONE1停止发包(挂机),过几秒后,PC1发的包就可以成功被NAT和FORWARD,即源和目的IP以及端口都被正确的修改。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:57:09C
日期:2016-10-25 16:17:59
7 [报告]
发表于 2013-11-18 09:32 |只看该作者
)我想我已经找到原因了,通过打印跟踪,发现在nf_nat_packet处理时,没有进入manip_pkt()去修改DST信息,因为ct->status & IPS_NAT_DST不满足。判断是CONFIG_NF_CT_NETLINK没有打开。查看.config,确实是没有打开。

问下大家,除了打开这个,还有什么配置要打开???谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP