如何在我的树莓派上使用 STUN/ICE 实现 NAT 遍历

Posted

技术标签:

【中文标题】如何在我的树莓派上使用 STUN/ICE 实现 NAT 遍历【英文标题】:How to implement NAT traversal using STUN/ICE on my Raspberry Pi 【发布时间】:2014-10-04 06:31:19 【问题描述】:

我正在尝试在我的树莓派上设置一个能够突破 NAT 路由器后面的实现,以便我可以远程连接到它,而不管它位于哪个网络后面。

我已经试用过 pagekite.me,它非常适合作为中继/反向隧道解决方案,但我觉得它仍然有点笨拙(存在延迟问题,因为需要在其间连接一个额外的服务器)。

我已经阅读了有关 STUN 和 ICE 的信息,但我不知道可以在我的树莓派上实施的任何解决方案。

目标是无论网络配置(路由器/网络)和网络防火墙如何,我都可以通过 SSH 连接到我的 PI。

有人能指出我应该在哪里或什么寻找正确的方向吗?

【问题讨论】:

我还想使用 STUN/TURN/ICE 进行 SSH....这方面有什么进展吗? 【参考方案1】:

我不是直接回答您的 STUN/ICE 问题,而是回答您的目标,即如何突破 NAT 并远程 ssh 到您的 pi。

解决此问题的最简单方法是使用反向 ssh 隧道,尤其是使用 autossh 和基于密钥的身份验证的隧道。

这要求你有自己的服务器和一个 ssh 端口供 pi 调用(我使用一个只是坐在我的家庭网络上,找出你的公共 IP 地址,如果你愿意,可以注册一个免费的 ddns 帐户使用一个容易记住的 URL)。

准备好你的树莓派,最好是在你自己的家庭网络上使用你将继续使用的服务器(只需将运行 linux 的旧桌面或另一个 pi 连接到你的路由器并保持打开状态。我会假设您已将外部端口 30022 转发到服务器上的端口 22,在此示例中从您的家庭路由器)。您还将使用基于密钥的身份验证。

在你的 pi 上:

sudo apt-get install autossh
# Generate key
sudo -u pi ssh-keygen
# Copy key to your server (while you're on your home network with the server is easiest, but not necessary)
sudo -u pi ssh-copy-id -i /home/pi/.ssh/id_rsa.pub [serverUser]@[serverIP]

然后,如果您愿意,您需要另一个“配置文件”,放在您的主目录中的 pi 上。如果你愿意,就叫它 myConf.sh

#!/bin/bash
rSSHPort=31001 # you'll use a different port for each pi you connect to your server.  Make sure all these ports are forwarded on your home router to the server (port forward the range e.g. 31000-31100 would let you do 100 pi's)
# Phone Home
USER=pi # or whatever your pi user is named
KEY=/home/pi/.ssh/id_rsa
HOST=myServer.ddns.net # or whatever your server URL or public IP address is 
REMOTE_USER=serverUser # or the user you want your pi to connect to the server as
REMOTE_PORT=30022 # or whatever port you have forwarded to your server for ssh (don't use 22 as its even more of a security vulnerability). 

然后,您将拥有一个最终脚本,该脚本将实现对您的服务器的实际 ssh 回调。如果你愿意,可以称之为 connectServer.sh,并把它放在 /home/pi/ 中

#!/bin/bash
# Reverse Tunnel SSH in to server
# -f detach script from terminal
# -N no commands can be executed on server side
# -R reverse tunnel
# -p using server ssh port
# -i path to key file
# Source the Config File
source '/home/pi/myConf.sh'

connect()

        # TODO need to check that autoSSH isn't already in process list
        autoSSHProc=$( ps ax | grep autossh | wc -l )
        if [ "$autoSSHProc" -le "1" ]
        then
                log
                su -c "autossh -f -N -q -i $KEY -p $REMOTE_PORT -R $rSSHPort:localhost:22 $REMOTE_USER@$HOST -oControlMaster=no -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no" $USER
        fi


# Log connection details
log()

        datStr=$(date)
        echo "Connected system using autossh at " "$datStr" >> connection.log


connect

现在在你的 pi 上运行它

sudo ./connectServer

现在您想从笔记本电脑或您连接的任何设备通过 ssh 连接到您的服务器。

ssh [serverUser]@[serverIP] -p 30022

进入您的服务器后,您可以连接反向隧道

ssh pi@localhost -p 31001

瞧!

这是我到目前为止所使用的参考资料:

反向ssh转发:https://www.howtoforge.com/reverse-ssh-tunneling

使用 ssh 密钥设置服务器,传递给 pi 单位:http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/ 和http://jmatthews.us/blog/2013/02/18/rpi-dorm/

设置自动拨号主页:https://www.raspberrypi.org/forums/viewtopic.php?f=36&t=32077

【讨论】:

OP 已经提到使用反向隧道,但由于延迟不希望在那里有额外的路由。也许这个关于 SU 的问题有帮助:superuser.com/questions/827623/… 当然,但是 pagekite 本身显然是延迟问题的一部分。 5 年后,我仍在 100 多台设备上使用上述解决方案的变体。您的链接答案可能会有所帮助,但没有提供明确的工作示例。也许你可以写一篇@renyuneyun 分享好处? 其实我也在寻找解决方案。到目前为止,我的搜索告诉我尝试 UDP 隧道或类似的东西,可能是 IETF ICE(作为标准)。但是,我没有找到任何可以直接试用的应用程序。我上面提到的另一个问题似乎是仅针对 ssh 的专用解决方案(我还没有尝试过),但我正在考虑更通用的东西(否则我将回退到我当前的反向隧道,实际上是一样的和你一样)。

以上是关于如何在我的树莓派上使用 STUN/ICE 实现 NAT 遍历的主要内容,如果未能解决你的问题,请参考以下文章

电子在树莓派上不起作用

当在 Mysql 数据库服务器中触发触发器时,我可以在我的树莓派上运行 python 脚本吗?

在树莓派上安装 ROS 包

在树莓派上使用动作来解决网络摄像头流问题

如何在树莓派上禁用睡眠

树莓派上的 Qt OpenGL 上下文