手动部署并测试内网穿透(ssh 和 nginx)

原理回顾

首先需要一台连接了公网的云服务器,然后我们要访问的内网穿透对象最好是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 是一个特殊的设备文件,向它写入的内
容都会被丢弃,读取它则会立即返回文件结束。因此,这个操作的作用是忽略命令的
所有输出信息。

至此内网穿透测试完成。

相关推荐
勤奋的凯尔森同学1 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
丁卯4042 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo2 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
人间打气筒(Ada)4 小时前
MySQL主从架构
服务器·数据库·mysql
落笔画忧愁e5 小时前
FastGPT快速将消息发送至飞书
服务器·数据库·飞书
小冷爱学习!5 小时前
华为动态路由-OSPF-完全末梢区域
服务器·网络·华为
技术小齐5 小时前
网络运维学习笔记 016网工初级(HCIA-Datacom与CCNA-EI)PPP点对点协议和PPPoE以太网上的点对点协议(此处只讲华为)
运维·网络·学习
ITPUB-微风5 小时前
Service Mesh在爱奇艺的落地实践:架构、运维与扩展
运维·架构·service_mesh
落幕6 小时前
C语言-进程
linux·运维·服务器
chenbin5206 小时前
Jenkins 自动构建Job
运维·jenkins