原理回顾

首先需要一台连接了公网的云服务器,然后我们要访问的内网穿透对象最好是Linux服务器,比如虚拟机,然后我们通过向云服务器发送指令,云服务器再将指定发送给指定对象,让其能够执行命令。 

总结就是:假设家里的机器就是我们的目标服务器,它首先会跟我们的云服务器进行通信,然后建立NAT转化表,这样我们的云服务器就能和家里的服务器进行通信了,这样我们在外边就可以直接跟我们的云服务器通信,然后在云服务器上通过特定的软件,将我们的请求转发到内网中的机器,这就是内网穿透。 也就是一个局域网内的主机可以访问另一个局域网内的主机了。

实操部分

环境配置 

首先推荐的软件叫做frp,可以在github上找到。

frp 下载:https://github.com/fatedier/frp/releases/tag/v0.58.1 

注意下载的版本(Linux 64位下)

另外 用远程登录 是sshd 端口号是22。 

 这里的虚拟机用的是 Ubuntu 22 64位。

 将下好的压缩包拖入到我们的云服务器上,用

tar xzf + 压缩包名

来解压好,并进入到解压后的文件夹内

其中有两个可执行程序,frpc表示是给客户端用的,frps是给云服务器用的。这个程序是用go写的

其中它俩各有一个.toml配置文件。

所以这个不仅云服务器得有,客户端也得有。

 另外在虚拟机这里,

建议把网络适配器改为NAT模式,因为我们的本地机器是Windows的,这样配置后,我们如果在虚拟机上网,那么本地的Windows就相当于路由器,它会履行一个路由器的职责,比如建立NAT转化表等。 这个结论可以在 虚拟机上 通过 ifconfig 来查看本机的IP地址

然后用本地的Windows去ping这个IP地址

发现是可以ping通的。反过来用虚拟机ping本地的也是可以的。

在Windows上,可以用

ipconfig

 

可以看到Windows给每一个虚拟机都构建了一个子网(我这里有两个虚拟机)。 

接着,简单说明了原理后,在Windows的cmd下,输入dir

 往下翻可以看到有一个Desktop的文件夹,这其实就是我们的桌面。类似 Linux下 pwd 和 ls 命令的结合。

我之前已经把frp压缩包放到桌面了,接着我们cd进去,然后再dir

就能看到这个压缩包了。

最后 用 scp命令,将文件拷贝到虚拟机上

scp frp_0.58.1_linux_amd64.tar.gz chika@192.168.233.132:/home/chika/test-frp

注意ip地址前加上 目的用户名 + @ ,ip地址后加上 : + 目的路径 

先输入 yes  再输入虚拟机用户的密码即可。

如果Ubuntu不行,用Centos也行

 

同样进行了解压就可以了。

在命令行上输入

ps ajx | grep sshd

 可以查看当前机器是否启动了 ssh服务。

关于配置文件和注意事项 

首先先看一下云服务这边的配置文件,云服务器下执行

vim frps.toml

 

这里面只有一项,就是云服务默认绑定的端口号

默认是7000,可以不改。假设我们给改成了 8080,并保存退出,然后直接执行 frps

这里我们发现它绑定的端口号还是7000,我们可以先看一下frps的启动方式

 ./frps -h

 

所以我们要想指定端口号启动,就要再加上 -c 配置文件名

./frps -c frps.toml

 查看一下

netstat -nltp

发现确实启动了。

#配置公网服务器上 frp 服务的 IP 与端口
serverAddr = "x.x.x.x"
serverPort = 8888
[[proxies]]
name = "ssh-serivce" #名称
type = "tcp" #代理类型
localIP = "127.0.0.1" #本地 IP
localPort = 22 #内网服务监听的端口
remotePort = 8081 #需要在公网服务器上监听的端口,
#其他人未来可以通过这个端口访问
我们的本地的 22 号服务
#也就是说 8081 端口会映射到 22 号

接着再来看看客户端的配置文件

 首先前两行是我们这个客户端要连接的服务器的IP地址和端口号,这是需要我们自行修改的。

比如改成这样

其中下面的name将来会显示在服务器那边,以提醒服务器是哪个客户端连上来了。 

这个 type = tcp就不用多说,说明使用的是tcp协议。这个localIP表示的是这个客户端对外提供ssh服务的IP,在客户端这里就是本地。因为服务器将请求转发给的是客户端的frpc进程,在这个进程内部其实还要进一步将请求转发到,比如这个机器的ssh服务上的,因此其实还有一次转发。

最后 这个 localPort和remotePort是一对映射关系,将来如果我们在外边想通过云服务器来访问本地的ssh服务的22端口,那么外边就得访问云服务器上的6000号端口,然后云服务器将其映射成22号端口号。

注意:不要将 云服务器bind的8080端口号和这里的6000搞混淆了,8080是客户端访问云服务器的,当我们的客户端将 ssh端口号及它的remotePort推送给云服务器后,云服务器会重新启动一个服务,再bind一个remotePort端口号, 以后用户只要访问remotePort就能访问到客户端了。

 开始连接访问 ssh

启动客户端

./frpc -c frpc.toml

 

我们发现服务器这边立马也多了些信息

 其中仔细查找就能发现之前修改的客户端的名字, ssh-server

此时在云服务器上用netstat查看一下

发现果然又多了一个端口号为 6000的frps的网络服务。 但是注意它们的PID是一样的,说明是进程内部绑定的。

到这里,我们的就可以开始测试了。用X-shell再创建一个会话,不过此时

主机名依旧是云服务的IP地址,不过此时的端口号不再是22了,而是之前在客户端配置好的6000.

 确定之后,并连接

这里我是用CentOS7作为客户端测试的。 

 然后输入 客户端的密码

接着就连接成功了

ll一下

 因为我的CentOS7客户端是带有图形化界面的,所以是这样的。

我们可以cd 到桌面,并创建一个test文件夹

再回到虚拟机的桌面

发现确实多了一个test文件夹。

nginx远程访问

这里在虚拟机上部署nginx用来测试web服务访问

首先先在虚拟机上进行安装

sudo yum install nginx # centos 安装
sudo apt install nginx # ubuntu 安装

#启动
$ nginx

#暂停
 nginx -s stop

#查看
ps ajx | grep nginx

 

再来看看它的端口号是多少

 发现端口号是80

说明是已经打开了,接着就再来配置客户端的frpc.toml

原来的信息可以不用删,因为frp支持多条连接访问服务器,然后由服务器暴露多个不同的端口给外界访问。

 改成这样即可

保存并退出后,再启动客户端

 发现多了一个 http-server

此时再看服务器这边

发现确实启动了两个服务,其中一个端口号是6000,另一个是6001

一个提供的是ssh服务,另一个提供的是web服务。

部署完成后,我们可以直接在打开我们本地的Windows浏览器,通过输入云服务器的公网 ip + 6001,可以直接访问到虚拟机上的网址

 

关于服务的后台启动并重定向

nohup ./frpc -c ./frpc.toml &> /dev/null &

nohup ./frps -c ./frps.toml &> /dev/null &
&> /dev/null :这是重定向操作,用于将命令的标准输出( stdout )和标准错误
stderr )都重定向到 /dev/null /dev/null 是一个特殊的设备文件,向它写入的内
容都会被丢弃,读取它则会立即返回文件结束。因此,这个操作的作用是忽略命令的
所有输出信息。

至此内网穿透测试完成。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部