# Frp 实现内网穿透

# 云服务器

暂时使用的是阿里云 (opens new window)云服务器 ECS (opens new window),轻量应用服务器、ECS 通用型、ECS 共享型都可以。

搬瓦工 (opens new window)vultr (opens new window)也可以。

# 使用 frp

# 下载 frp 到服务端

在阿里云的云服务器 ECS 控制台 (opens new window)里,我们点击云服务器的远程连接,进入服务端控制台。

输入cd /usr/local进入个人默认的程序安装路径,输入arch查看处理器的架构,根据这个架构去frp 的 GitHub (opens new window)里选择合适的版本。

由于是x86_64所以我们选择 amd64 版本,输入wget https://github.com/fatedier/frp/releases/download/v0.35.0/frp_0.35.0_linux_amd64.tar.gz将 frp 下载到服务端。如果/usr/local里已经有了 frp,是可以输入rm -rf frp进行删除的。

输入tar -zxvf frp_0.35.0_linux_amd64.tar.gz对 frp 的压缩包进行解压,输入rm frp_0.35.0_linux_amd64.tar.gz对压缩包进行删除(输入yes确认删除),输入mv frp_0.35.0_linux_amd64 frp对解压出来的文件夹进行重命名。

cd /usr/local
wget https://github.com/fatedier/frp/releases/download/v0.35.0/frp_0.35.0_linux_amd64.tar.gz
tar -zxvf frp_0.35.0_linux_amd64.tar.gz
rm frp_0.35.0_linux_amd64.tar.gz
mv frp_0.35.0_linux_amd64 frp
1
2
3
4
5

# 配置服务端里的 frp

输入cd frp进入服务端的 frp,输入rm frpcrm frpc.inirm frpc_full.ini是为了删除客户端的东西,在服务端是用不着的。

要配置一下 frps.ini。输入vim frps.ini,再输入i进入输入模式,输入以下内容:

[common]
bind_port = 7000
token = 88888888
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin
1
2
3
4
5
6

按 Esc 退出输入模式,输入:wq退出并保存。上面的bind_port是 frp 监听端口,dashboard_port是控制页面对应端口,token是服务端与客户端通信的令牌,dashboard_user是进入控制页面的账户,dashboard_pwd是进入控制页面账户对应的密码。dashboard_xxx不是特别重要,最重要的是bind_porttoken

我们要让 frp 在服务端开机自运行。输入vim /etc/systemd/system/frps.service,再输入i进入输入模式,输入以下内容:

[Unit]
Description=frps daemon
After=syslog.target  network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
Restart=always
RestartSec=1min

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13

按 Esc 退出输入模式,输入:wq退出并保存。最后输入systemctl start frps && systemctl enable frps就设置好了开机启动。

可以让服务端停止后再启动,然后输入netstat -tanlp查看进程(杀进程使用kill -9 xxx)。

# 刷新服务列表
systemctl daemon-reload
# 设置开机自启
systemctl enable frps
# 关闭开机自启
systemctl disable frps
# 启动服务
systemctl start frps
# 停止服务
systemctl stop frps
1
2
3
4
5
6
7
8
9
10

# 配置客户端里的 frp

frp 的 GitHub (opens new window)里选择相应的版本,比如 windows 我们暂时使用的是frp_0.35.0_windows_amd64.zip,下载解压到本地某个目录下,删除frpsfrps.inifrps_full.ini与客户端无关的文件。使用文本编辑器打开frpc.ini编辑如下

[common]
server_addr = 139.224.248.233
server_port = 7000
token = 88888888

[rdc]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 3360
1
2
3
4
5
6
7
8
9
10

