FRP内网穿透详细教程(SSH+HTTP)

901 阅读6分钟

更多博客:香蕉粗的黄鳝

大家好,我是一根甜苦瓜。

今天来分享如何用内网穿透工具(frp)将家里闲置的电脑用起来。解除家里局域网的封印,让家里的电脑可以被外网任何地方访问。

人要做某一件事,需要一个作案动机,而我今天要做的事情,来源于这么一个需求:

我有一台Mac,随身携带,是办公娱乐的主力军。我家里有一台闲置的笔记本(联想小新),他安装了Ubuntu系统,同时我还还买了一台云服务器,上面搭建了我的博客,以及一些数据库啥的。

现状就是我的Mac或者联想小新随时都可以连上我的云服务器,而我的Mac如果想连上联想小新,除非他们两在同一个局域网内,否则是不可能的。

image.png

画图分析一波,damn it !这么一看不合理啊,我A能连上BC也能连上B,为啥A就不能直接连上C了呢?为何不用B作为中转站呢?有道理!所以我想到了frp

frp介绍

frp是一个开源免费的快速反向代理工具,可以帮助我们实现内网穿透,让我们的内网设备可以被外网访问。

其实他就是一个中转站,外网的请求打到云服务器上的frpc server上,然后再由frpc server将网络请求转发到内网的frpc client上,从而实现外网可以访问局域网内部的服务器。

image.png

有关更多 frp 的细节可以去阅读官方文档,本文主要做一个简单的使用介绍。

2. 安装frp Server

从上面的介绍不难看出,我们需要有一台云服务器,并且在云服务器上安装frp server服务端,然后在内网机器上(联想小新)安装frp client客户端。通过frpc server + frpc client的通力合作实现内网穿透。

下面来看看如何安装frp服务端。

1. 云服务器安装frp Server

首先去 github 上下载对应的安装包: github.com/fatedier/fr… (直接找最新版本下载就好了)

image.png

由于我的云服务器是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等工具,谁在乎呢?连上就行,看操作:

  1. 解压刚才上传的frp压缩文件
## 解压命令
tar -zxvf frp_0.60.0_linux_amd64.tar.gz

解压完成后目录结构如下:

image.png

  1. 把解压后的文件重命名并且移动到一个安全可靠的目录下
## 重命名为 frp
mv frp_0.60.0_linux_amd64 frp
## 移动到 /usr/local 目录下
mv frp /usr/local
  1. 使用命令 cd /usr/local/frp 进入到这个目录下,此时内部的目录结构长这样:

image.png

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

启动服务端

image.png

如上图可以看到 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查看是否启动成功,如下图:

image.png

但还不算完,还有重要的一步就是开放云服务器的端口

3. 开放云服务器的端口

同时开放云服务器的 60007000 端口

image.png

测试连接

使用下面的命令连接内网服务器

ssh -o Port=6000 linlin@A.B.C.D

image.png

如下图表示连接成功:

image.png

至此,通过云服务的中转,我到任何地方在任何电脑上都可以通过 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端口啊

image.png

添加域名解析规则,

image.png

最后我们访问 jenkins.daimaxiaoxuesheng.xyz:9000 即可访问到内网的jenkins服务啦!

image.png

总结

到这里,基本的内网穿透就实现了。