Frp内网穿透实现MS远程桌面和SSH

本文最后更新于:July 6, 2019 pm

使用github上面的开源项目Frp和一台有公网IP的主机来实现反向代理(内网穿透),从而达到使用微软自带的远程桌面mstsc来远程没有公网IP的windows电脑和使用ssh远程Linux系统(Centos和Ubuntu)的效果。

本文不涉及反向代理的具体理论知识,使用的公网IP主机为阿里云主机(十块钱一个月的学生版),由于使用的阿里云主机带宽有限,因此使用远程桌面的效果可能比较一般,但是对于SSH远程来说肯定是足够了的。

需要注意的是,如果你的电脑本身所处的网络是有动态公网IP的,建议直接在路由器中设置DDNS,效果要比这个好很多,这个仅适用于那些没有公网IP的电脑。

1、服务端配置

首先我们对服务端的阿里云主机进行配置,当然有其他的公网IP主机都是可以的。这里使用的操作系统是CentOS7.3。

1.1 下载Frp

github上各个配置版本下载地址

1
2
3
4
5
6
7
8
9
10
11
# 使用wget指令下载linux版本
wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz

# 使用tar命令解压
tar -zxvf frp_0.27.0_linux_amd64.tar.gz

# 使用cp命令复制到/etc目录中并重命名为frps
cp -r frp_0.27.0_linux_amd64 /etc/frps

# 使用rm命令删除掉多余的frpc客户端文件,只留下服务端frps相关的文件
rm -f frpc frpc_full.ini frpc.ini

这些就是剩下的我们需要的文件,这里我们可以看到有两个ini配置文件,其中frps_full,ini是完整的带有注释说明和所有功能的配置文件,我们把需要的简单配置摘到frps.ini这个文件,方便我们管理配置。

1.2 编辑配置文件

接下来我们编辑配置文件启用frp的监听端口7000和监控面板dashboard的监听端口7500。

1
2
3
4
5
6
7
8
9
# 将下列内容加入到frps.ini中
[common]
bind_addr = 0.0.0.0
bind_port = 7000
auto_token = 你的连接认证密码

dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 你的管理登录密码

需要注意的是,这上面说的7000和7500端口都需要在阿里云的防火墙里面配置放行,否则会无法访问。

1.3 设置开启自动和后台运行

我们新建一个文件,将Frps注册成Linux中的服务进程。

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
28
29
# 新建一个文件设置frps服务能够实现后台启动和开机启动
vim /etc/systemd/system/frpsd.service

# 将下列内容加入到frpsd.service中
[Unit]
Description=frps daemon
After=syslog.target network.target
Wants=network.target

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

[Install]
WantedBy=multi-user.target

# 启动frps服务
systemctl start frpsd.service

# 设置frps服务开机启动
systemctl enable frpsd.service

# 查看frps状态
systemctl status frpsd.service

# 重启frps服务
systemctl restart frpsd.service

2、Windows客户端配置

2.1 下载Frp

我们按照之前的下载好对应的Windows版本之后,删除掉多余的frps服务端文件,只留下对应的frpc客户端文件。

2.2 编辑配置文件

1
2
3
4
5
6
7
8
9
[common]
server_addr = 你的公网主机的公网IP
server_port = 7000

[MSRDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7777

这里的server_port就是我们前面的服务端配置的端口7000,local_port则是微软自带的远程桌面mstsc的默认端口3389,remote_port就是到时候使用mstsc远程的时候需要在这个公网IP后面加上的端口号,注意这个端口号也是需要在阿里云主机的防火墙中放行。

然后我们就可以启用frpc客户端来建立连接

1
2
# 在命令行中输入
frpc.exe -c frpc.ini

2.3 注册Frpc为Windows服务

为了使frpc能够开启后台运行,我们需要将它注册为系统服务。

这里我们需要使用到GitHub上面的另一个项目winsw

这里我使用的是WinSW.NET4.exe这个版本,这个需要电脑安装了.net4才可以使用,一般win10应该都是安装了的,此外我们还要下载一个xml文件作为启动配置文件。

然后我们在对应的xml配置文件中加入下列内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<configuration>

<!-- ID of the service. It should be unique accross the Windows system-->
<id>frpc</id>
<!-- Display name of the service -->
<name>Frpc Service (powered by WinSW)</name>
<!-- Service description -->
<description>This frpc service can realize reverse Proxy</description>
<!-- Path to the executable, which should be started -->
<executable>frpc</executable>
<arguments>-c frpc.ini</arguments>
<logmode>reset</logmode>

</configuration>

接着我们把这两个文件都命名为WinSW,然后放在刚刚frpc的目录下。

然后我们以管理员身份启动powershell或者cmd,输入下列命令

1
WinSW.exe install

win+r后通过services.msc进入到服务列表页面找到frpc服务。

我们打开设置,将它设置为开机启动,服务失败后一分钟自动重启服务。

到这里windows客户端的配置就已经完成了。我们在远程的时候只需要输入刚刚使用的公网IP地址加上端口号即可进行远程连接,如果有多台电脑需要进行远程,只需要给每个电脑设置一个不同的端口号即可。

3、Linux客户端配置

Linux客户端的配置和上面的服务端大同小异,只需要将frps换为frpc并且修改对应的配置文件即可。注意下面的操作小七在CentOS7.6和Ubuntu18.04上面都能成功实现。

3.1 下载Frp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用wget指令下载linux版本
wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz

# 使用tar命令解压
tar -zxvf frp_0.27.0_linux_amd64.tar.gz

# 使用cp命令复制到/etc目录中并重命名为frpc
cp -r frp_0.27.0_linux_amd64 /etc/frpc

# 使用rm命令删除掉多余的frps服务端文件,只留下客户端
rm -f frps frps_full.ini frps.ini

# 使用vim编辑客户端配置文件
vim /etc/frpc/frpc.ini

3.2 编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
# 配置本地的frpc.ini文件

[common]
server_addr = 你的公网主机的公网IP
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8000

3.3 设置开机启动和后台运行

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
# 新建一个文件设置frps服务能够实现后台启动和开机启动
vim /etc/systemd/system/frpcd.service

# 将下列内容加入到frpcd.service中
[Unit]
Description=frpc daemon
After=syslog.target network.target
Wants=network.target

[Service]
Type=simple
ExecStart=/etc/frpc/frpc -c /etc/frpc/frpc.ini
Restart= always
RestartSec=1min

[Install]
WantedBy=multi-user.target

# 启动frpc服务
systemctl start frpcd.service

# 设置frpc服务开机启动
systemctl enable frpcd.service

# 查看frpc服务状态
systemctl status frpcd.service

3.4 错误记录

在Ubuntu上面出现了一点小意外,发现服务并没有成功启用

[control.go:142] [ssh] start error: proxy name [ssh] is already in use

提示是说ssh这个名字已经被别的服务占用了,这里我们只需要修改之前的配置文件里面的ssh为别的名字,然后重启服务即可。

最后注意这时候我们如果需要使用ssh远程需要加上-p命令来指定端口。