概述

  • 如何让任何地方都能访问自己家里的笔记本上的应用?
  • 如何让局域网的服务器可以被任何地方访问到?

有很多类似的需求,我们可以统一用一个解决方案:内网穿透。下面介绍几种内网穿透的方式,供大家学习和参考。
每一种工具只要亲自试了都会更新成一篇文章,给出教程,没有试的会给简单的介绍和工具信息。

工具介绍

  • Ngrok
  • Ssh、autossh
  • Natapp
  • Frp
  • Lanproxy
  • Spike
  • 花生壳

Ngrok

  • 项目主页:https://ngrok.com/
  • 项目介绍: 一个通过任何NAT或防火墙为您的本地主机服务器提供即时访问、安全的URL的命令。类似花生壳,分为服务端和客户端,也可以自己搭建服务端。
  • 使用教程:点击跳转

Ssh

配合autossh工具使用,因为autossh会容错

  • 项目主页:http://www.harding.motd.ca/autossh/
  • 项目介绍:自动重新启动SSH会话和隧道。autossh是一个程序,用于启动ssh的副本并进行监控,在死亡或停止传输流量时根据需要重新启动它。 这个想法来自rstunnel(Reliable SSH Tunnel),但是在C中实现。作者的观点是,它不像匆匆忙忙的工作那么容易。使用端口转发环路或远程回显服务进行连接监视。在遇到连接拒绝等快速故障时,关闭连接尝试的速度。在OpenBSD,Linux,Solaris,Mac OS X,Cygwin和AIX上编译和测试; 应该在其他BSD上工作。免费软件。
  • 使用教程:点击跳转

Natapp

  • 项目主页:https://natapp.cn/
  • 项目介绍:基于ngrok的国内收费内网穿透工具,类似花生壳,有免费版本,比花生壳好。免费版本:提供http,https,tcp全隧道穿透,随机域名/TCP端口,不定时强制更换域名/端口,自定义本地端口

Frp

  • 项目主页:https://github.com/fatedier/frp
  • 项目介绍:frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

Lanproxy

  • 项目主页:https://github.com/ffay/lanproxy
  • 项目介绍:lanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿透工具,目前仅支持tcp流量转发,可支持任何tcp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面…)。目前市面上提供类似服务的有花生壳、TeamView、GoToMyCloud等等,但要使用第三方的公网服务器就必须为第三方付费,并且这些服务都有各种各样的限制,此外,由于数据包会流经第三方,因此对数据安全也是一大隐患。

Spike

  • 项目主页:https://github.com/slince/spike
  • 项目介绍:Spike是一个可以用来将你的内网服务暴露在公网的快速的反向代理,基于ReactPHP,采用IO多路复用模型。采用Php实现。

花生壳

  • 项目主页:https://hsk.oray.com/
  • 项目介绍:商业化比较成功的内网穿透。个人开发很不推荐,收费贵,企业可以考虑使用。

如何通过SSH让外网访问内网呢?

我们有服务器internal(内网服务器)和一个外网能访问的服务器external。怎么让内网的服务器也能够被外网访问呢?我们可以通过external来做中转。

准备

  • 内网服务器,可以访问外网:internal
  • 外网服务器:external

原理

ssh工具是一个非常强大的工具,除了能够远程连接,还能建立隧道,转发端口。利用这个特性就可以把外网的端口请求,连接到内网端口。ssh本身的连接并不稳定,借助工具autossh可以很稳定的建立隧道,因为失败或者其他网络情况下,autossh会自动维护和保持连接。

安装

  • 安装autossh
    1)下载:http://www.harding.motd.ca/autossh/
    2)安装
$ wget http://www.harding.motd.ca/autossh/autossh-1.4f.tgz
$ gunzip -c autossh-1.4f.tgz | tar xvf -
$ cd autossh-1.4f
$ ./configure
$ make && make install

建立连接

第一步:连接内网到远程

autossh -M 60102 \
-fN -o "PubkeyAuthentication=yes" \
-o "StrictHostKeyChecking=false" -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" \
-R localhost:60002:localhost:10110 \
-p 2222 [email protected]

这一段命令的意思就是把internal内网端口10110连接到external:yangqiang.im的60002端口,external:yangqiang.im的ssh端口是2222,autossh数据监听端口是60102,-o 的参数和ssh的-o是一致的。

点击查看参数详情

  • -M <端口> [:echo_port] 指定要使用的基本监听端口,或者指定echo端口。
    • 当没有指定接收端口时,echo端口号就是监听端口号临近的端口(端口+1)要保证这个这个端口没有被占用。使用:autossh将在基本监控中发送测试数据端口,并在上面的端口上接收它。例如,如果你指定“-M 20000”,autossh将设置为可以在端口20000上发送数据并在20001上接收它。
    • 另外,远程echo端口可能是指定的。如果你想使用标准的inetd echo服务,这个端口这应该是7。当指定了echo端口时,只会使用指定的监听端口,并且它监听接收和发送的双向消息。
    • 很多人禁用了echo服务,甚至禁用了inetd,因此请检查此服务是否可用于远程机。有些操作系统允许用户指定服务只监听本地主机(环回接口),这足以满足这种用途。
    • echo服务也可能更复杂一些:也许是监听一组ssh隧道的守护进程。
    • -M 0将关闭监控,并且autossh只有在ssh退出的时候才会重启ssh。
    • 例如,如果使用的是最新版本的OpenSSH,那么不妨探索一下使用ServerAliveInterval和ServerAliveCountMax选项让SSH客户端退出的时候,发现自己不再连接到服务器。在许多方面这可能是比监控端口更好的解决方案。
  • -f 在运行ssh之前让autossh后台运行。-f标志从传递给ssh的参数中剥离。 请注意ssh的-f与autossh的-f之间的关键区别:使用autossh时,ssh将 无法 使用密码或密钥。 当使用-f时,starting gatetime(请参阅AUTOSSH_GATETIME)将设置为0。

第二步,把外网访问流量连接到external监听端口

ssh -p 2222 -fNTCL *:80:localhost:60002 localhost

这一段命令的意思就是把external外网机的80端口流量转发到本机external的60002上面。因为60002是和internal的10110连接的,所以现在可以直接通过外网80端口访问到内网的10110。