[nat和rtp]遇到个问题,udp包可以nat和forward,但是rtp却不行,求指导。
这次做了个内外网转发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...... :mrgreen:版主,帮忙看一下,谢谢! :hug:又一天了,问题有一点进展了。
我通过在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:
show_stack+0x48/0x15c (unreliable)
icmp_send+0x1c0/0x3e0
__udp4_lib_rcv+0x37c/0x614
ip_local_deliver_finish+0x110/0x30c
ip_rcv_finish+0x60/0x468
__netif_receive_skb+0x348/0x3fc
netif_receive_skb+0x4c/0xd0
_dpa_rx+0x1b4/0x2e8
ingress_rx_default_dqrr+0x74/0x140
qman_poll_dqrr+0x170/0x1d4
dpaa_eth_poll+0x20/0x58
net_rx_action+0x11c/0x1d0
__do_softirq+0xf0/0x180
call_do_softirq+0x14/0x24
do_softirq+0x98/0xc4
irq_exit+0xac/0xc8
do_IRQ+0x94/0x188
ret_from_except+0x0/0x18
照理的话,他应该会匹配上NAT表在PREROUTING上的一条规则,如果匹配了,应该就走ip_forward的了,就不会出现ICMP-目的端口不可达。 怎么没人回啊?:-L 说说,这一个礼拜的进展。 本帖最后由 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以及端口都被正确的修改。 :))我想我已经找到原因了,通过打印跟踪,发现在nf_nat_packet处理时,没有进入manip_pkt()去修改DST信息,因为ct->status & IPS_NAT_DST不满足。判断是CONFIG_NF_CT_NETLINK没有打开。查看.config,确实是没有打开。
问下大家,除了打开这个,还有什么配置要打开???谢谢。
页:
[1]