使用ssh的反向隧道管理内网路由器
SSH协议真是了不得!
光是看标题,大家会看的云里雾里的,倾听老高细细道来!
起因
自从老高“下海”以后,就再也没有碰过家里的小米路由器了,国庆期间突然想把之前在路由器中远程下载的电影拿来看看。说着简单,实际操作起来,还是有一定难度的。
分析
完成这项任务,主要需要克服几个难点!
- 家里的IP是坑爹地10.0开头,也就是传说中的大局域网,几百个家庭使用一个公网IP上网,真是天朝的特色。
- 就算拿到了公网IP,经过老高的扫描,发现已经被封锁了所有端口,意思就是只能让你请求外部网络,无法直接对外提供服务,所以如何ssh到我的路由器呢?
- 就算是有公网IP,并且老天开恩,给你开了某一个端口,终于了一对外提供服务了,可是每次路由器重启,公网IP可能会变化,怎么样才能准确定位家里的路由器呢?
答:
第三个问题可以参考老高的小米路由器mini折腾之DDNS动态域名解析篇解决。
第一、二问题可以通过申请公网IP解决,老高也尝试过,开始联通只给我留了一个21端口,一个端口你说是给80还是ssh呢?虽然需要我二选一,但起码还是可以有一个端口用了。没想到过了一段时间,联通干脆直接封了所有端口,再问候完联通全家后,只能花钱买花生棒了。
花生棒确实能解决一些问题,但入手后发现我还是太嫩了,不要忘了无奸不商,贝锐这货再花生棒里也作了N多限制,总结一下就是,如果你没有继续花钱买服务,你只能:
- 使用他提供的域名做映射
- 只能创建2个端口映射
- 一个月2G上下行流量
哈哈,又一个坑爹货。既然花钱不成,咱们干脆直接用免费的得了,下面的篇幅主要是关于使用ssh的隧道技术再内网环境中打洞!
解决问题
有请我们今天的主角SSH上场。
原理
其实我们很早就使用SSH的隧道功能FQ了,它的数据流向如下:
你的机器 ----> 代理软件 ----> 本地代理 ----> 你的VPS
但是,今天我们需要实现的是:
你的机器 ----> 你的VPS ----> 你的内网机器
有点像nginx反向代理,我们操作VPS的时候就像操作我们内网的机器一样,SSH为我们提供了一个隧道,把请求都转发至内网机器。
需要什么
我们需要的元素如下:
- 会输入linux命令并懂一点网络的人
- 一台装好linux的VPS
- 目标机器为刷好openwrt的小米路由器
动手吧
VPS
首先,我们开启SSHD的GatewayPorts选项。
vim /etc/ssh/sshd_config
# 找到GatewayPorts选项,将其变为yes
# GatewayPorts yes
# 重启sshd服务
service sshd restart
路由器
首先使用各种办法登陆路由器后台,老高使用的是花生棒远程登录,如果你在路由器身边,那更好不过了!
然后我们看看路由器上ssh
的帮助信息:
[root@PandoraBox_E1BB:/root]#ssh -h
Dropbear SSH client v2014.63 https://matt.ucc.asn.au/dropbear/dropbear.html
Usage: ssh [options] [user@]host[/port] [command]
-p
-l
-t Allocate a pty
-T Don't allocate a pty
-N Don't run a remote command
-f Run in background after auth
-y Always accept remote host key if unknown
-y -y Don't perform any remote host key checking (caution)
-s Request a subsystem (use by external sftp)
-i (multiple allowed)
-A Enable agent auth forwarding
-L <[listenaddress:]listenport:remotehost:remoteport> Local port forwarding
-g Allow remote hosts to connect to forwarded ports
-R <[listenaddress:]listenport:remotehost:remoteport> Remote port forwarding
-W (default 24576, larger may be faster, max 1MB)
-K (0 is never, default 0)
-I (0 is never, default 0)
-J Use program pipe rather than TCP connection
-c Specify preferred ciphers ('-c help' to list options)
-m Specify preferred MACs for packet verification (or '-m help')
看起来很复杂很强大,其实我们的命令很简单:
假设VPS的IP为1.1.1.1,远程转发的端口号为11111(端口号最好高于1024,否则需要使用root权限),远程服务器的ssh端口为7777,登陆用户为username; 继续假设本地路由器需要转发的端口为22,路由器的在LAN中的IP地址为192.168.1.1。
当我们确认好了各个数字的意义后,就可以开始替换下面的命令了。
ssh -Nfg -R 11111:192.168.1.1:22 1.1.1.1 -p 7777 -l username
ps.这一步需要输入username的密码,如果想要加入开机脚本,记得配置ssh的公钥,让路由器变得可信。
当完成以上配置,我们在VPS上使用命令netstat -nlp|grep sshd
,就可以发现有两个监听端口号为11111的sshd进程,至此说明隧道搭建完毕!
测试
通过以上配置,我们在vps上建立了一个隧道,监听端口11111,并将此端口的数据映射到内网openwrt的路由器上,我们在外网使用一下命令即可完成登陆。
ssh [email protected] -p 11111
# 打印调试信息
ssh [email protected] -p 11111 -v
ssh -fN -R 1.1.1.1:10022:localhost:22 [email protected] 这个命令会不会好点?
最后一条命令说我输入的密码不对,输的难道不是vps的密码?
ssh -g -R 8080:localhost:80 root@host失败,connect_to localhost port 80:failed.
ssh -g -R0:localhost:8 试试
换成内网IP试试
不知道我理解的对不对 用这个教程可以在宿舍放一个潘多拉的小米路由mini 然后在家访问学校内网了?
是的啊
这个对我们高校学生太有用了
try一try吧, ngrok 和 n2n都可以打洞
好的,感谢指路
要做反向代理的话, ngrok 和 n2n 都可以一试
这两个需要再编译吧?
小米路由器不是有手机客户端吗?
小米mini马上停产了,青春版要硬件写入,加上小米的烂质量,请问高大师有没有别的好的路由推荐做自动翻墙的,潘多拉每个版本都不一样,有很多是坑,建议共研究
这两天广交会时间到了,没时间折腾,等广州回来寄个优酷路由宝给你,白送,就算测试,你写心得在Blog上就行,妥否,有小伙伴说那个东西里面的存储芯片8GB,真心高大上
你把路由器看成是一个小服务器后,刚才的那些都能实现,但是网速和性能是个问题!
我的下一个路由器应该是电磁炉了
可以啊!
8GB的Linux主机能玩很多东西了,但是外贸界有啥可玩?能做成反向VPS吗,国外同学想看国内的视频网站?还有就是能不能让美国的小朋友带去美国挂在宽带山做VPS吗?
我都刷成openwrt了
必杀
小米路由器买回来不杀就是定时炸弹
请问一下,执行完这句 ssh -Nfg -R 11111:192.168.1.1:22 1.1.1.1 -p 7777 -l username 会出现: ssh: Couldn't set SO_PRIORITY (Bad file descriptor) ssh: Exited: Error connecting: Connection refused 怎么办
是指GatewayPorts吗?改为yes了
这个防火墙说的是pc上的么?
服务器的
远程转发的端口号随便设 但是远程服务器的端口是ssh连接到服务器的那个端口对吧
防火墙开启了?
老高,还有一个问题需要麻烦您一下 搭建我已经搭建成功了 执行netstat -nlp|grep sshd会出现两个11111的端口号 但是我在外网用ssh连接并打印调试信息(ssh [email protected] -p 11111 -v)会出现以下内容,能麻烦您再帮忙诊断一下是什么问题吗 OpenSSH_6.9p1, LibreSSL 2.1.7 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 21: Applying options for * debug1: Connecting to xxx.xxx.xxx.xxx [xxx.xxx.xxx.xxx] port 11111. debug1: connect to address xxx.xxx.xxx.xxx port 11111: Connection refused ssh: connect to host xxx.xxx.xxx.xxx port 11111: Connection refused
hi,请问你是怎么解决的?我也是这个问题
哦哦 我好像明白你是什么意思了 我一会回去再试试
你映射的内网IP地址是多少
192.168.1.1
这个我知道,我换过了,然后提示的是这两句话
可以的
你的远程服务器能登陆上去不?
这个命令返回的是Error connecting: Connection refused,连接问题,看看你的端口号是不是弄错了?
这个命令是我随便写的,你需要替换成你实际使用的端口和用户名等信息
sorry 并没有解决