树莓派作为服务器运作已经一天多了,使用期间感觉良好(自我感觉),之前用的是noip.com提供的ddns动态域名转发服务,在局域网内访问动态域名没有任何问题,但是地址发给朋友访问时却出了问题,一番搜寻之后得出结果,这应该是运营商封锁了家用宽带的大部分端口,避免用户在家里直接运行服务器。于是就打算寻找其他方式穿透内网访问树莓派的服务。树莓派是Linux系统,而我正好有一台小内存公网VPS,这样用Shell做端口转发在合适不过。
关于端口短发的原理和Shell的具体使用方法,这里写的非常详尽,我也是花了时间阅读了该文章才略懂皮毛,我将此文上传以供不能访问的人下载阅读。
下载:SHELL转发实战
首先我的设备有三个,A为内网中的树莓派,B为公网中小内存VPS,C为我随处上网需要访问树莓派的电脑。
设置内网服务器(A树莓派)
在A(树莓派)中运行
ssh -NfR 80:127.0.0.1:80 root@[B的公网IP] -p [B的ssh端口]
这里的第一个80前面其实省略了一个*,完整的写法应该是
ssh -NfR *:80:127.0.0.1:80 root@[B的公网IP] -p [B的ssh端口]
第一个*:80
对应的B的监听地址和端口,如果设置为127.0.0.1:80
,则只能通过本机访问 第二个127.0.0.1:80
对应的是A中服务的地址和端口,比如这里是我在树莓派里搭建的一个http web服务 最后跟着的是访问B的账号,登陆地址和端口,用于登陆验证用
这一行命令就完成了将树莓派A中的80端口转发到了B上。
设置中转服务器(B公网VPS)
接下来设置公网服务器,前一步完成后,登陆B后,如果B里安装了浏览器,就可以直接访问http://localhost浏览A(树莓派)的http web服务了。但是为了我们从任意一台电脑访问到,需要在B中将映射(转发,端口映射就是端口转发)的端口设置为外网可访问。
打开/etc/ssh/ssh_config,在其中加上
GatewayPorts yes
如果已经存在,将no改为yes,重启ssh服务
service ssh restart
完成B上的设置。
从任意客户端电脑上访问(C任意电脑)
这时无需说明了,直接访问[B的ip或域名]:80(80端口在这里可以省略),就可以访问到内网树莓派上的资源了。至此,内网穿透成功实现。