我们正在实施基于SIP的解决方案,并已将设置配置为与RTPProxy一起使用.现在,我们通过RTPProxy路由一切,因为我们在依赖ICE的媒体传输方面存在一些问题.如果我们没有弄错的话,如果它们落后于对称NAT,则需要一个中央中继服务器来在两个客户端之间中继流数据.在实践中,这是否占所有消费者用户的很大比例?如果我们在没有必要时实施适当的路由以跳过中继服务器,我们将节省多少带宽.我们缺少更好的解决方案吗?
我的印象是,尽管有 NAT,WebRTC 仍竭尽全力实现 P2P 连接。[1][2] 这就是为什么我惊讶地发现 WebRTC 在某些很容易实现 P2P 连接的情况下无法连接对等点。我想了解为什么会发生这种情况,以及我是否可以采取任何措施来改善这种情况。
为什么我说P2P在某些情况下很容易实现呢?我之所以这么说是因为我在不同网络上的两台设备上进行了实验:
我可以通过以下方式轻松实现这些设备之间的 P2P 连接:
设备 F 将连接绑定到随机(不可预测)端口,并通过该端口将 UDP 数据包发送到 Internet 上的任何位置。由于 F 位于全锥 NAT 后面,因此该数据包已“打孔”打开的端口,允许任何外部地址现在通过该端口发送数据包。就我而言,我在本地打开的端口似乎与外部端口相同。(如果外部端口与本地端口不同,我们可以使用 STUN 之类的东西来找出外部端口。)
设备 S 将连接绑定到随机(不可预测)端口,并通过该端口向设备 F 的外部 IP 和端口发送 UDP 数据包。该数据包可以传送,因为该端口在步骤 1 中已打洞打开。之后数据包时,设备 S 通过自己的端口打洞,允许来自设备 F 的数据包通过它发回。设备F会知道将数据包发送到哪里,因为S发送的数据包包含外部IP和端口。由于设备 S 具有对称 NAT,打洞不会为所有流量打开端口,仅针对来自设备 F 的流量(设备 F 的外部 IP 和端口)。
我使用 Python 来验证我是否能够在这些设备之间打开 P2P 连接并双向发送消息,如上所述。我不明白为什么WebRTC无法实现这样的P2P连接。
为什么我声称 WebRTC 在某些应该很容易连接的情况下无法连接?我之所以这么说是因为我尝试使用 3 个不同的代码示例来实现 WebRTC P2P 连接。当设备位于同一本地网络时,所有示例均有效,但当设备位于不同网络时,所有示例均无效(上述设置)。我尝试过的库都没有提供任何有用的调试信息来找出问题所在,并且 chrome://webrtc-internals 也没有提供任何有用的信息。我还尝试在 …
我正在用C#制作游戏,我想展示对手的进度(动作等等).所以我通过TCP协议将游戏中的事件发送给对手.
我已经在localhost上尝试了我的应用程序,但是当我尝试使用我的外部地址以便通过互联网进行通信时,我在TcpInformer.Connect()类中收到以下错误:
连接尝试失败,因为连接方在一段时间后未正确响应,或建立的连接失败,因为连接的主机未能响应(我的外部IP地址):(端口)
我认为问题在于我是在NAT背后.但我已经在IP 10.0.0.1上为端口49731设置了portforwarding,但没有任何改变.
我的第二个猜测是Windows防火墙,但即使我停止防火墙,我的应用程序也没有开始工作.
我连接两台PC的代码是:
TcpInformer peer;
TcpHost server;
public void PrepareConnection() // for server (host)
{
playerType = PlayerType.One;
server = new TcpHost(form, this);
server.Start("10.0.0.1", 49731);
}
public void PrepareConnection2() // for client
{
playerType = PlayerType.Two;
peer = new TcpInformer(form, this);
peer.Connect("MY EXTERNAL IP", 49731);
}
// classes TcpHost and TcpInformer
public interface ITcpCommunication
{
#region Operations (3)
void ReadData();
void SendData(byte[] message);
void SendData(byte[] message, int size);
#endregion Operations
}
public class TcpInformer : ITcpCommunication …Run Code Online (Sandbox Code Playgroud) 我有一个简单的要求,即基于套接字的通信的软件级端口转发/隧道.
是否有任何工具/ deamon /服务程序可用于配置和执行此操作?
我试过SSH,但根据我的理解,这需要一个支持SSH协议的服务器.就我而言,这不适用.我也尝试过使用JSch,但这又是java格式的SSH实现.
有人会抛出一些指针吗?是否可以在linux中使用iptables NAT?
场景:
许多嵌入式设备(运行Linux)都在字段中,在路由器后面,所以NAT'd,我们无法与它们建立连接.
我们需要一个支持人员才能在任何设备上启动终端/ shell会话.
他们的本地终端也将在公司防火墙后面进行NAT,因此我们需要一些他们和设备可以连接的中央"会面点".
如果有必要,我们可以要求支持人员登录某种终端服务器,但我更喜欢只在桌面上弹出终端窗口的解决方案.
我们可以(通过其他方式)告诉设备执行一些仲裁脚本或应用程序来启动会话.
没有NAT,它只是设备的SSH,我们离开.但是在这个NAT环境中我的选择是什么?
如果需要,我们可以在任何一端或会合点服务器上开发代码,但显然如果有应用程序那么我们就不必编写内容,甚至更好.
指向我可能错过的其他问题(虽然我已经看过)或我应该考虑为中央"会面点"服务器的应用程序的指针欢迎
我正在寻找在Ruby中构建一个bittorrent客户端(尽管语言在这里并不重要).
我读了一个BEP规范,它说查询/announce(没有DHT支持)跟踪器会给出一个当前为给定信息哈希连接的对等列表.
检查一下.我创建了一个torrent文件,我发现跟踪器返回我的机器的IP以及端口(我确认是我的机器上的Bittorrent客户端的运行端口,即Utorrent)
但是问题是Peers信息返回了我的ISP的IP即111.125.209.41(面向IP的公众,因为我在NAT后面).
现在我无法通过我的ISP 连接(通过TCP)到我的机器上运行的进程.
任何人都可以建议bitorrent如何在这方面工作,我该怎么做才能解决这个问题.
它可能会通过UDP Bittorrent使用UDP保持打孔不确定TCP上发生了什么.
我已经为此苦苦挣扎了几个小时。因此,我创建了我的 VPC 以及 4 个不同的子网。前三个连接到常规 Internet 网关。最后一个连接到 NAT 网关(以 0.0.0.0/0 作为目标)。我的 CodeBuild 项目设置为使用此 VPC 和最后一个子网。
当我在 CodeBuild 项目环境中单击“验证 VPC 设置”时,我收到以下警告:
“ID 为*的 VPC可能没有互联网连接。CodeBuild 找不到子网 ID 为 * 的目标互联网网关的 0.0.0.0/0 目的地。”
如果我尝试运行 CodeBuild 项目,它将超时,因为它无法访问 Internet 并且无法从 CodeCommit 下载源...
我在这里缺少什么?我的子网的路由表附加到 NAT 网关,目标是 0.0.0.0/0,所以上面的错误消息对我没有任何意义。
谢谢!
我刚刚开始学习 WebRTC 来实现音频和视频应用程序,并且知道有各种公共眩晕服务器可用于对等连接。但我有点困惑我可以将这些公共服务器用于商业应用程序吗?
另外,我想知道如果我想创建商业应用程序,是否有任何教程或指南可以让我了解如何制作和部署自己的眩晕或转向服务器?
我知道这个话题并不新鲜。尽管有各种信息,但没有提供可靠的解决方案(至少我没有找到)。我有一个用 python3 编写的 P2P 守护进程,最后一个元素是通过 TCP 连接 NAT 后面的两个客户端。我对这个主题的参考:
https://bford.info/pub/net/p2pnat/
在两个客户端都连接了会议点服务器后,如何使两个客户端直接相互连接?
到目前为止我所做的:
服务器:
#!/usr/bin/env python3
import threading
import socket
MY_AS_SERVER_PORT = 9001
TIMEOUT = 120.0
BUFFER_SIZE = 4096
def get_my_local_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
# doesn't even have to be reachable
s.connect(('10.255.255.255', 1))
IP = s.getsockname()[0]
except Exception:
IP = '127.0.0.1'
finally:
s.close()
return bytes(IP, encoding='utf-8')
def wait_for_msg(new_connection, client_address):
while True:
try:
packet = new_connection.recv(BUFFER_SIZE)
if packet:
msg_from_client = packet.decode('utf-8')
client_connected_from_ip = client_address[0]
client_connected_from_port = client_address[1]
print("We have …Run Code Online (Sandbox Code Playgroud) 我必须通过静态出站 IP 同步一些数据,我需要事先将这些数据列入数据提供商的白名单。因此,我想为 ACI(Azure 容器实例)配置静态出站 IP 地址。如果没有经济高效的方法来执行此操作,我也可以决定将其配置为应用服务 Web 应用程序,但是,由于资源隔离,ACI 是首选。(因此,一名行为不端的工人无法让整个工人池瘫痪。)
作为参考,这里是我想要实现的目标的简单图表。为简单起见,我将 Web Apps 和 ACI 添加到映像中,但我只需要其中之一,最好是 ACI。
我在过去几天阅读了相关的微软文档,所以我知道有多种方法可以做到这一点,但是,令我惊讶的是官方解决方案比我想象的要复杂和昂贵得多。
我尝试过的事情
为应用服务 Web 应用配置 NAT
这可行,但不是所需的解决方案。我可以将 Web 应用程序放入 vNet 中的子网中,然后使用该子网的静态 IP 地址配置NAT 网关。这按预期工作,运行
curl api.ipify.org.
Run Code Online (Sandbox Code Playgroud)
Web 应用程序内将返回我在 NAT 网关中配置的静态 IP 地址。此方法的问题在于,它使用的 Web 应用程序在同一应用程序服务计划上的应用程序之间没有资源使用隔离。
使用 ACI 在 vNet 前面部署防火墙
这是文档中建议的“官方方法”。(顺便说一句,我永远无法按照指南使其工作,但这不是主要问题。)我的主要问题是复杂性和价格。我们不需要防火墙,添加一个防火墙和管理它的负担是我们在这个特定项目中不需要的额外复杂性。价格也很荒谬,我们想要配置一个静态出站 IP,而建议的方式所带来的价格涨幅比我们为应用程序的其余部分支付的价格还要大。(我们每月支付约 400 美元,防火墙起价约 600 美元。)
所以这不是首选。
在包含 ACI 的 vNet …