原理回顾
首先需要一台连接了公网的云服务器,然后我们要访问的内网穿透对象最好是Linux服务器,比如虚拟机,然后我们通过向云服务器发送指令,云服务器再将指定发送给指定对象,让其能够执行命令。
总结就是:假设家里的机器就是我们的目标服务器,它首先会跟我们的云服务器进行通信,然后建立NAT转化表,这样我们的云服务器就能和家里的服务器进行通信了,这样我们在外边就可以直接跟我们的云服务器通信,然后在云服务器上通过特定的软件,将我们的请求转发到内网中的机器,这就是内网穿透。 也就是一个局域网内的主机可以访问另一个局域网内的主机了。
实操部分
环境配置
首先推荐的软件叫做frp,可以在github上找到。
frp 下载:https://github.com/fatedier/frp/releases/tag/v0.58.1
注意下载的版本(Linux 64位下)
另外 用远程登录 是sshd 端口号是22。
这里的虚拟机用的是 Ubuntu 22 64位。
将下好的压缩包拖入到我们的云服务器上,用
bash
tar xzf + 压缩包名
来解压好,并进入到解压后的文件夹内
其中有两个可执行程序,frpc表示是给客户端用的,frps是给云服务器用的。这个程序是用go写的
其中它俩各有一个.toml配置文件。
所以这个不仅云服务器得有,客户端也得有。
另外在虚拟机这里,
建议把网络适配器改为NAT模式,因为我们的本地机器是Windows的,这样配置后,我们如果在虚拟机上网,那么本地的Windows就相当于路由器,它会履行一个路由器的职责,比如建立NAT转化表等。 这个结论可以在 虚拟机上 通过 ifconfig 来查看本机的IP地址
然后用本地的Windows去ping这个IP地址
发现是可以ping通的。反过来用虚拟机ping本地的也是可以的。
在Windows上,可以用
bash
ipconfig
可以看到Windows给每一个虚拟机都构建了一个子网(我这里有两个虚拟机)。
接着,简单说明了原理后,在Windows的cmd下,输入dir
往下翻可以看到有一个Desktop的文件夹,这其实就是我们的桌面。类似 Linux下 pwd 和 ls 命令的结合。
我之前已经把frp压缩包放到桌面了,接着我们cd进去,然后再dir
就能看到这个压缩包了。
最后 用 scp命令,将文件拷贝到虚拟机上
bash
scp frp_0.58.1_linux_amd64.tar.gz chika@192.168.233.132:/home/chika/test-frp
注意ip地址前加上 目的用户名 + @ ,ip地址后加上 : + 目的路径
先输入 yes 再输入虚拟机用户的密码即可。
如果Ubuntu不行,用Centos也行
同样进行了解压就可以了。
在命令行上输入
bash
ps ajx | grep sshd
可以查看当前机器是否启动了 ssh服务。
关于配置文件和注意事项
首先先看一下云服务这边的配置文件,云服务器下执行
bash
vim frps.toml
这里面只有一项,就是云服务默认绑定的端口号
默认是7000,可以不改。假设我们给改成了 8080,并保存退出,然后直接执行 frps
这里我们发现它绑定的端口号还是7000,我们可以先看一下frps的启动方式
bash
./frps -h
所以我们要想指定端口号启动,就要再加上 -c 配置文件名
bash
./frps -c frps.toml
查看一下
bash
netstat -nltp
发现确实启动了。
bash
#配置公网服务器上 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
启动客户端
bash
./frpc -c frpc.toml
我们发现服务器这边立马也多了些信息
其中仔细查找就能发现之前修改的客户端的名字, ssh-server
此时在云服务器上用netstat查看一下
发现果然又多了一个端口号为 6000的frps的网络服务。 但是注意它们的PID是一样的,说明是进程内部绑定的。
到这里,我们的就可以开始测试了。用X-shell再创建一个会话,不过此时
主机名依旧是云服务的IP地址,不过此时的端口号不再是22了,而是之前在客户端配置好的6000.
确定之后,并连接
这里我是用CentOS7作为客户端测试的。
然后输入 客户端的密码
接着就连接成功了
ll一下
因为我的CentOS7客户端是带有图形化界面的,所以是这样的。
我们可以cd 到桌面,并创建一个test文件夹
再回到虚拟机的桌面
发现确实多了一个test文件夹。
nginx远程访问
这里在虚拟机上部署nginx用来测试web服务访问
首先先在虚拟机上进行安装
bash
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,可以直接访问到虚拟机上的网址
关于服务的后台启动并重定向
bash
nohup ./frpc -c ./frpc.toml &> /dev/null &
nohup ./frps -c ./frps.toml &> /dev/null &
&> /dev/null :这是重定向操作,用于将命令的标准输出( stdout )和标准错误
( stderr )都重定向到 /dev/null 。 /dev/null 是一个特殊的设备文件,向它写入的内
容都会被丢弃,读取它则会立即返回文件结束。因此,这个操作的作用是忽略命令的
所有输出信息。
至此内网穿透测试完成。