我不直接回答你的STUN/ICE问题,而是回答你的目标,即如何突破NAT并远程ssh到您的树莓派。
最简单的解决方法是使用反向ssh隧道,特别是使用autossh和基于密钥的身份验证。
这需要您拥有自己的服务器,并在某个地方具有一个用于pi呼叫的ssh端口(我使用一个只需坐在家庭网络上的服务器,找出您的公共IP地址,如果您想使用易记URL,请注册免费的ddns帐户)。
准备您的树莓派,最好在您自己的家庭网络中与您将要保留和使用的服务器一起(只需连接运行Linux或其他pi的旧台式机到路由器并保持开启即可。对于此示例,我假设您已将外部端口30022转发到您家庭路由器上的服务器的22端口)。您还将使用基于密钥的身份验证。
在您的树莓派上:
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]
如果您愿意,您可以在树莓派的主目录中创建另一个名为myConf.sh的“配置文件”。
rSSHPort=31001
USER=pi
KEY=/home/pi/.ssh/id_rsa
HOST=myServer.ddns.net
REMOTE_USER=serverUser
REMOTE_PORT=30022
您需要一个最终的脚本来实现与服务器的SSH连接。如果您愿意,可以将其命名为connectServer.sh,并将其放置在/home/pi/目录中。请注意,此脚本将执行实际的SSH调用。
#!/bin/bash
source '/home/pi/myConf.sh'
connect()
{
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()
{
datStr=$(date)
echo "Connected system using autossh at " "$datStr" >> connection.log
}
connect
现在将其运行在你的树莓派上。
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