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


21

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

但是,可能会出现这种情况,我想在Raspberry Pi上进行一些更改。例如,系统更新或对将数据发送到服务器等的程序进行更改。

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

注意:我不想更改网络,并且现有路由器没有端口转发,dynDNS或VPN的功能。

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

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

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

这一切听起来都不错,但是问题是,这不适合与TCP连接一起使用,因为路由器能够“理解” TCP连接的握手,并且如果建立不正确,它将无法转发包装。

因此,如何在客户端A不坐在具有dynDNS,固定公共IP或端口转发功能的路由器后面的情况下,如何打开从客户端B到客户端A的SSH会话?很难将中央服务器与公共的,固定的IP或域名一起使用。


您有一个面向Internet的设备,该设备能够进行UDP孔打孔,但不能进行TCP?获得更好的NAT设备。
cpt_fink 2015年

我没有用udp完成ssh,但这里有链接zarb.org/~gc/html/udp-in-ssh-tunneling.html
barlop 2015年

我不知道,但是我问了一个ssh专家,他们说ssh可以转发udp,但是只有当它像vpn一样,并且有一个切换时,他才说是,-w但是他对UDP表示udp(也许是因为他包括使用ssh转发udp的任何尝试),涉及诸如高延迟和重新传输您不再想要的内容之类的问题。我想这仍然是一件有趣的事情。我也通过ssh和-w看到了这个vpn,这里也提到了wiki.archlinux.org/index.php/VPN_over_SSH
barlop

我很好奇您为什么不想打开入站端口?-这听起来不像需要超级出色的安全性的方案……或者,您可以让客户端A维护出站SSH连接,并通过反向端口绑定到客户端B可以访问的服务器。这样,您可以通过中间人服务器进行连接。然而,这些类型的布置易于失败,因此由于出现故障时有限的物理访问方式来解决它是非常不希望的。
kabadisha 2015年

Answers:


8

pwnat


“ ..发起与NAT后对等方的连接并非易事。

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


pwnat工具是仅GNU / Linux自主NAT遍历的独立实现NAT后面的服务器联系后它使用UDP数据包建立了具有TCP语义的通道它支持NAT后面的客户端和服务器(如果其中一个NAT允许发送伪造的[custom] ICMP消息。)此实现针对最终用户。


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

  -c客户端模式
    <args>:[本地ip] <本地端口> <代理主机> [代理端口(def:2222)] <远程主机> <远程端口>

  -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来访问Google!  


wn  网络信号流程图


“为使核心思想服务器,以了解客户端的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


pwnat对于本地主机到本地主机的连接几乎不起作用。我可以发送和接收一些数据包,但是对于建立可靠的连接而言,它不是很有用。
斯科特

@Scott好吧,这是一个有趣的技巧,但实际上只是基于滥用和滥用ICMP等网络协议的概念证明。我不会依靠它。它是旧的并且没有维护,我不建议您使用它。如果问题没有明确规定UDP打孔,我什至都不会提到。如果您希望可靠,请连接VPN隧道。
声音

我没有抱怨,但是我认为“此解决方案不适合在生产环境中使用”对于任何来这里寻求潜在稳定解决方案的人都是有用的信息。
斯科特

@Scott不是,不是在这样的环境中使用。许多专有产品都采用了这些技术。无论如何,这里有足够的信息供人们做出自己的决定。我不推荐。但是我使用VPN隧道。另一方面,某些网络会过滤VPN流量,因此您必须视情况而定。您需要通过NAT路由器的帮助吗?
声音

我有一个当前可行的解决方案,它使用反向ssh隧道链接两个NAT'd机器。但是,它需要一台具有静态IP或可以在路由器上配置端口转发的“中间人”计算机。这本来可以让我裁掉那个中间人。那好吧。
斯科特


0

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

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  

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

nc -l <port1>

和:

nc -l <port2>  

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


这与“ UDP穿孔” 有何关系?
声音

?如何遍历NAT?
ZEE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.