阿里云+frp实现内网穿透

阿里云+frp实现内网穿透

最近更新:2022年10月10日10:39:12

1. 云服务器购买


随便买一个就行,主要是需要服务的一个公网ip。(点击立即购买默认创建即可,操作系统可选CentOS

image-20220310104116564

2. 查看实例并开启远程连接


点击云服务器ECS->实例进入实例管理界面,大概长这样:

image-20220310104745377

然后点击实例右边的远程连接打开服务器的控制终端。

建议开启免密登陆,监控调试很方便。

image-20220310104926368

点击打开后能够看到如下界面:

image-20220310105510245

3. 在阿里云服务器下载frp相关文件


frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

frp下载页面地址:https://github.com/fatedier/frp/releases

frp官方示例文档:https://gofrp.org/docs

image-20220310105731938

选择这里的linux_amd64版本,然后鼠标放上面右键选择复制链接地址,之后切换回之前阿里云的终端控制台,使用wget指令下载frp文件。

1
wget https://github.com/fatedier/frp/releases/download/v0.39.1/frp_0.39.1_linux_amd64.tar.gz

解压文件:

1
tar -zxvf  frp_0.39.1_linux_amd64.tar.gz

然后cd进入frp_0.39.1_linux_amd64目录,输入ls可以看到以下文件:

image-20220310110547047

文件解释:

  • frpc——frp在客户端运行的文件,也就是需要穿透的内网环境下的主机需要运行的文件,与阿里云服务器这边无关可以删除。
  • frpc.ini——frp客户端的配置文件,用于定义一些监听和转发端口啥的。
  • frps——frp在服务器端运行的文件,这需要在阿里云服务器上运行。
  • frps.ini——frp服务器端的配置文件。
  • systemd——用于配置让frp服务一直在后台运行的文件,后面会讲。

4. 开放阿里云服务器端口,并设置frp后台运行。


4.1 回到阿里云“云服务器ECS->实例”界面,然后点击右侧的安全组,点击默认的安全组进行配置管理。

image-20220310112455190

手动添加入端口,比如我添加了这几个,一般添加两个端口就行

image-20220310112545443

4.2 回到云服务器的控制台,查看、修改并运行frps程序。

frps.ini里面的内容如下:

1
2
[common]
bind_port = 7000

注意:7000 是默认绑定的端口,这个端口与你自己开放的入端口的其中一个得对应,不然一会儿客户无法访问。

然后执行下面的语句服务器端程序就运行了。

1
2
3
4
5
# 前台启动
./frps -c ./frps.ini

# 后台启动(正常使用后推荐后台启动)
nohup ./frps -c ./frps.ini &

一般情况下后台启动已经能够满足正常要求,只要你的云服务器没有关机,程序就一直在运行,但是如果关机之后就得需要打开云服务器的控制终端重新运行一下frps程序。能不能让frps程序开机自启动,不用每次关机后手动打开呢?systemd文件就是用来干这件事儿的。

4.3 使用 systemd 管理 frp 服务

下面部分基本ctrl + C V知乎linux 技术栈的文章,原文链接如下:

《使用 systemd 管理 frp 服务》: https://zhuanlan.zhihu.com/p/382950791

  1. systemd 服务单元

systemd 拥有 11 个单元类型,分别是:服务(service)、套接字(socket)、设备(device)、挂载点(mount)、自动挂载点(automount)、 启动目标(target)、交换分区或交换文件(swap)、被监视的路径(path)、任务计划(timer)、 资源控制组(slice)、一组外部创建的进程(scope)。

其中,服务单元是以 .service 为后缀的单元文件,封装了一个被 systemd 监视与控制的进程。

服务的单元文件包括三个部分:[Service][Unit][Install]

在 GitHub 上下载的 frp 压缩包中已经包含了对应 frpc 和 frps 的服务的 单元文件单元模板文件。下面我们将分别讲解基于单元文件和基于单元模板文件进行管理 frps 服务(frpc 服务类似)。

  1. 基于单元文件管理 frps 服务

我们先使用 frps 的单元文件(frps.service)进行管理 frps 服务。我们先看一下 frps.service 的文件内容:

进入阿里云服务器控制终端界面cd systemd ,然后cat frps.service 可以看到如下内容。

image-20220310141256842

下面是参数解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Frp Server Service # 服务描述
After=network.target # frps 将会在 network.service 启动完毕之后再启动

[Service]
Type=simple # 不论进程是否启动成功,systemctl start 都执行成功
User=nobody # 设置进程在执行时使用的用户
Restart=on-failure # on-failure 表示仅在服务进程异常退出时重启
RestartSec=5s # 设置在重启服务前暂停多长时间
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini # 在启动该服务时需要执行的命令行

[Install]
WantedBy=multi-user.target # 用于 systemctl enable 时创建软连接

重点只需要关注ExecStart,这里面是该服务的执行命令,其实也就是我们之前手动启动的命令行语句。接下来有两种更改方式:

  • 更改ExecStart中命令语句的执行路径,因为bin文件内是没有frps程序的
  • frpsfrps.ini移入到指定binetc/frp目录。

选择第二种方式部署frp服务,执行步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 在etc目录下创建frp文件夹
cd /etc
mkdir frp

# 返回刚才的systemd目录,复制文件
cd ~
cd frp_0.39.1_linux_amd64/systemd/

# 先拷贝.service文件, 需要在系统的目录下才能自启运行
sudo cp frps.service /usr/lib/systemd/system/

# 回到上一级,拷贝frp和.ini文件
cd ..
sudo cp frps /usr/bin/
sudo cp frps.ini /etc/frp/

# 启动frps服务
sudo systemctl start frps

# 停止frps服务
sudo systemctl stop frps

# 开启 frps 服务开机自启动
sudo systemctl enable frps

# 禁用 frps 服务开机自启动
sudo systemctl disable frps

至此阿里云frps程序的配置部署完整结束,接下来是内网主机的客户端设置。

2022年10月10日更新:

查看服务启动状态:systemctl status frps

5. 内网主机的frp客户端配置


frp下载页面地址:https://github.com/fatedier/frp/releases

frp官方示例文档:https://gofrp.org/docs

同样去到frp的下载页面,下载对应版本的frp,我的内网主机是windows,所以下载的windows版本。

image-20220310143938760

解压同样可以看到frpc frpc_full.ini frpc.ini frps frps_full.ini frps.ini LICENSE systemd这些文件,在配置客户端时只需要frpcfrpc.ini两个文件,其余都可以删掉(如果你的内网主机仍是Linux可以保留systemd文件)。

打开frpc.ini进行如下配置:

1
2
3
4
5
6
7
8
9
10
[common]
tls_enable=true # 这一行是我后面自己加的,原因是之前有段时间frps服务一直连不上,按照网上教程才添加的,最开始可以删除这一行。
server_addr = 120.77.61.888 # 这是你的阿里云服务器公网ip地址,在"云服务器ECS->实例"进入实例管理界面可以看到
server_port = 7000 # 这是和frps服务器端绑定的端口,这是阿里云服务器安全组中开放的入端口

[ssh]
type = tcp # 默认
local_ip = 127.0.0.1 # 默认内网主机的本地回环地址
local_port = 22 # 内网主机的端口,用于SSH连接
remote_port = 6000 # 这是阿里云服务器安全组中开放的另一个入端口

2022年10月10日更新:

可以添加多个内网主机(服务器):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ssh2]
type = tcp # 默认
local_ip = 127.62.113.61 # 内网服务器地址
local_port = 22 # 内网服务器的端口,用于SSH连接
remote_port = 6001 # 这是阿里云服务器安全组中开放的另一个入端口



