利用云服务器+FRP实现内网穿透

yuanheci 2024年07月28日 273次浏览

想用外部主机ssh登录到宿舍笔记本上的WSL2上的虚拟机,于是找到了这个方法,亲测可行~

内网穿透原理:

  内网穿透,就是解决如何访问内网ip的技术,因为处于内网的设备可以借助NAT访问外网,却很难被外网设备有效访问,比如在内网部署了一个web服务,而外面的客户端根本不知道对应NAT的ip和端口好,也就无法访问。
  内网穿透就是通过对地址进行转换,将公共的网络地址转变为私有网络地址,采用一种路由的方式将一台有公网的计算机变成路由器的功能,实现了两个不同局域网下的计算机的沟通。
  不同的内网穿透工具实现的技术细节略有不同,内网穿透工具,包括一些知名的开源项目,比如frp、ngrok等,以及一些基于frp和ngrok的二次开发的商用产品,比如花生壳等。frp、ngrok是通过反向代理的方式,在公共端点和本地运行的 Web 服务器之间建立一个安全的通道,实现内网主机的服务可以暴露给外网。

参考博客:https://blog.engine.wang/posts/frp-notes/


内网穿透工具-FRP
接下来,我们就需要利用FRP实现ssh的内网穿透。具体操作可分为服务器端和客户端。

下载FRP
服务器端和客户端都需要下载FRP,以Ubuntu系统为例:
下载步骤:

 wget https://github.com/fatedier/frp/releases/download/v0.15.1/frp_0.15.1_linux_amd64.tar.gz
 tar xzvf frp_0.15.1_linux_amd64.tar.gz

云服务器端

具体步骤:
1.登录云服务器
2.下载FRP
3.解压后的文件夹内有服务端配置文件frps.ini,接着配置 frps.ini

[common]
bind_port = 7000 
默认配置中监听的是 7000 端口,可根据自己实际情况修改。

4.启动 FRP 服务端
命令行输入:./frps -c ./frps.ini,出现类似下图则表示开启成功
image-1722169392112


客户端

客户端简单来说就是你需要远程连接的服务器(我这里是WSL2的虚拟机)
具体步骤:
1.登录你的远程服务器,这里我是使用teamviewer远程连接直接操控服务器的
2.下载FRP
3.解压后的文件夹内有客户端配置文件 frpc.ini,接着配置 frpc.ini

[common]
server_addr = 192.144.200.235
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 2222
remote_port = 6000

接着启动 FRP 客户端
./frpc -c ./frpc.ini
image-1722169554358


连接指令

命令行输入:
ssh 主机用户名@云服务器公网IP地址 -p remote_port
例如:
ssh whale@111.111.111.11 -p 6000
然后输入密码即可连接,这里的密码指的是你远程服务器的密码,不是云服务器的密码。

后台运行

搭建好连接后,如果想要frp在后台运行可以执行:
服务端:nohup ./frps -c frps.ini >/dev/null 2>&1 &
客户端:nohup ./frpc -c ./frpc.ini >/dev/null 2>&1 &

想要终止进程的话,
先找到进程:
ps -ef | grep frp

kill -9 即可。


坑点

这里云服务器上端口需要打开,我这里一共是两个端口:7000-frps的运行端口,6000-WLS2由云服务器代理的端口。

由于我这里WSL2的sshd 22端口提示已被占用(应该是windows系统占用了),因此配置了2222端口。
/etc/ssh/sshd_config中配置,开启以下三项:
image-1722169879981

image-1722169891678

查看ssh服务状态,是否启动成功
service ssh status
如果显示sshd service is running字样就表明成功了!

windows上防火墙新建tcp规则,打开2222端口:
image-1722169960286