假设我的 IP 是 198.51.100.27,我朋友的 IP 是 203.0.113.11。我们都通过标准消费者 ISP 路由器连接到互联网。
我们如何在不使用第三方服务器的情况下互相发送几个字节?(并且无需进行路由器端口转发配置)
我听说过netcat
或ncat
但我不确定如何使用它向我的朋友发送“hello world”,以及他如何在终端中看到此消息
他应该这样做吗:
ncat -C 198.51.100.27 80 # this IP is mine
和我:
ncat -l 203.0.113.11 80 < echo "hello world" # this IP is my friend's IP
?
我什至不确定netcat
/是否ncat
是正确的工具。我也查看了chownat
/pwnat
但我不知道如何在这样一个简单的示例中使用它:只是发送/接收“hello world”。
笔记:
我不想通过 SSH 或 SFTP 连接到我朋友的计算机。我只想给他发“hello world”或者互相发短信。
除了了解如何在没有集中式服务器的情况下直接点对点发送字节之外,我没有明确的目标。因此,如果我可以向他发送一两个字节,以便他在控制台中看到它们,那就没问题了!
答案1
基本上,nc -l -p $port
在一台主机上运行,并nc $ipaddr $port
设置适当的值$ipaddr
和某个值$port
就足够了。但这要求机器之间的任何防火墙都不会阻止连接。
您提到您“都位于标准消费者 ISP 路由器后面”,这通常意味着某种 NAT,这意味着路由器后面的计算机没有公共 IP 地址,因此您无法直接连接到主机,但必须在路由器上配置端口转发。
此外,还存在您的 ISP 是否允许连接的问题。根据多种因素,您可能无法在普通的使用者连接中接收 TCP 连接。
至于重定向 和echo
,您需要echo "message" | nc ...
将另一个命令的输出通过管道传输到nc
,或者nc ... <<< "message"
将字符串直接定向到nc
。 (这不是标准的功能sh
)
答案2
“客户端”需要使用“服务器”公共IP(查找whatismyip站点),并同意由扮演“服务器”的路由器“端口转发”的端口号。服务器不需要知道客户端的公共IP,除非他想保护自己并且只接受来自该特定客户端的连接。
答案3
您可能正在寻找的东西叫做TCP打孔。
当您对 NAT 路由器(甚至端口转发)没有任何控制权且使用第 3 方代理同步通信并且您的 NAT 是简单 NAT,而不是“运营商级 NAT”时,您可以执行此操作,包括因此不改变可见的端口,仅改变IP(否则一切都会变得更加困难)。经纪人可以是任何东西,甚至是一个真正的电话,但当然自动化需要一些专门的东西。代理的作用是同步操作并让双方知道他们的公共 IP。 A眩晕服务器可能是自动解决方案的一部分。
基本原理是 TCP 最初是RFC 793 中定义允许通常的 SYN 、 SYN/ACK 、 ACK 三重手工检查,或者还可以同时进行 SYN+SYN、同步 SYN+ACK 和 ACK(请参阅上一个链接,图 8)。执行此操作时,两个 NAT 路由器都将打开 TCP 连接的“返回流”。
注意:通信应该同步(可能与 NTP 同步),否则较慢的对等方的 NAT 路由器将发送 RST,并可能关闭另一个 NAT 路由器上的“漏洞”。如果路由器丢弃数据包而不是发回 RST,则这不是问题。许多家庭 NAT 路由器只是丢弃这些数据包,因此不会有问题。
举个例子:198.51.100.27 的所有者 A 打电话给 203.0.113.11 的所有者 B,他们同意在给定时间使用在线网站检查其 IP 后(“我的 IP 是什么”... )并使用netcat传统版本,
A 将输入:
nc -p 7777 203.0.113.11 8888
乙将同时地类型:
nc -p 8888 198.51.100.27 7777
将会发生的情况是,每个用户都会看到一个已建立的 TCP 连接,即相同的联系。
A 现在可以自由输入“hello world”,B 将会读取该内容。
我实际上在 stackoverflow 上做了类似的回答,也许还有更多细节,但从未将其作为解决方案进行检查:https://stackoverflow.com/questions/39545461/tcp-based-hole-punching/39581596#39581596
而不是使用 netcat,索卡特应该是首选,因为它可以更轻松地与其他任何东西集成以实现自动化。