我想使用套接字在两个Python程序之间发送和接收消息.当计算机连接到同一个路由器时,我可以使用私有IP来执行此操作,但如果有2个NAT将它们分开,我该怎么办?
谢谢(我的第一个问题)
我正在尝试为我的网络类创建一个Java聊天应用程序.截至目前,我被困在尝试连接到不同路由器后面的人.我现在拥有项目的方式是我有一个客户端程序和一个服务器程序.客户端程序首先登录到服务器程序,该程序将其IP和端口记录在数据库中,然后服务器通过其IP和端口向他们返回他们的朋友列表.然后,客户端关闭与服务器的连接,并尝试使用服务器发回的信息连接到另一个客户端.到目前为止,我的程序只能连接到服务器并获取朋友的IP和端口,但当我使用这些值连接到另一个客户端时,我无法连接.
socket = new Socket();
socket.setReuseAddress(true);
socket.setKeepAlive(true);
socket.setSoLinger(true, 10);
socket.bind(new InetSocketAddress(Port));
socket.connect(new InetSocketAddress(host, SERVER_PORT));
reusePort = socket.getLocalPort();
Run Code Online (Sandbox Code Playgroud)
上面是一段用于连接服务器的java代码,下面是我在客户端做的事情.
ss = new ServerSocket(reusePort);
Run Code Online (Sandbox Code Playgroud)
所以现在技术上我正在侦听我用来连接到登录的服务器的同一个端口,并且可以检索到另一个客户端,并且在我的ip和端口的NAT表中.我不确定我缺少什么,或者是否有某些协议或我需要做的事情.我已经看过TCP和UDP打孔但我不确定它是如何实现的或如何实现它.
任何建议,将不胜感激.
我知道路由器使用NAT来转换我们从ISP获得的公共IP来说300个本地IP.交换机是否执行相同的功能?如果没有,它有什么不同?
我正在开发一个p2p聊天应用程序,它可以在DSL两个不同的NAT上正常工作,但是当涉及到3G USB互联网连接时,它就失败了.
我发现它不可能绕过3g网络的NAT,而Skype和种子等已知的p2p应用也无法绕过3g网络,每当遇到这些问题时,通过中央服务器发送数据.
我想知道3g网络的架构是什么.我听说他们没有私有IP,端口对只有公共IP,端口可用,一个公共端口可以分配给很多设备,我是否正确?如果是这样,服务器如何将数据发送到3g网络?
我必须在位于 NAT 后面(在不同网络中)的两个对等点之间在 iOS (Objective-C) 中实现套接字通信。是否有任何技术可以让我实现这一目标?基本上,我正在寻找一些 STUN、TURN 实现,它可以让我找出外部 IP/端口地址。
提前致谢,列昂尼德
我试图了解iptables中的一个规则:
$ sudo iptables -t nat --list -v
...
Chain OUTPUT (policy ACCEPT 618 packets, 31267 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- any any anywhere !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
...
Run Code Online (Sandbox Code Playgroud)
所以这个规则试图匹配目标地址类型"LOCAL"而不是127.0.0.0/8范围内?
它会匹配什么地址?这条规则的目的是什么?
谢谢!
我在AWS上创建了一个包含公共和私有子网的VPC.所有应用服务器都在私有子网中,所有出站请求都必须通过面向Internet的NAT实例.
目前,我们的项目要求app服务器访问服务提供商提供的ftp服务器.
我已经尝试了几种方法来管理它,但都没有运气.我所做的是打开一个端口范围,比如说(40000 - 60000)NAT和APP安全组,也是标准的ftp端口20-21.
可以传递用户身份验证,但我无法从应用服务器列出内容.
我可以从NAT访问ftp服务器,根本不是问题.
那么我该怎么做才能让它发挥作用呢?
我在digitalocean中创建了一个droplet,我可以使用一个vps_ip.
在我的家里,连接到互联网的方式是:route + modem + adsl.
我在家里的本地电脑上建了一个wordpress.
连接到网络时的净状态如下所示.
WAN:
MAC?ommitted for privacy
IP ?public_ip PPPoE
subnet mask?255.255.255.255
gateway?153.0.68.1
DNS?114.114.114.114 223.5.5.5
LAN
MAC?ommitted for privacy
IP ?192.168.1.1
subnet mask?255.255.255.0
DHCP?active
ifconfig
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
Run Code Online (Sandbox Code Playgroud)
我的目标:让公众访问家用电脑上的wordpress网站,vps_ip digitalocean给了我.
感谢CrypticDesigns.
https://www.digitalocean.com/community/questions/how-to-map-my-local-ip-192-168-1-100-with-my-vps_ip?
我已经在CrypticDesigns的帮助下解决了这个问题.
在我的本地网络中:
在我的路由器端口端口80和私有IP 192.168.1.100到网络外部.
在公共液滴系统中:
sudo apt-get install nginx
sudo nano /etc/nginx/sites-available/default
server {
listen *:80;
server_name vps_ip;
rewrite .* http://publlic_ip$request_uri permanent;
}
sudo service nginx restart
Run Code Online (Sandbox Code Playgroud)
任何进入vpsip的人都可以浏览我的wordpress.
重要的是我的WAN上的ip地址大约每30分钟变化一次.大约30分钟后?
publicip将更改,配置文件/ etc/nginx/sites-available/default无法正常工作.
我想对这个问题进行改进.
我的意见是完成任务:
1.在我的家用电脑
命令curl ipinfo.io/ip可以获得我的公共IP.
每隔30分钟将其写入crontab.
2.发送vpsip并在/ etc/nginx/sites-available/default中更改publicip的值
,然后重新启动nginx.
如何用shell命令表达这两个步骤使进程自动化?
virtualbox文档没有明确解释。
https://www.virtualbox.org/manual/ch09.html
9.11.5。在NAT模式下启用DNS代理默认情况下,NAT引擎向来宾提供与主机上配置的DNS服务器相同的DNS服务器。在某些情况下,可能希望对来宾隐藏DNS服务器IP,例如,当此信息由于DHCP租约到期而可能在主机上更改时。在这种情况下,您可以使用以下命令告诉NAT引擎充当DNS代理:
VBoxManage Modifyvm“ VM名称” --natdnsproxy1上
9.11.6。在NAT模式下将主机的解析器用作DNS代理为了解析网络名称,NAT引擎的DHCP服务器提供了主机的已注册DNS服务器的列表。如果由于某种原因您需要隐藏此DNS服务器列表并使用主机的解析器设置,从而迫使VirtualBox NAT引擎拦截DNS请求并将它们转发到主机的解析器,请使用以下命令:
VBoxManage Modifyvm“ VM name” --natdnshostresolver1 on注意,此设置与DNS代理模式相似,但是,代理模式仅将DNS请求转发到适当的服务器,而解析器模式将解释DNS请求并使用主机的DNS API查询信息并将其返回给访客。
谁能真正了解其中的区别?
编辑:需要一个实际的例子。
我正在使用Twilio Network Traversal Service作为本机应用程序的一部分,我正致力于执行点对点远程桌面连接.我们实现了WebRTC协议栈的一个子集,它等同于WebRTC数据通道(而不是WebRTC视频和音频协议).当使用TURN中继时,TURN分配似乎在会话开始的几分钟到最多12分钟之间随机无效.这个问题看起来非常相似,这一个,但所提出的解决方法(发送无声音频)是不是在我的情况下可以接受的,因为我没有实现的WebRTC的音频/视频协议.
在过去的两周里,我一直在解决这个问题,并将问题视为Twilio服务本身.为了比较,我使用了基于Web的WebRTC数据通道演示,使用了firefox和Xirsys TURN服务器云.我有wireshark捕获显示firefox与Twilio断开连接就像我的本机应用程序一样,而完全相同的firefox演示在使用Xirsys服务器时不会断开连接.
我最初使用的是Xirsys,但是我的服务经历了一些不稳定,这使我转向Twilio,这就是为什么我宁愿让Twilio解决这个问题而不是回到Xirsys.至少,我宁愿有两个WebRTC托管服务提供商,我可以选择,我知道应该可以正常工作.这就是为什么我花时间详细解释这个问题所以它可以修复.
这里有两个wireshark捕获(过滤掉对等数据消息)显示使用WebRTC数据通道和Twilio TURN中继服务器的firefox:
在第一次捕获后4分钟后,流量停止传输,在第二次捕获后约11分钟.在两次捕获中,firefox都会检测到流量停止被中继(在数据通道级别),并通过发送生命周期为零的刷新请求数据包来尝试正常断开连接.两次正常断开连接都会导致437 Allocation Mismatch错误,表明服务器甚至不知道firefox尝试正常关闭的分配.
使用我的本机应用程序,这通常采用CreatePermission Request消息的形式,该消息失败并出现438"错误的nonce"错误,这基本上是客户端尝试更新不再存在的分配的权限时应该发生的错误.错误代码438通常表示"Stale nonce",这实际上不是错误,而是指示nonce已过期且客户端应使用"error"消息中包含的新nonce再次尝试.我花了一段时间才弄明白,但即使错误代码为438,错误字符串也不一样.我已经观察到Xirsys发现了一个真正的陈旧的nonce错误,并使用错误响应中的新nonce成功更新了我的权限,所以我知道我可以在我的实现中正确处理这种情况.
以下是我使用过的WebRTC数据通道演示的源代码:https: //github.com/devolutions/webrtc-demo
为了比较,这里是使用Xirsys TURN服务器云的相同firefox数据通道演示:
在这次捕获中,我让演示运行了大约16分钟(它的工作时间比这长得多,我试过的最长时间是两个小时).我们可以看到流量在会话的整个持续时间内都会被中继,并且CreatePermission请求会继续由firefox成功发送.最后,firefox关闭WebRTC数据通道(而不是由于流量不再被中继而关闭)触发了正常断开连接.与Twilio捕获相反,生命周期为零的刷新请求成功:Xirsys TURN服务器仍然知道分配并发回成功响应,如预期的那样.
应该注意的是,ICMP不可达错误是正常的,因为我认为在这种情况下,当响应返回时,firefox不再侦听给定端口.换句话说,它发送刷新请求的生命周期为零,并且不等待回复.
目前,我别无选择,只能回到Xirsys,但我真的很想,如果可以修复Twilio Network Traversal Service.如果您对此问题有更多疑问,请与我们联系.
我已经在这里上传了wireshark捕获以供参考.
编辑:我已经修改了webrtc演示页面,使得当ice连接状态设置为'disconnected'时它不会关闭连接.现在,当冰连接状态变为"失败"时,我得到真正的断开连接.但是,它实际上并没有改变任何东西,因为在这种情况下,状态从"断开连接"变为"失败"只需要几秒钟.
由于我有新的相关截图和捕获,我正在更新原始问题,以澄清Philipp Hancke指出的某些问题:
首先,这是一个带有ice连接状态修复的新捕获(只有当状态变为'failed'时,浏览器才会关闭连接):
有趣的是,这一次,会议持续了整整18分钟.这是在星期六早上拍摄的,所以我猜这个问题可能与twilio服务器上的当前工作负载有关.然而,它失败的方式与我迄今为止总是一样.作为奖励,我们甚至有一个有效的陈旧nonce响应,由firefox正确处理.
但是,如果我们对同一个捕获采用不同的视图,我们可以看到在firefox认为连接被丢弃之前,流量停止被中断30秒,并发送生命周期为零的刷新请求.与之前的捕获一样,服务器响应Allocation Mismatch错误,表明它不知道firefox正在讨论哪个分配.
发送的最后八个数据包大小相同,所以我猜他们是重传.重传30秒后,SCTP可能会认为传输被丢弃.
关于生命周期为零的刷新请求,我做了一个测试,我在早期从浏览器关闭连接.在这种情况下,服务器识别分配并返回成功响应:
分配不匹配是最容易观察到的症状,但在我使用我的本机应用程序进行测试时,我看到类似的错误与刷新请求的非零生命周期以及CreatePermission请求(438"错误的nonce"错误).但是,由于浏览器在30秒的数据未被中继后关闭连接,因此使用当前的webrtc演示很难观察到这些错误.如果我们可以将超时更改为10分钟,我们也会看到这些错误.