如何在 SSH 隧道/会话中使用 UDP 打孔

Chr*_*ian 21 networking router ssh udp

我想在我的周末小屋中部署一个 Raspberry Pi。Raspberry Pi 用于记录温度并将它们发送到具有固定 IP 的远程服务器,保存数据并将其显示在一个简单的网站上。

但是,可能会出现我想在 Raspberry Pi 上更改某些内容的情况。例如系统更新或将数据发送到服务器或其他任何程序的更改。

使用建议的设置,我将无法从 LAN 外部连接到 Raspberry Pi。

注意:我不想改变网络,现有的路由器不具备端口转发、dynDNS 或 VPN 的能力。

我最近阅读了 UDP 打孔。基本思想是,客户端将 UDP 包发送到已知服务器地址(即启用公共 IP 或 dynDNS)。想要连接到客户端 A 的客户端 B 向服务器询问客户端 A 的公共 IP 和端口号。

然后它可以直接连接到客户端 A 的公共 IP 和动态端口。因为客户端 A 首先通过现在使用的端口连接到服务器,所以 NAT 会将包转发到客户端 A。

我希望我或多或少地正确总结了这个想法……

这一切听起来不错,但问题是,这不能与 TCP 连接一起工作,因为路由器能够“理解”TCP 连接的握手,如果它没有正确建立,它就不会转发包。

那么,如何才能打开从客户端 B 到客户端 A 的 SSH 会话,而客户端 A 不会坐在带有 dynDNS、固定公共 IP 或端口转发功能的路由器后面?使用具有公共、固定 IP 或域名的中央服务器可能会很困难。

voi*_*ces 9

pwnat


“..启动与NAT 后面对等方的连接并非易事。

“..几乎所有NAT实现都拒绝转发最近匹配的出站请求不对应的入站流量


"..该pwnat工具是一个GNU/Linux自主的 NAT 穿越的独立实现在与NAT 后面的服务器联系后它使用UDP 数据包建立一个具有TCP 语义的通道它支持NAT 后面的客户端和服务器(如果其中一个 NAT 允许传输伪造的 [自定义] ICMP消息)。此实现针对最终用户。


  
用法:./pwnat <-s | -c> <参数>

  -c 客户端模式
    <args>: [local ip] <local port> <proxy host> [proxy port (def:2222)] <remote host> <remote port>

  -s 服务器模式
    <args>: [本地 ip] [代理端口 (def:2222)] [[允许的主机]:[允许的端口] ...]

  -6 使用 IPv6  
  -v 显示调试输出(最多 2 个)  
  -h 显示帮助并退出  

例子:  

    服务器端允许任何人代理:
      ./pwnat -s

    想要连接到 google.com:80 的客户端:
      ./pwnat -c 8000 <pwnat.server.com> google.com 80
    然后,浏览到 http://localhost:8000 访问谷歌!  


pwnat;  网络信号流程图


“为使核心思想服务器,以了解客户端的IP地址是针对服务器周期性地发送消息到一个固定的,已知的IP地址。最简单的方法是使用ICMP ECHO REQUEST消息的未分配的IP地址,如1.2.3.4 . 由于没有分配 1.2.3.4,ICMP REQUEST不会被没有默认路由的路由器路由。

“作为发送到 1.2.3.4 的消息的结果,NAT 将启用回复路由,以响应此请求。然后连接客户端将伪造这样的回复。具体来说,客户端将发送一个 ICMP 消息,指示TTL_EXPIRED。这样的消息可以通过任何 Internet 路由器合法传输,并且发件人地址不应与服务器的目标 IP 匹配。

"服务器侦听(假)ICMP 回复,在收到后启动与 ICMP 回复中指定的发送方 IP 的连接如果客户端使用的是全局可路由的 IP 地址,这完全没有问题,并且TCP 或 UDP 都可以使用建立双向连接,如果客户端侦听一个在预先约定的端口。

“(在没有预先约定端口的情况下,端口号在大多数情况下可以作为ICMP ECHO RESPONSE的有效载荷一部分进行通信)。”


来源:http : //samy.pl/pwnat.pdf
https://github.com/samyk/pwnat


小智 -1

这是一个有点脏但简单的解决方案,但是使用 netcat 怎么样?在 Raspberry Pi 上,您可以创建一个循环命令的脚本:

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  
Run Code Online (Sandbox Code Playgroud)

在本地主机上,执行以下操作:

nc -l <port1>
Run Code Online (Sandbox Code Playgroud)

和:

nc -l <port2>  
Run Code Online (Sandbox Code Playgroud)

您将能够在第一个实例中键入命令并在第二个实例中查看响应。