内网穿透一些常见方式

Table of Contents

分类上分成3种

公网上的私人服务器作为中转 (以frp为例)

这是最推荐的做法,在公网中又一台自己的服务器,用服务器做中转。

下面是frp官方文档里的一个例子,简单得将本机一个22的ssh端口映射到公网服务器的6000端口上。这样只需要通过公网ip加上6000端口就可以连接到内网的机器上了。

frp服务端配置和启动

# frps.toml
bindPort = 7000
./frps -c ./frps.toml

客户端配置启动

  # frpc.toml
  serverAddr = "x.x.x.x"
  serverPort = 7000

[[  proxies]]
  name = "ssh"
  type = "tcp"
  localIP = "127.0.0.1"
  localPort = 22
  remotePort = 6000
./frpc -c ./frpc.toml

ssh连接

ssh -oPort=6000 test@x.x.x.x

上面这段demo的工作原理就是通过frpc去连接frps的7000端口 在两者之间建立双向通信。

然后frpc把本地的22端口和对远程7000端口的连接之间做映射,让7000端口进来的流量都转到本机的22端口上。frps则是通过frpc里的remotePort=6000的要求在远程暴露一个6000端口,然后把6000端口进来的流量转发到和7000端口建立的连接上,这样就可以达到内网穿透的效果了。

公网上的三方服务器(以cloudflared为例)

这是第二推荐的做法,用三方的免费服务,从原理上来讲,和上面用公网私人服务器做中转是类似的,并且在这些服务商还有性能、防D、自带域名这些优势。

但是相比自建server做中转,你不能保证流量是走国外的还是国内的,最关键的你还不能保证它未来会不会收费,以cloudflared临时穿透为例:

python3 -m http.server 8000
cloudflared tunnel #default localhost:8080
cloudflared tunnel --url localhost:7000

自己在出网设备上开端口(不推荐)

这是最不推荐的一种做法,主要是这种方式需要家里的运营商猫必须要有公网ip。但是目前很多运营商会在上游给你分配一个它们的内网ip,这就好像一个小区里大家共用一个路由器一样,你是没有权限操作那台路由器的。所以除非你向运营商去申请让自己的猫变公网ip,不然你是用不了这种内网穿透的方式。

先不说运营商的客服愿不愿意做(我以前问过移动的,不愿意帮你搞的),就算你获得了公网ip,后续你还要看看你的光猫是否支持对外网的端口映射功能。现在很运营商给的猫的系统都是受限制的,你只能通过猫的管理界面去看看网络是不是正常,有多少连接这些基本信息。

所以针对光猫的限制,你的解决方式只能把其改成桥接模式,让它变成一个交换机,只是将流量转发到你自己的路由器上,让自己的路由器去拨号。

这样一整套下来,你用了自己的路由器去拨号做端口映射,在自己的路由去上终于有了公网ip。但是还有一个问题就是,运营商分配的ip地址是经常会变化的,这导致你在外部网络要访问内部还需要提前知道运营商给你分配的ip是什么。

这时候你又得解决获取动态ip地址的方式,如果你不愿意用第三方,你得自己折腾怎么得知ip地址的方式。我以前的解决方式,就是在内网定时跑一个脚本上报ip到自己的一些私人账号里,然后通过账号里的信息查询。如果你要用第三方,国内的话又得去花生壳之类的这种三方服务,去这类服务商那里申请一个动态的域名,还得在路由器上设置DDNS的程序,才能获得一个稳定的域名访问自己的内部网络。

上面的这一些列操作,公网IP、光猫限制、动态ip的查询这一整套东西下来,就算对IT人员来说也是非常折腾的,所以我是非常不推荐这个做法的。