我不是直接回答您的 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