通过ssh动态端口转发共享校园资源(附带干货)
By 苏剑林 | 2016-03-07 | 36146位读者 |众所周知,校园网最宝贵的资源应该有两样:一是IPv6,IPv6是访问Google等网站的最理想途径,当然IPv6并非所有高校都有;二是论文库,一般高校都会买了一部分论文库(知网、万方等)的下载权,供校园用户使用。如果说访问Google还有VPN等诸多方式的话,那么对于校外用户来说访问知网等资源就显得格外宝贵了,一般只是叫校内用户下载,或者就只能付费了(那个贵呀!)。
站长还是学生,在学校同时享用着IPv6和论文库资源,确实很爽。自从用上Openwrt的路由之后,一直想着怎么把校园网资源共享出去。曾经考虑过搭建PPTP VPN,但是感觉略有复杂(当然,跟其他VPN相比,搭建PPTP VPN算是非常简单的了,可是我还是不怎么喜欢。),而且当时还没解决内网穿透的问题。最近借助ssh反向代理的方式实现了内网穿透,继而认识到,通过ssh动态端口转发,居然还可以搭建代理,并且实现远程访问内网(校园网)资源,而且几乎不用在路由器本身上面做任何配置。不得不说,ssh真是一个极其强大的东西呀。
添加普通帐号 #
既然要共享,就没理由把root账户都分享出去了,因此,第一步要实现的是在Openwrt上添加一个代理账号,而且为了安全和保密,这个账号不允许真的登陆服务器进行操作,而只允许进行端口转发。
首先通过下面的命令安装useradd:
opkg update
opkg install shadow-useradd
安装好之后,通过下面的命令添加guest账户:
useradd guest
然后编辑/etc/passwd,最后一行应该类似
guest:x:1000:1000::/home/guest:
补全为
guest:x:1000:1000::/home/guest:/bin/false
然后在/etc/shells添加一行
/bin/false
至此,代理账号添加完毕,接着可以通过passwd guest修改密码。这个账号必须要通过ssh -N模式操作,即不执行任何远程命令,如果直接ssh,是会登陆失败的。
动态端口转发 #
所谓动态端口转发,就是在本地通过ssh连接到路由器后,然后就可以在本地建立起一个sock代理,虽然这个代理在本地,但是它会将本地的请求发到路由器中,路由器请求并返回结果后,又传回本地;通过这个代理,就可以实现目的了。
如果在Linux或者Mac OS中,只需要一行代码就可以实现动态端口转发,建立起本地的sock代理了:
ssh -ND 7070 guset@1.1.1.1 -p 22222 -v
刚才已经说过,-N是必须的,然后D参数用来指定监听的端口。最后的-v是打开调试模式,也就是说打印出一些数据流,如果不加v参数,那么是没有任何输出的。(有些朋友会觉得看不到任何输出就觉得不踏实。^_^)
建立了sock代理之后,直接在浏览器中设置相应的代理即可,注意要使用sock5代理,不要错选了http~。用sock4也可以,只是sock4不支持IPv6,如果用sock4的话,IPv6资源就没法访问了。如果是谷歌浏览器,可以使用SwitchyOmega、SwitchySharp或者“智能代理”之类的插件,便于切换代理,其他浏览器请自行寻找解决方案,据我所知,目前所有主流浏览器都可以很方便设置sock代理。确定设置代理成功后,可以看看能不能打开baidu.com,并且在搜索框输入ip,看看自己的ip有没有变成远程路由的ip。
在Windows中,第二步是一样的,不同的是第一步。由于Windows没有现成的ssh客户端,因此需要下载安装。可能说到Windows下的ssh工具,很多人都会想到putty,但事实上它还有一个更好用的命令行版本——plink,plink的用法和参数跟unix下的ssh类似,甚至更好用(它可以指定登陆密码实现自动登录,而ssh不行,除非你安装sshpass。)。在plink.exe中,只要执行以下命令
plink -N -D 7070 guset@1.1.1.1 -P 22222 -pw 123456 -v
最后的pw参数是用来指定密码的,这里假设为123456。要注意,这里指定端口的P是大写的。
为什么不用putty?网上很多教程说用putty建立代理,但是我并没有找到putty中对应-N模式的选项,因此putty在这种情况下是无效的。事实上,很多网上的ssh代理,都是通过类似的方法,关闭了远程命令的执行权,因此只好通过plink了。
sshuttle #
最后,要提一提的是,已知ssh帐号的另外一种解决方案是sshuttle,这是一个建立在ssh上的vpn程序,它直接实现了vpn功能,而不用设置代理。不过它是基于python的,并且只能在Linux或者Mac OS上使用。有兴趣的朋友可以自行探索。
校园网共享 #
到这里为止,如果浏览器使用所建立的代理,那么应该可以正常访问Google、万方、知网(如果还不行,尝试在登录那里选择ip登录),并且可以在论文库免费下载论文了。
这才是最强大的科学上网服务器!
无敌的ssh啊!
更多内容,请访问:http://bbs.spaces.ac.cn/topic/show/15
转载到请包括本文地址:https://spaces.ac.cn/archives/3651
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Mar. 07, 2016). 《通过ssh动态端口转发共享校园资源(附带干货) 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/3651
@online{kexuefm-3651,
title={通过ssh动态端口转发共享校园资源(附带干货)},
author={苏剑林},
year={2016},
month={Mar},
url={\url{https://spaces.ac.cn/archives/3651}},
}
June 4th, 2016
putty是可以的吧,我一直使用的。博主,以你的技术,自己实现一个vpn,或者用socks协议实现一个代理服务器也不是难事吧。
python代码不到百行。
putty有-D模式吗?写这篇文章的时候,我还不会写代理。而且,用ssh原因之一是它的通用性~