树莓派作为服务器运作已经一天多了,使用期间感觉良好(自我感觉),之前用的是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端口在这里可以省略),就可以访问到内网树莓派上的资源了。至此,内网穿透成功实现。
大神,我的树莓派搭建s服务端后,客户端连接成功,但是打不开网页,无法上网。树莓派上安装的是qsyb的s-Python一键安装版,服务器IP为0.0.0.0,服务端口433,root权限下安装的。路由器不仅指定了树莓派为DMZ主机,还设置了443,80,8080等端口转发到树莓派的IP。但是连接后仍旧无法上网,请教大神这是哪儿的问题?
修复了评论邮件通知功能,以后回复评论应该会比较及时了
请教大神,我的树莓派架设s服务端后,客户端连接成功,但是打不开网页,无法上网。树莓派上安装的是qsyb的s-Python一键安装版。服务器IP设置为0.0.0.0来自动获取公网IP,服务端口433,root权限下安装的。路由器不仅指定了树莓派为DMZ主机,还设置了443,80,8080等端口转发到树莓派的IP,我用SSH可以远程连接上树莓派,且树莓派内置浏览器可打开网页。但是ss客户端连接后仍旧无法上网,请问大神这是哪里出了问题?
估计是电信运营商关闭了443,80和8080端口,你尝试更改一下服务端口到10000以上试试
你好,内网机器和外网机器已经建立了链接,端口是2222,正常说在外网机器ssh -p 2222 localhost这样可以登录内网机器,但是ssh_exchange_identification: Connection closed by remote host出现这个错误......./etc/ssh/sshd_config 里面的 gatewayport已经是yes 的....请问这个是什么问题~
之前没有遇到这个问题,所以我上网大概搜了一下,解决方法是修改/etc/hosts.allow文件,加入 sshd:ALL,修改完成后重启一下sshd服务,尝试一下是否可以连接。如果解决希望能告知我一下:)
想问下,这个反向代理能做到ip穿透吗? 就是C的外网IP和A的树莓派内网IP建立链接,而不是B的IP和树莓派建立连接。
如果A与C建立连接,相当于把C当作B来设置,在A上做设置时,C的ip需要固定,并且保持开机状态。然后你在C上访问A的80端口,直接访问127.0.0.1:80就可以了。理论上来说是这样,具体我没有测试过,你可以这样尝试一下。
连接拒绝那里有一点写错了,
/etc/ssh/ssh_config 错
/ etc/ssh/sshd_config 对
感谢指出,之前没有在意这两个文件的区别
可以,好用,感谢