使用github上面的开源项目Frp和一台有公网IP的主机来实现反向代理(内网穿透),从而达到使用微软自带的远程桌面mstsc来远程没有公网IP的windows电脑和使用ssh远程Linux系统(Centos和Ubuntu)的效果。
本文不涉及反向代理的具体理论知识,使用的公网IP主机为阿里云主机(十块钱一个月的学生版),由于使用的阿里云主机带宽有限,因此使用远程桌面的效果可能比较一般,但是对于SSH远程来说肯定是足够了的。
需要注意的是,如果你的电脑本身所处的网络是有动态公网IP的,建议直接在路由器中设置DDNS,效果要比这个好很多,这个仅适用于那些没有公网IP的电脑。
服务端配置
首先我们对服务端的阿里云主机进行配置,当然有其他的公网IP主机都是可以的。这里使用的操作系统是CentOS7.3。
下载Frp

# 使用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这个文件,方便我们管理配置。
编辑配置文件
接下来我们编辑配置文件启用frp的监听端口7000和监控面板dashboard的监听端口7500。
# 将下列内容加入到frps.ini中
[common]
bind_addr = 0.0.0.0
bind_port = 7000
auto_token = 你的连接认证密码
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = 你的管理登录密码
需要注意的是,这上面说的7000和7500端口都需要在阿里云的防火墙里面配置放行,否则会无法访问。
设置开启自动和后台运行
我们新建一个文件,将Frps注册成Linux中的服务进程。
# 新建一个文件设置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

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

编辑配置文件
[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客户端来建立连接
# 在命令行中输入
frpc.exe -c frpc.ini

注册Frpc为Windows服务
为了使frpc能够开启后台运行,我们需要将它注册为系统服务。
这里我们需要使用到GitHub上面的另一个项目winsw

这里我使用的是WinSW.NET4.exe这个版本,这个需要电脑安装了.net4才可以使用,一般win10应该都是安装了的,此外我们还要下载一个xml文件作为启动配置文件。
然后我们在对应的xml配置文件中加入下列内容
<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,输入下列命令
WinSW.exe install

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

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


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

Linux客户端配置
Linux客户端的配置和上面的服务端大同小异,只需要将frps换为frpc并且修改对应的配置文件即可。注意下面的操作小七在CentOS7.6和Ubuntu18.04上面都能成功实现。
下载Frp
# 使用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
编辑配置文件
# 配置本地的frpc.ini文件
[common]
server_addr = 你的公网主机的公网IP
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 8000
设置开机启动和后台运行
# 新建一个文件设置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

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

[control.go:142] [ssh] start error: proxy name [ssh] is already in use
提示是说ssh这个名字已经被别的服务占用了,这里我们只需要修改之前的配置文件里面的ssh为别的名字,然后重启服务即可。

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