[TOC]
前言
由于没有公网IP,无法远程连接家里的电脑,搜到了frp这个项目,尝试使用后发现效果不错,所以写出安装过程分享。
frp是一个反向代理工具,可以将流量转发到目标主机,包括TCP,UDP,HTTP,HTTPS。其基本原理是目标主机安装客户端连接到代理服务器建立固定连接,客户主机通过代理服务器连接到目标主机进行访问。
市面上有向日葵,TeamViewer也是类似原理,只不过这里变成代理服务器需要我们自己提供,比如从腾讯云或者阿里云购买一台轻量服务器作为代理服务器,有固定的公网IP可以访问。自建服务器的好处是带宽独享,可以有更稳定的连接效果。
而制作镜像是希望能够方便多次部署。
安装
1. 环境
- 代理服务器 百度轻量云服务器 CentOS-7.6
- docker-ce-20.10.16-3.el7
- frp 0.41.0
- 目标主机 Windows10
- 客户主机 Windows10
- 假定代理服务器IP 106.13.127.200
2. 步骤
查看SELinux
SELinux是关闭状态,不需要处理
getenforce
查看防火墙
防火墙是关闭状态,把防火墙开启
systemctl status firewalld
systemctl start firewalld
systemctl enable firewalld
systemctl status firewalld
添加端口
提前开放一段端口范围,用于frp流量转发。
firewall-cmd --add-port=20000-20030/tcp --permanent
firewall-cmd --add-port=20000-20030/udp --permanent
firewall-cmd --reload
firewall-cmd --list-all
安装docker
查看docker
docker还没安装,需要自己安装。
添加docker的安装源。
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看docker-ce版本
yum list docker-ce --showduplicates | sort -r
这里看到提示versionlock,由于只是安装frp,所以先把锁删掉。
yum versionlock list
yum versionlock clear
Docker可以默认安装最新版本,或者指定版本安装,分别指令如下。
yum install docker-ce -y
yum install docker-ce-20.10.16-3.el7 -y
这里直接安装最新版本,等待安装完成
安装完后确认docker版本,并启动docker服务
docker -v
systemctl status docker
systemctl enable docker
systemctl start docker
systemctl status docker
配置frps
登录代理服务器,创建目录并将frp复制到目录下
mkdir frp && cd frp
chmod +x frps
将frps.ini备份并编辑frps.ini。
bind_port 监听tcp端口
bind_udp_port 监听udp端口,实际上p2p模式才会用到,这里用不上
dashboard_port 监控网页端口
dashboard_user dashboard_pwd 监控网页用户和密码
token 用户客户端frpc连接frps时进行校验
vi frps.ini
[common]
bind_port = 20000
bind_udp_port = 20000
dashboard_port = 20001
dashboard_user = frp
dashboard_pwd = frpisawesome
token = frpisawesome
编辑Dockerfile
vi Server.Dockerfile
FROM centos:7
WORKDIR /root/frp
ADD ./* ./
RUN chmod +x frps
CMD ./frps -c ./frps.ini
制作镜像
配置完毕,可以开始构建镜像
构建需要拉取CentOS,根据网速可能需要等待一会儿
docker build -f Server.Dockerfile -t wenneryu/linux_frps:v1 .
查看镜像,可以看到镜像已经制作完成,TAG是v1
docker images
基于镜像开启容器
docker run -itd -p 20000-20010:20000-20010 -p 20000-20010:20000-20010/udp --name frps wenneryu/linux_frps:v1
docker ps
查看监听端口是否开启
netstat -anp | grep 200
查看容器日志
docker logs -f frps
目前看来一切正常。尝试访问监控面板。
之前配置端口 dashboard_port = 20001,假设代理服务器IP是106.13.127.200,那么通过 http://106.13.127.200:20001 访问监控面板
正常情况下,会提示输入之前配置的用户和密码,并看到如下页面
配置目标主机
代理服务器配置好后,配置目标主机,
关于远程连接的配置这里不做说明,默认已配置好远程连接的参数,只是需要代理服务器中转。
frpc和frps配置类似,编辑frpc.ini
server_addr 服务器地址
server_port 服务器端口
token 用于连接代理服务器时检验口令
type 由于远程连接同时支持TCP和UDP,所以这里两个都进行配置
local_ip 本地ip
local_port 本地开放的端口,远程连接默认端口是3389
remote_port 远程服务器开放的端口,用于客户主机连接
use_compression 是否启用压缩,用于节省流量
访问流程可以描述为
目标主机登录代理服务器106.13.127.200:20000
客户主机 -> 代理服务器106.13.127.200:20010 -> 目标主机:3389
具体配置
[common]
server_addr = 106.13.127.200
server_port = 20000
token = frpisawesome[mstsc_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 20010
use_compression = true[mstsc_udp]
type = udp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 20010
use_compression = true
运行frpc
frpc.exe -c frpc_tcp_udp.ini >> frpc.log
查看frpc的日志frpc.log
查看frps的日志
目标主机与代理服务器成功建立TCP和UDP连接
测试远程连接
客户主机打开远程桌面连接,输入IP和端口进行连接106.13.127.200:20010
可以看到成功连接,并且已启用UDP
3. 其他
关于P2P模式
frp也支持P2P模式,即客户主机和目标主机直接建立连接,理论上会有更好的连接效果。但是由于现实中的网络环境,这种模式可能失败。本人尝试过有失败情况,也有成功情况。可以参考frp文档自行尝试。
关于远程桌面
Windows远程桌面会尝试使用UDP提供更好的效果,所以这里同时配置了TCP和UDP代理。如果希望有更好的效果,可以考虑配置GPU渲染。关于远程桌面的流量和GPU有机会其他文章说明。
总结
- 使用代理的原因是因为没有公网IP,如果有动态公网IP,可以考虑DDNS实现直连。
- IPV6可能会有固定的IP,如果有的话也可以尝试IPV6直连。
- frp的基本功能是流量转发,所以不止远程桌面,内网服务器也可以通过frp对外提供服务。
- IP访问不太方便,可以绑定域名访问,不过国内域名需要备案。
参考
- frp https://github.com/fatedier/frp
- frp docker https://hub.docker.com/repository/docker/wenneryu/linux_frps
- dockerfile https://github.com/WennerYu/frp