内网穿透-SSH 反向代理

最近搬了新家,4个人合租,办了上海电信的 30MB 的光纤,说是 30MB,上行才 2MB,好在下行是实打实的 30MB,于是就准备把吃灰的树莓派找出来继续做下载机下电影美剧看。

之前在寝室住的时候,直接在路由器上拨号上网,有公网 IP,用的路由器可以做端口转发,配合 DDNS,可以很方便的从外面访问控制树莓派,但是现在这边搬的光纤,必须用电信『强制』租给我们一个光猫,押金200元,说好一年之后可以凭光猫退200块,但是之前来给我们办理网络的师傅说甭指望了,退不了的,我直接告诉他,退不了就去工信部投诉,合同上写好了可以退(其实我也没看合同上到底有没有写,不是我去办理的)。『强租』也就算了,拨号的账号密码都写在光猫里,不给我们,超级管理员密码也不知道,问电信的师傅,说他也不知道,导致我们不能用自己的光猫,这也引发了此片文章。

通过curl ip.cn看了下,电信还算良心给分配了公网 IP,然后电信『强租』的光猫还是一个路由器,有普通管理员账号密码,进去后发现有 DMZ 和虚拟主机配置(端口转发),然后尝试了配置 DMZ 和虚拟主机配置(端口转发),结果发现怎么都不生效,于是不得不放弃之。然后 Google 之,发现了关键字『SSH 反向代理』。

然后按照这里的配置进行配置,然而配置好了后,SSH 连接时,会给出下面错误

channel 2: open failed: connect failed: Connection refused  

又一次 Google 之,发现了这个,然而虽然没有解决我的问题,但是通过这个回答,我试了下把端口统一下

ssh -fCNR <port_b1>:localhost:22 usr_b@B.B.B.B  
ssh -fCNL "*:<port_b1>:localhost:<port_b1>' localhost  

注意上述,按照这里的配置,应该为

ssh -fCNR <port_b1>:localhost:22 usr_b@B.B.B.B  
ssh -fCNL "*:<port_b2>:localhost:<port_b1>' localhost  

当我按照这个配置,得到了错误,我就试了下把端口统一下,然后竟然成功了。但是按照文档,port_b2可以与port_b1不同,但我就是不能成功。

上述配置成功了,就可以从外面登陆到树莓派了

ssh -p <portb1> usra@B.B.B.B  

然而,因为网络的原因,ssh会断开,并且不会重连,虽然可以通过修改sshd_config配置修改连接时间,但是还是会断开。于是我就用supervisor来是ssh一直连接着。

这里需要注意以下几点:

  • 我去掉了-f参数,如果加上-fsupervisor就不能正常的监控ssh了;
  • ssh我双向配置了 key 登陆,所以就不用输入密码,supervisor可以自动启动ssh
  • 因为配置了 key 登陆,而我的supervisor是以root用户运行,所以需要在supervisor里指定user参数,使ssh可以正常读取到id_rsa,当然也可以用-i参数显示的指定id_rsa路径。

update

2016-06-02 对于 ssh 的自动重连,可以使用 autossh 配合 supervisor

并且 ssh 应该加上下列参数

-o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -o "StrictHostKeyChecking no"

不然,autossh 会『假死』

ServerAliveInterval的作用是当没有数据交互时,间隔一段时间给服务器发送一个message,并且接受服务器的响应

ServerAliveCountMax的作用是ServerAliveInterval最大重试次数,当失败了就会中断连接,这样 autossh 又能自动重连了

完整的的命令是

autossh -M 0 -q -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -o "StrictHostKeyChecking no" -CNR 2222:127.0.0.1:22 -i .ssh/id_rsa user@host  

本机连接到 host主机,并且在 host 上设置一个 127.0.0.1:2222的反向代理到本机