5

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

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

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

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

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

4

1 回答 1

2

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

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

这要求您拥有自己的服务器和 ssh 端口以供 pi 调用(我使用一个只是坐在我的家庭网络上的服务器,找出您的公共 IP 地址,如果您想使用,请注册一个免费的 ddns 帐户令人难忘的网址)。

准备好你的树莓派,最好是在你自己的家庭网络上使用你将继续使用的服务器(只需将运行 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-复制 ID/http://jmatthews.us/blog/2013/02/18/rpi-dorm/

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

于 2015-05-02T21:15:57.053 回答