blog icon indicating copy to clipboard operation
blog copied to clipboard

ssh内网穿透连接树莓派

Open ma6174 opened this issue 11 years ago • 6 comments

为了不让树莓派继续在家吃灰,周末又拿出来折腾了一下。apt-get升了个级,300M+的更新之后竟然没挂!可以继续折腾。。

家里电信宽带,路由器admin密码有待破解,在外网如何方便控制家里的树莓派成了一个问题。

目前有个小vps,可以作为中继连接树莓派,有几种方案选择:

1. 首选VPN

这个很简单,vps上搭建一个vpn,然后树莓派和控制端都连上vpn,那么树莓派和控制端就在同一个局域网内部了,可以直接ssh连接的。

网上找到这样的方法连vpn:sudo pptpsetup --create vpnname --server ip --username test --password test --encrypt --start,但是树莓派一执行这个命令就断网,原因未知,只能重启。

2. 通过ssh隧道

原理也很简单,假设vps地址是1.1.1.1,树莓派通过ssh连接到vps,同时将vps上某个端口比如1234映射到树莓派的ssh端口比如22,这样在vps上访问1234端口就相当于访问树莓派的22端口,命令很简单:

$ ssh -f -N -R 2222:localhost:22 [email protected]

上面那个命令会将vps上的2222端口映射到树莓派的22端口(ps:你也可以映射你感兴趣的其他端口^_^):

# lsof -i :2222
COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
sshd    16893 username   10u  IPv6 238723171      0t0  TCP localhost:2222 (LISTEN)
sshd    16893 username   11u  IPv4 238723172      0t0  TCP localhost.localdomain:2222 (LISTEN)
#
# telnet localhost 2222
Trying ::1...
Connected to localhost.localdomain.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u2
^]
telnet>

看起来这样就OK了,但是,如果树莓派的ssh因为某种原因断开了,我们就无法再控制了,因此我们需要让ssh断开之后自动重连,autossh是一个好选择,在树莓派开启ssh隧道需要这样做:

  1. 将树莓派的ssh public key 添加到vps

我们需要autossh自动连接,就需要让树莓派可以免密码ssh登陆vps,这样重连的时候可以自动连上:

$ ssh-copy-id [email protected]
  1. 树莓派上启动autossh
$ autossh -M 5678 -fNR 2222:localhost:22 [email protected]
  1. 设置开机自动启动autossh

假设上面的操作我们是在树莓派上用rpi这个账户

$ cat /etc/rc.local | grep autossh
su rpi -c "autossh -M 5678 -fNR 2222:localhost:22 [email protected]" &

这样树莓派只要开机就自动连接vps,我们就可以方便地控制和重启了。

上面提到,在vps上,2222这个端口实际上是在127.0.0.1上监听的,也就是说在外网是没法直接ssh的,我们可以通过以下方式来解决

1. 笨办法

ssh登上vps,然后再ssh -p 2222 rpi@localhost登陆树莓派

2. 将2222端口映射到外网

可以用iptables做端口映射,例如将vps的23端口映射到vps的2222端口

# iptables -t nat -A PREROUTING -p tcp --dport 23 -j REDIRECT --to-ports 2222

需要注意的是需要打开ip_forward功能:

# echo '1' > /proc/sys/net/ipv4/ip_forward

3. 配置客户端netstat转发

修改客户端的~/.ssh/config如下

$ cat ~/.ssh/config
Host vps
    Hostname 1.1.1.1
    User username

Host 127.0.0.1 rpi
    Hostname localhost
    Port 2222
    User rpi
    ProxyCommand ssh vps netcat -q 600 %h %p 2> /dev/null

保存之后首先测试 ssh vps可以正常登陆,然后确认vps上有安装netcat,接下来就可以ssh rpi来登陆树莓派了,如果ssh-copy-id之后是可以一键直接登陆的,还可以用scp来拷贝文件,非常方便。

接下来就是看看在树莓派上折腾点东西玩~

ps: 贴张树莓派的照片

http://ma6174.u.qiniudn.com/rpi_pic.jpg

ma6174 avatar Aug 11 '14 14:08 ma6174

ssh -f -N -R 2222:localhost:22 [email protected]

这个改成ssh -f -N -R 0.0.0.0:2222:localhost:22 [email protected],然后把/etc/ssh/sshd_config 里加上GatewayPorts yes,就能把2222绑定到0.0.0.0上,通过外网也能直接访问1.1.1.1的2222端口了

bbiao avatar Dec 08 '14 07:12 bbiao

怎么手工断开ssh隧道?

xiaoxiaoliang avatar May 15 '15 17:05 xiaoxiaoliang

@xiaoxiaoliang

首先 ps aux | grep ssh,能看到上面提到开启隧道的命令,kill掉就好了

ma6174 avatar May 16 '15 07:05 ma6174

😄吃灰。

pynixwang avatar Sep 01 '15 01:09 pynixwang

@bbiao 好像不行吧, 绑定的还是127.0.0.1

likebeta avatar Oct 26 '15 07:10 likebeta

@bbiao @likebeta 测试了,可以的。之前还用的frp,现在看来不用了

edgesider avatar Mar 26 '18 04:03 edgesider