内网穿透名字听起来可能很夸张,但是原理还是比较简单的(互联网好像都这个尿性)
简单来说,就是提供一种外部访问内网设备的方式。由于ipv4中ip的个数有限,人们只对少量的设备设置有公网ip,对于路由器其内部的子网并不会分配一个公网ip,而是给一个内网ip。当内部设备需要访问外部时,会转化为路由器的ip+端口号的形式,也就是NAT。
内网穿透就是你一个内网设备连接上中间服务器(拥有公网 IP),并长时间保留这个链接。这样,外部设备访问这个中间服务器的特定端口,就等价于访问这个内网设备了。
之前自己琢磨过一个,即通过ssh连接上外部设备,再在控制的外部设备内再ssh连接上内部设备。现在想想这个方案还真挺不错的(bushi,问题就是普遍还需要多步操作,以及很多时候你是没办法获得这个外部设备控制权的。今天偶然刷到frp,那刚好就来试一试。
配置准备
准备:一个公网服务器,一个内部设备。
项目:https://github.com/fatedier/frp/releases/tag/v0.62.1
下载回来后设这样的文件夹。frpc是frp的client客户端,frps是frp的server服务端。因此如果系统需要下载不同的frp服务端和客户端代码。.toml是配置文件
客户端即为你的内网设备,想要被外网访问的设备。服务端为你的公网服务器。
对于后续部署可以按照 https://www.bilibili.com/video/BV1Jf421q7we 配置,不过我还是更建议用docker去配置。
配置过程
本来打算直接本地跑然后systemd的,但是发现docker太好用了,宝塔太好用了。
下载宝塔linux,下面是通用的下载脚本(好评!)
if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh 6dca892c
然后再docker模块里面,搜索frp,先安装服务端,在服务器上操作。
基本都可以全默认,但是记得修改下自己的frp用户名和frp服务器密码。
确保7500端口放开,然后可以ip:7500登录
然后进入如下界面,说明成功。
对于FRP客户端,同样的方式。
在docker中搜索frp,此时搜索客户端,填写frp服务端的公网ip。可以配置自己的账户密码。
配置好后,访问客户端ip:7400,输入自己的账户密码后,登录结果如下。
现在基本的配置已经完成,下面配置内网穿透。
打开frp client,在configure界面中,下面配置自己的代理,下面以ssh为例。
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
# remotePort 是服务端将通过哪个端口访问客户端的22端口
remotePort = 59022
把你需要配置的内容,放在[[proxies]]下,粘贴过去。一般ssh端口都是22,如果有过修改请麻烦调整为对于端口。
完成后,点击上面的upload,上传,此时在frp client的overview可以见到自己的配置
回到frp server,可以看到服务已经被注册上了
此时,你就可以通过两次ssh的方式简介连接到你的内网服务器了。
如果想要配置内网的服务,那么也可以参照如下,localport就是你内网的进程,完成后再上传一下
[[proxies]]
name = "kodbox"
type = "http"
# 这个是客户端某一个服务的端口,比如kodpod在内部服务器1111端口口上。
localPort = 1111
# customDomains 填写域名,这里演示直接填写服务端的IP,可以替换成域名,如:xxx.bt.cn
customDomains = ["149.88.82.191"]
配置完成,你可以通过访问我通过内网穿透访问我的kodpod:http://149.88.82.191:40800/
整点小活
ssh支持遂穿,即-L参数,可以把对应主机端口上的数据转发过来。那么实现两个功能,一当然是我们的vnc,试一试远控一下我们的主机,二是尝试用宝塔控制一下我们的主机。
ssh -L 5901:localhost:5901 root@149.88.82.191 -p 2222 // 连接服务器
ssh -L 5901:localhost:5901 djs@127.0.0.1 -p 59022 // 内网穿透
再vnc启动一下,好啦,点亮了。
可以合并一下操作
ssh -L 5901:localhost:5901 -J "root@149.88.82.191:2222" djs@127.0.0.1 -p 59022
很好啊很好,但是啊但是可以感受下速度(怎么背景p5的声音录进去了
总之娱乐效果很强(
对于宝塔linux,我内网端口在37548,也是类似的内网穿透一下后,也是轻轻松松访问上了。
如此一来出去玩也可以操作我的电脑啦(爽
最后整个远程写代码,这样就基本全部大功告成了。
我已经有一个远程的vscode了,很轻量级。不过由于是用docker部署的,因此文件内容也只可以看到局部一些。也许可以配置成全局,这个后面再说。
同理对于jetbrain,jetbrain需要的是ssh连接,那我们可以用前面的套路,内网穿透两次,运用-L把内部的ssh端口数据转发,接着,只需访问自己本机的22端口,即可完成远控🥰
ssh -L 22:localhost:22 root@149.88.82.191 -p 2222
ssh -L 22:localhost:2222 djs@127.0.0.1 -p 59022
最后修改一下,成功远控我们的内部服务器,且通过了遂穿加密十分安全🥰🥰
至此也算打通了桌面,文件,项目三重控制了,同时也暴露了需要的服务。以后来说,还真可以轻薄本出门,剩下全部远控了23333
后记
此时在我的终端上,直接显示的是我的内网设备(见下图)。这不禁让我有些好奇,我是直接连接上了内网的设备呢,还是通过服务器中转来的。
即,是:
我的设备 -> 中间服务器 -> 内网设备
还是:
我的设备 -> 内网设备
先查询登录信息,发现是我本地登录(笑
官方链接如下:https://gofrp.org/zh-cn/docs/overview
最终查询后发现应该是通过中间服务器转发而来的,如果需要直连还需要研究研究23333