New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ssh内网穿透连接树莓派 #7

Open
ma6174 opened this Issue Aug 11, 2014 · 6 comments

Comments

6 participants
@ma6174
Owner

ma6174 commented Aug 11, 2014

为了不让树莓派继续在家吃灰,周末又拿出来折腾了一下。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 username@1.1.1.1

上面那个命令会将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 username@1.1.1.1
  1. 树莓派上启动autossh
$ autossh -M 5678 -fNR 2222:localhost:22 username@1.1.1.1
  1. 设置开机自动启动autossh

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

$ cat /etc/rc.local | grep autossh
su rpi -c "autossh -M 5678 -fNR 2222:localhost:22 username@1.1.1.1" &

这样树莓派只要开机就自动连接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

@bbiao

This comment has been minimized.

Show comment
Hide comment
@bbiao

bbiao Dec 8, 2014

ssh -f -N -R 2222:localhost:22 username@1.1.1.1

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

bbiao commented Dec 8, 2014

ssh -f -N -R 2222:localhost:22 username@1.1.1.1

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

@xiaoxiaoliang

This comment has been minimized.

Show comment
Hide comment
@xiaoxiaoliang

xiaoxiaoliang May 15, 2015

怎么手工断开ssh隧道?

怎么手工断开ssh隧道?

@ma6174

This comment has been minimized.

Show comment
Hide comment
@ma6174

ma6174 May 16, 2015

Owner

@xiaoxiaoliang

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

Owner

ma6174 commented May 16, 2015

@xiaoxiaoliang

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

@pynixwang

This comment has been minimized.

Show comment
Hide comment
@pynixwang

pynixwang Sep 1, 2015

😄吃灰。

😄吃灰。

@likebeta

This comment has been minimized.

Show comment
Hide comment
@likebeta

likebeta Oct 26, 2015

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

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

@1345472228

This comment has been minimized.

Show comment
Hide comment
@1345472228

1345472228 Mar 26, 2018

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment