更多博客:香蕉粗的黄鳝
大家好,我是一根甜苦瓜。
今天来分享如何用内网穿透工具(frp)将家里闲置的电脑用起来。解除家里局域网的封印,让家里的电脑可以被外网任何地方访问。
人要做某一件事,需要一个作案动机,而我今天要做的事情,来源于这么一个需求:
我有一台Mac,随身携带,是办公娱乐的主力军。我家里有一台闲置的笔记本(联想小新),他安装了Ubuntu系统,同时我还还买了一台云服务器,上面搭建了我的博客,以及一些数据库啥的。
现状就是我的Mac或者联想小新随时都可以连上我的云服务器,而我的Mac如果想连上联想小新,除非他们两在同一个局域网内,否则是不可能的。
画图分析一波,damn it !这么一看不合理啊,我A能连上B,C也能连上B,为啥A就不能直接连上C了呢?为何不用B作为中转站呢?有道理!所以我想到了frp。
frp介绍
frp是一个开源免费的快速反向代理工具,可以帮助我们实现内网穿透,让我们的内网设备可以被外网访问。
其实他就是一个中转站,外网的请求打到云服务器上的frpc server上,然后再由frpc server将网络请求转发到内网的frpc client上,从而实现外网可以访问局域网内部的服务器。
有关更多
frp的细节可以去阅读官方文档,本文主要做一个简单的使用介绍。
github地址 : github.com/fatedier/fr…- 完整的中文文档: gofrp.org/zh-cn/
2. 安装frp Server
从上面的介绍不难看出,我们需要有一台云服务器,并且在云服务器上安装frp server服务端,然后在内网机器上(联想小新)安装frp client客户端。通过frpc server + frpc client的通力合作实现内网穿透。
下面来看看如何安装frp服务端。
1. 云服务器安装frp Server
首先去 github 上下载对应的安装包: github.com/fatedier/fr… (直接找最新版本下载就好了)
由于我的云服务器是Ubuntu系统,所以我下载的是frp_xxx_linux_amd64.tar.gz,下载完成后,我们将其上传到云服务器上。
# 上传文件的命令 在本地执行 A.B.C.D 为云服务器的公网IP地址 root 为用户名,后面的路径为上传的路径
scp frp_0.36.2_linux_amd64.tar.gz root@A.B.C.D:/root
如果对于
scp命令不熟悉的,推荐使用xftp工具,可以直接通过拖拽的方式上传文件。
接下来在云服务器上解压文件,可以使用命令ssh root@A.B.C.D 来连接云服务器。当然也可以用xftp等工具,谁在乎呢?连上就行,看操作:
- 解压刚才上传的
frp压缩文件
## 解压命令
tar -zxvf frp_0.60.0_linux_amd64.tar.gz
解压完成后目录结构如下:
- 把解压后的文件重命名并且移动到一个安全可靠的目录下
## 重命名为 frp
mv frp_0.60.0_linux_amd64 frp
## 移动到 /usr/local 目录下
mv frp /usr/local
- 使用命令
cd /usr/local/frp进入到这个目录下,此时内部的目录结构长这样:
2. 修改服务端的配置文件
使用命令 vim frpc.toml 编辑 frpc.toml 文件,以下是示例配置:
# 暴露端口 7000,用于给frp client 连接
bindPort = 7000
对于frp server来说,只需要暴露一个端口,用于给frp client连接即可。(所以配置文件很简单)
启动 frp server 的命令很简单:
./frps -c frps.toml
3. 配置systemd服务
为了方便启动和管理,我们可以将其配置成systemd服务。
使用命令 sudo vim /etc/systemd/system/frps.service 然后写入下面的内容
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径 注意要写绝对路径
ExecStart = /usr/local/frp/frps -c /usr/local/frp/frps.toml
[Install]
WantedBy = multi-user.target
设置frp server开机自启动
sudo systemctl start frps
启动服务端
如上图可以看到 frp server 已经启动
3. 目标主机安装frp Client
接下来就是在目标主机(联想小新)上安装frp client,这里的frp client就是用来连接frp server的,然后将外网的请求转发到内网的目标主机上。
1. 上传解压
将下载好的frp安装包上传到联想小新(内网服务器)上,然后解压
scp frp_0.60.0_linux_amd64.tar.gz linlin@192.168.1.106:/home/linlin
同样的操作 (解压,重命名以及移动到指定目录):
mv frp_0.60.0_linux_amd64 frpc
sudo mv frpc /usr/local/
cd /user/local/frpc
2. 修改客户端的配置文件
这里修改的是frpc.toml文件,因为联想小新是内网服务器,他是frpc的客户端。 写入下面的内容
# 这里记得替换成自己云服务器的IP地址
serverAddr = "A.B.C.D"
serverPort = 7000
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
3. 配置systemd服务
sudo vim /etc/systemd/system/frpc.service
在文件中添加以下内容:
[Unit]
Description=frpc server
After = network.target syslog.target
Wants = network.target
[Service]
Type=simple
ExecStart=/usr/local/frpc/frpc -c /usr/local/frpc/frpc.toml
[Install]
WantedBy=multi-user.target
sudo systemctl start frpc
可以使用命令ps -aux | grep frpc查看是否启动成功,如下图:
但还不算完,还有重要的一步就是开放云服务器的端口。
3. 开放云服务器的端口
同时开放云服务器的 6000 和 7000 端口
测试连接
使用下面的命令连接内网服务器
ssh -o Port=6000 linlin@A.B.C.D
如下图表示连接成功:
至此,通过云服务的中转,我到任何地方在任何电脑上都可以通过 frp 连接联想小新了。
转发jenkins
我的内网服务器(联想小新)上安装了 jenkins,跑在 8080 端口,现在我想实现在任何地方都能访问到内网服务器上的 jenkins,怎么办呢?
frp一样可以帮你搞定这个事情。
1. 修改云服务器的frps配置文件
serverAddr = "A.B.C.D"
serverPort = 7000
# 这部分是转发ssh的
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
# 这部分是转发http的
[[proxies]]
name = "jenkins"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["jenkins.daimaxiaoxuesheng.xyz"]
保存修改后,重启公网服务器上的 frps.service。命令为 systemctl restart frps.service
2. 修改云服务器的frps配置文件
bindPort = 7000 # 给ssh用的
vhostHTTPPort = 9000 # 给jenkins用的
同理,重启内网服务器frpc的服务,命令为 systemctl restart frpc.service
3. 添加域名,开放端口
首先在云服务器上开放9000端口,得靠他转发到内网的8080端口啊
添加域名解析规则,
最后我们访问 jenkins.daimaxiaoxuesheng.xyz:9000 即可访问到内网的jenkins服务啦!
总结
到这里,基本的内网穿透就实现了。