ssh端口转发内网到公网

概述

起因是想要在家里或者使用流量能够访问校园网抢课以及其他操作,路由器刷的华硕固件,正好有搭建 ss 服务器的功能。

百度一下大概的实现方式,大多都是采用 ngrok 或者花生壳内网穿透的方式,实际测试了一下,ngrok 免费的服务很难连接上且不稳定。花生壳直接是付费服务。自己搭建 ngrok 又需要一个域名。

结合专业知识,只需要将 ss 服务的端口转发到公网上就可以了,所以最终采用了 ssh端口转发+ss-server 的方式,不得不推一下,ssh端口转发真的很方便快捷 :P

ssh端口转发

1
2
3
4
5
ssh -NfR port_on_your_vps:192.168.123.1:80 username@*.*.*.*
-R 远程转发
-N ssh连接之后不执行命令
-f 验证密码之后再后台运行

这个有个坑点,在默认没有进行设置的情况下直接转发,在 vps 上反向代理的 lookup 的 ip 即 127.0.0.1,并不是公网 ip,在姜哥的指点下了解了这个点。

解决方法:
首先 ssh 登录到公网主机,修改 sshd 的配置文件 /etc/ssh/sshd_config,加入如下选项

GatewayPorts yes

然后重启 ssh 服务,service sshd restart

可以参照:http://www.netcan666.com/2016/09/28/ssh%E9%9A%A7%E9%81%93%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E5%86%85%E7%BD%91%E5%88%B0%E5%85%AC%E7%BD%91%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91/

每次登陆都需要设置密码太麻烦,设置免密登录

华硕固件中 ssh 服务采用的 Dropbear,没有 ssh-keygen,可用 dropbearkey 替代

dropbearkey -t rsa -f .ssh/id_dropbear_rsa | grep "ssh-rsa" > .ssh/id_dropbear_rsa.pub

生成公私匙,将公匙 id_dropbear_rsa.pub 上传到 vps,具体可以参照

https://my.oschina.net/u/2306127/blog/3027225

最后写了个脚本,然后设置了定时执行,舒服了。-i 参数指定的是 ssh 的私匙,这个要注意

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh
#copyright by Str3am
#kill掉全部ssh命令
logger -t "ssh端口转发" "结束ssh进程"
killall ssh
#转发后台
ssh -yNfR port_on_your_vps:192.168.123.1:80 username@*.*.*.* -i /etc/storage/.ssh/id_dropbear_rsa -K 1
#转发ss服务器端口
ssh -yNfR port_on_your_vps:192.168.123.1:2333 username@*.*.*.* -i /etc/storage/.ssh/id_dropbear_rsa -K 1
logger -t "ssh端口转发" "成功转发端口"

参考链接