我正在尝试将UDP数据报中的数据传输到外部位置的客户端到本地局域网中的pc。 但我的网络是通过ADSL调制解调器发送到带有Slackware的电脑,这个电脑重定向包到其他电脑。 我正在使用socat重定向UDP:
socat -v udp-listen:1935,fork,reuseaddr udp:192.168.0.40:37000
在局域网中,连接很好,但外部IP不起作用。 有人帮忙吗?
答案 0 :(得分:7)
我认为socat
不是罪魁祸首,但考虑使用stone
代替socat
,因为对每个收到的数据包使用fork()
有点奇怪。像你这样(我认为)在你的情况下调用Stone:
stone -n -d -d -d -d 192.168.0.40:37000/udp 1935/udp
现在为什么外部IP可能不起作用。可悲的是,你的文字并没有说明你的设置,所以我不得不猜测:
如果能够转发UDP数据包,则取决于您的防火墙/调制解调器/路由器。通常,如果从内部发起UDP请求,路由器将打开NAT连接,这通常意味着不仅数据包的源IP发生变化,而且源端口也发生变化。由于UDP是无连接的,因此如果没有数据传输,UDP NAT连接通常会很快超时,比如5分钟后就会超时。
如果UDP必须以相反的方向打开(从Internet到Intranet),路由器通常会丢弃所有来自Internet的UDP数据包,因为它不知道将它们转发到哪里。路由器不能只选择一些任意机器,这将是一个安全漏洞。因此,在“连接到路由器后面的计算机的Internet”中,您必须打开路由器上的UDP端口并将其转发到正确的计算机。在这种情况下,从内部计算机发送的数据包将获取其源IP并重写源端口,因此Internet上的计算机始终会看到数据包来自路由器。因此除了路由器中的附加规则外,这种情况与传出的情况相同。
请注意,有几种不同的方法可以实现NAT(对称等)以及如何在路由器上打开端口的几种方法(Config,UPnP等),以便总是将一些空洞插入其中取决于您的硬件功能。这一切都无法在这里得到解答。
其他一些想法也可能出错:
某些UDP协议编码有效负载内的IP地址。在这种情况下,只转发数据包是不够的,您还必须更改有效负载以更正交换的IP地址以使所有计算机能够一起通信。无论如何,这样的UDP协议设计得很糟糕,因为你永远不应该假设两台任意机器可以直接相互通信,所以所有好的协议都应该支持简单的代理。
有些ISP会出于任意原因过滤某些UDP端口。如果您在从Internet到DSL的谈话时遇到问题,请尝试使用直接连接到不同ISP的两台外部计算机。如果这些可以通过UDP进行通话检查您是否可以从Intranet与其中一台外部计算机进行通信。如果这仍然有效,这意味着你也可以倒退,因为通常UDP不是有向协议,但如果涉及到某些NAT,你必须确保通信端口保持打开状态。
移动互联网计划通常不支持P2P。这可能意味着,这些计划根本不支持互联网,因为根据定义,IP是P2P。互联网服务提供商真正想用“无P2P”说的是(我的猜测),不支持从互联网到移动设备的连接。在这种情况下,您始终必须从移动设备启动连接,因此您无法使用推送方法(Internet到移动设备),移动设备始终必须拉(来自Internet的数据)。一些宽带/有线电视提供商可能会这样做。通常,如果您的ISP在10.x.y.z范围内分发IP,您就可以看到这一点。
可能还有另一个技巧如何使连接正常工作:
请求您的ISP获取一些IPv6。也许使用6to4。使用IPv6,您可以完全消除NAT,然后本地LAN可以直接在IPv6上互联互联。确保在IPv6接口上的Intranet主机上激活防火墙/ iptables,否则您可能会很快看到入侵者。
HTH