上面的server_addr = 139.224.248.233是 frps 服务端所在的云服务器的公网 IP(阿里云 ECS 实例公网 IP);server_port = 7000是 frps 服务端所依赖的端口,frpc 和 frps 之间的连接就依赖于这个7000端口;token = 88888888是 frpc 和 frps 之间的通信令牌,在 frps 也同样设置过了;[rdc]是自定义名字;type = tcp是因为我们使用RD Client (opens new window),它是 tcp 类型的;local_ip= 127.0.0.1是本地机器 IP(暂时就填默认的127.0.0.1);local_port = 3389是你要映射本地机器的哪个端口,因为要使用 RD Client,所以是3389端口;remote_port = 3360表示将本地的那个端口要映射到远程 frps 所在服务器的哪个端口,总的来说就是将本地的3389端口映射到139.xxx.xxx.xxx3360端口。

我们需要在电脑开机时自动运行客户端的 frp。在 frp 目录下新建 startfrpc.bat 批处理文件,使用文本编辑器打开并编辑:

@echo off
:: 定义WIFI名称
set wifi_name=TP-LINK_602
:: 连接WIFI,查看当前连接信息,并且是否是wifi_name
(netsh WLAN show interfaces | findStr %wifi_name% >nul) || (
    :: ||表示否则,意味着当前连接不是wifi_name,那就netsh wlan connect连接wifi_name
    netsh wlan connect ssid=%wifi_name% name=%wifi_name%
)
:: 延迟2秒
timeout /t 2 /nobreak
:: 得确保联网后再运行frpc,看是否已经启动了frpc,>nul表示前面这句信息不输出到cmd框
(tasklist|findstr "frp" >nul) || (
    :: 没有启动frpc,就在这启动frpc,||表示否则
    d:\frp_0.35.0_windows_amd64\frpc.exe -c d:\frp_0.35.0_windows_amd64\frpc.ini
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

我们将 startfrpc.bat 加入到任务计划程序。打开电脑的“任务计划程序”,选择右侧的“创建任务...”。

  • 在常规这个页签里,名称填为“frpc”,然后勾上“不管用户是否登录都要运行”、“使用最高权限运行”、“隐藏”。
  • 在触发器这个页签里,选择新建,然后开始任务选择“启动时”,可以自己选择是否重复执行以及间隔。
  • 在操作这个页签里,选择新建,然后点击“浏览”选择前面创建的“start.bat”(D:\frp_0.35.0_windows_amd64\start.bat),最后在“起始于”里填写 start.bat 的父路径(D:\frp_0.35.0_windows_amd64)。
  • 返回常规页签,然后点击确定,输入电脑登录密码,就完成了 frpc 的自启动。

# 给云服务器设置安全组

云服务器内部的 frps 依赖的7000可以不用管,因为你在服务器命令行里输入firewall-cmd --state,会发现阿里云服务器操作系统内的防火墙是默认关闭的,所以内部使用7000端口可以不用管了。如果你要放开云服务器本身的防火墙并添加7000端口,可以参考如下命令。

# 先查看防火墙状态
firewall-cmd --state
# 启用防火墙
systemctl start firewalld
# 停用防火墙
systemctl stop firewalld
firewall-cmd --zone=public --add-port=7000/udp --permanent
firewall-cmd --zone=public --add-port=7000/tcp --permanent
# 放行端口后要重新加载
firewall-cmd --reload
1
2
3
4
5
6
7
8
9
10

外部想访问服务器以及它的一些端口,那就必须放开一些端口,这个是在阿里云控制台 (opens new window)——网络与安全——安全组。frpc 所在机器想与云服务里的 frps 进行通信连接,需要开放云服务器安全组的7000给外部用;然后我们要使用 RDClient 进行远程桌面控制,通过 frp 将3389映射到云服务器的3360端口了,那么还需要开放云服务器安全组的3360给外部用。70003360开放给谁,也要限定好,不是谁想加就加的。

安全组

安全组的授权对象我们使用的是前缀列表 (opens new window)

# 说在最后

使用 Frp 还是挺简单的,但是它的安全性还是有些差,功能上也只是反向代理、映射端口,如果想异地组网(虚拟局域网)那就不能使用 Frp 了,可以使用SoftEther 实现虚拟局域网