Linux下使用Shell端口转发与内网穿透访问内网服务器

软件应用 2014-10-02

树莓派作为服务器运作已经一天多了,使用期间感觉良好(自我感觉),之前用的是noip.com提供的ddns动态域名转发服务,在局域网内访问动态域名没有任何问题,但是地址发给朋友访问时却出了问题,一番搜寻之后得出结果,这应该是运营商封锁了家用宽带的大部分端口,避免用户在家里直接运行服务器。于是就打算寻找其他方式穿透内网访问树莓派的服务。树莓派是Linux系统,而我正好有一台小内存公网VPS,这样用Shell做端口转发在合适不过。

关于端口短发的原理和Shell的具体使用方法,这里写的非常详尽,我也是花了时间阅读了该文章才略懂皮毛,我将此文上传以供不能访问的人下载阅读。

下载:SHELL转发实战

首先我的设备有三个,A为内网中的树莓派,B为公网中小内存VPS,C为我随处上网需要访问树莓派的电脑。

设置内网服务器(A树莓派)

在A(树莓派)中运行

ssh -NfR 80:127.0.0.1:80 [email protected][B的公网IP] -p [B的ssh端口]

这里的第一个80前面其实省略了一个*,完整的写法应该是

ssh -NfR *:80:127.0.0.1:80 [email protected][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端口在这里可以省略),就可以访问到内网树莓派上的资源了。至此,内网穿透成功实现。


本文由 surenkid 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

10 条评论

  1. shenke
    shenke

    大神,我的树莓派搭建s服务端后,客户端连接成功,但是打不开网页,无法上网。树莓派上安装的是qsyb的s-Python一键安装版,服务器IP为0.0.0.0,服务端口433,root权限下安装的。路由器不仅指定了树莓派为DMZ主机,还设置了443,80,8080等端口转发到树莓派的IP。但是连接后仍旧无法上网,请教大神这是哪儿的问题?

    1. surenkid
      surenkid

      修复了评论邮件通知功能,以后回复评论应该会比较及时了

  2. shenke
    shenke

    请教大神,我的树莓派架设s服务端后,客户端连接成功,但是打不开网页,无法上网。树莓派上安装的是qsyb的s-Python一键安装版。服务器IP设置为0.0.0.0来自动获取公网IP,服务端口433,root权限下安装的。路由器不仅指定了树莓派为DMZ主机,还设置了443,80,8080等端口转发到树莓派的IP,我用SSH可以远程连接上树莓派,且树莓派内置浏览器可打开网页。但是ss客户端连接后仍旧无法上网,请问大神这是哪里出了问题?

    1. surenkid
      surenkid

      估计是电信运营商关闭了443,80和8080端口,你尝试更改一下服务端口到10000以上试试

  3. Alan
    Alan

    你好,内网机器和外网机器已经建立了链接,端口是2222,正常说在外网机器ssh -p 2222 localhost这样可以登录内网机器,但是ssh_exchange_identification: Connection closed by remote host出现这个错误......./etc/ssh/sshd_config 里面的 gatewayport已经是yes 的....请问这个是什么问题~

    1. surenkid
      surenkid

      之前没有遇到这个问题,所以我上网大概搜了一下,解决方法是修改/etc/hosts.allow文件,加入 sshd:ALL,修改完成后重启一下sshd服务,尝试一下是否可以连接。如果解决希望能告知我一下:)

  4. 外来人
    外来人

    想问下,这个反向代理能做到ip穿透吗? 就是C的外网IP和A的树莓派内网IP建立链接,而不是B的IP和树莓派建立连接。

    1. surenkid
      surenkid

      如果A与C建立连接,相当于把C当作B来设置,在A上做设置时,C的ip需要固定,并且保持开机状态。然后你在C上访问A的80端口,直接访问127.0.0.1:80就可以了。理论上来说是这样,具体我没有测试过,你可以这样尝试一下。

  5. hello
    hello

    连接拒绝那里有一点写错了,
    /etc/ssh/ssh_config 错
    / etc/ssh/sshd_config 对

    1. surenkid
      surenkid

      感谢指出,之前没有在意这两个文件的区别

添加新评论