使用ssh的反向隧道管理内网路由器


SSH协议真是了不得!

pandorabox

光是看标题,大家会看的云里雾里的,倾听老高细细道来!

I. 起因

自从老高“下海”以后,就再也没有碰过家里的小米路由器了,国庆期间突然想把之前在路由器中远程下载的电影拿来看看。说着简单,实际操作起来,还是有一定难度的。

II. 分析

完成这项任务,主要需要克服几个难点!

  1. 家里的IP是坑爹地10.0开头,也就是传说中的大局域网,几百个家庭使用一个公网IP上网,真是天朝的特色。
  2. 就算拿到了公网IP,经过老高的扫描,发现已经被封锁了所有端口,意思就是只能让你请求外部网络,无法直接对外提供服务,所以如何ssh到我的路由器呢?
  3. 就算是有公网IP,并且老天开恩,给你开了某一个端口,终于了一对外提供服务了,可是每次路由器重启,公网IP可能会变化,怎么样才能准确定位家里的路由器呢?

答:

第三个问题可以参考老高的小米路由器mini折腾之DDNS动态域名解析篇解决。

第一、二问题可以通过申请公网IP解决,老高也尝试过,开始联通只给我留了一个21端口,一个端口你说是给80还是ssh呢?虽然需要我二选一,但起码还是可以有一个端口用了。没想到过了一段时间,联通干脆直接封了所有端口,再问候完联通全家后,只能花钱买花生棒了。

花生棒确实能解决一些问题,但入手后发现我还是太嫩了,不要忘了无奸不商,贝锐这货再花生棒里也作了N多限制,总结一下就是,如果你没有继续花钱买服务,你只能:

  1. 使用他提供的域名做映射
  2. 只能创建2个端口映射
  3. 一个月2G上下行流量

哈哈,又一个坑爹货。既然花钱不成,咱们干脆直接用免费的得了,下面的篇幅主要是关于使用ssh的隧道技术再内网环境中打洞

III. 解决问题

有请我们今天的主角SSH上场。

原理

其实我们很早就使用SSH的隧道功能FQ了,它的数据流向如下:

你的机器 ----> 代理软件 ----> 本地代理 ----> 你的VPS

但是,今天我们需要实现的是:

你的机器 ----> 你的VPS ----> 你的内网机器

有点像nginx反向代理,我们操作VPS的时候就像操作我们内网的机器一样,SSH为我们提供了一个隧道,把请求都转发至内网机器。

需要什么

我们需要的元素如下:

  1. 会输入linux命令并懂一点网络的人
  2. 一台装好linux的VPS
  3. 目标机器为刷好openwrt的小米路由器

IV. 动手吧

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 <remoteport>
-l <username>
-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 <identityfile>   (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 <receive_window_buffer> (default 24576, larger may be faster, max 1MB)
-K <keepalive>  (0 is never, default 0)
-I <idle_timeout>  (0 is never, default 0)
-J <proxy_program> Use program pipe rather than TCP connection
-c <cipher list> Specify preferred ciphers ('-c help' to list options)
-m <MAC list> 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 username@1.1.1.1 -p 11111

# 打印调试信息
ssh username@1.1.1.1 -p 11111 -v

标签: Linux, ssh, vps, openwrt, tunnel

本文由 老高 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。
可自由转载、引用,但需署名作者且注明文章出处。

相关文章

已有 34 条评论

  1. makarov135 makarov135

    最后一条命令说我输入的密码不对,输的难道不是vps的密码?

  2. 200 200

    ssh -g -R 8080:localhost:80 root@host失败,connect_to localhost port 80:failed.

    1. sai sai

      ssh -g -R0:localhost:8 试试

    2. 换成内网IP试试

  3. 风刃 风刃

    不知道我理解的对不对 用这个教程可以在宿舍放一个潘多拉的小米路由mini 然后在家访问学校内网了?

    1. 是的啊

    2. 风刃 风刃

      这个对我们高校学生太有用了

    3. try一try吧, ngrok 和 n2n都可以打洞

    4. 风刃 风刃

      好的,感谢指路

  4. 要做反向代理的话, ngrok 和 n2n 都可以一试

    1. 这两个需要再编译吧?

  5. 小米路由器不是有手机客户端吗?

    1. Yacyin Yacyin

      小米mini马上停产了,青春版要硬件写入,加上小米的烂质量,请问高大师有没有别的好的路由推荐做自动翻墙的,潘多拉每个版本都不一样,有很多是坑,建议共研究

    2. Yacyin Yacyin

      这两天广交会时间到了,没时间折腾,等广州回来寄个优酷路由宝给你,白送,就算测试,你写心得在Blog上就行,妥否,有小伙伴说那个东西里面的存储芯片8GB,真心高大上

    3. 你把路由器看成是一个小服务器后,刚才的那些都能实现,但是网速和性能是个问题!

    4. 我的下一个路由器应该是电磁炉了

    5. 可以啊!

    6. Yacyin Yacyin

      8GB的Linux主机能玩很多东西了,但是外贸界有啥可玩?能做成反向VPS吗,国外同学想看国内的视频网站?还有就是能不能让美国的小朋友带去美国挂在宽带山做VPS吗?

    7. 我都刷成openwrt了

    8. 必杀

    9. Yacyin Yacyin

      小米路由器买回来不杀就是定时炸弹

  6. 风刃 风刃

    请问一下,执行完这句 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 怎么办

    1. 风刃 风刃

      是指GatewayPorts吗?改为yes了

    2. 这个防火墙说的是pc上的么?

    3. 服务器的

    4. 风刃 风刃

      远程转发的端口号随便设 但是远程服务器的端口是ssh连接到服务器的那个端口对吧

    5. 防火墙开启了?

    6. 风刃 风刃

      老高,还有一个问题需要麻烦您一下 搭建我已经搭建成功了 执行netstat -nlp|grep sshd会出现两个11111的端口号 但是我在外网用ssh连接并打印调试信息(ssh username@xxx.xxx.xxx.xxx -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

    7. 前任小米员工甲 前任小米员工甲

      hi,请问你是怎么解决的?我也是这个问题

    8. 风刃 风刃

      哦哦 我好像明白你是什么意思了 我一会回去再试试

    9. 你映射的内网IP地址是多少

    10. 风刃 风刃

      192.168.1.1

    11. 风刃 风刃

      这个我知道,我换过了,然后提示的是这两句话

    12. 风刃 风刃

      可以的

    13. 你的远程服务器能登陆上去不?

    14. 这个命令返回的是Error connecting: Connection refused,连接问题,看看你的端口号是不是弄错了?

    15. 这个命令是我随便写的,你需要替换成你实际使用的端口和用户名等信息

    16. 风刃 风刃

      sorry 并没有解决

添加新评论