### 6. 利用winsw将frpc客户端程序封装成windows服务

-------

完成`.ini`文件的修改配置之后,同样可以通过执行下面的命令行语句手动运行frpc客户端程序。

```bash
# 前台启动 (frp_windows文件夹下运行cmd)
frps -c frps.ini

但是当你的cmd窗口关闭之后吧,程序就自动停止了,如果内网主机是Linux的话同样可以采用之前类似的方法将对应frpc.xxx的文件移入相应路径,windows主机的话则需要winsw来对程序进行封装。

winsw下载地址:https://github.com/winsw/winsw/releases

找到对应的x64版本,下载到frp文件夹的相同目录下。

image-20220310150256035

然后新建一个.xml文件,里面填写一些windows服务参数

1
2
3
4
5
6
7
8
9
<service>
<id>frpc</id> # windows服务id
<name>frpc</name> # windows服务名
<description>frp client</description> # 服务描述,可有可没有
<executable>frpc</executable> # 服务执行的程序文件
<arguments>-c frpc.ini</arguments> # 服务程序文件的超参数,其实就相当与吧 frpc -c frpc.ini拆开
<onfailure action="restart" delay="10 sec"/> # 重启延时
<log mode="reset"></log> # 服务日志记录
</service>

添加好后命名为winsw.xml 同样放在frp文件夹的目录。

然后在当前frp路径下打开cmd窗口,输入winsw install就可以创建服务了,配置成功后可以看到如下输出:

2022年10月10日更新:

如果要使用winsw进行服务部署,则需要把之前的下载的WinSW-x64.exe更改为winsw.exe如此才能找到指令。

服务卸载使用winsw uninstall指令,如果显示已被标记删除则重启一次电脑便会彻底删除。

image-20220310151324896

之后便可在任务管理器服务一栏中看到frpc服务已启动并显示正在运行,(如果显示已停止右键点击,选择启动即可)

image-20220310151447585

然后便可通过在你的外网主机上配置120.77.61.888:6000端口连接访问你的内网主机了,windows用户,用户名和密码就是开机的时候的用户名和密码,提供一份我的配置。

1
2
3
4
Host my_pc
HostName 120.77.61.888 # 自己的公网ip
Port 6000 # 自己开放的安全组的入端口,需要与frpc.ini中的remote_port一直。
User Administrator # windows一般是这个用户名

终于,完结撒花,特别感谢教研室硕哥的帮助指导。

2022年10月10日更新:

如果需要连接windows(内网主机)作为服务器,则需要在windows ->设置->应用->可选应用里面搜索安装openssh服务端程序,安装完成后用管理员权限打开cmd,输入net start sshd开启ssh服务,输入net stop sshd关闭ssh服务。

参考文章


【知乎】使用 systemd 管理 frp 服务:https://zhuanlan.zhihu.com/p/382950791

【CSDN】阿里云服务器实现frp内网穿透(完整教程

【CSDN】阿里云服务器实现 frp 内网穿透:(完整教程

文章名称一样,内容稍有不同。