需求很直接:通过外网访问公司内网的办公电脑,远程桌面直连。方案是 FRP 做中转——一台有公网 IP 的 Linux(CentOS 7)跑 frps 当跳板,映射 3389 端口;内网一侧跑 frpc。FRP 用 Go 编写,Windows、Linux、macOS、ARM 基本都能部署,发布页在 github.com/fatedier/frp/releases。前提是中转机所在机器能被公网 ping 通。
安装 FRP 服务端

[root@frp-server ~]# wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz
[root@frp-server ~]# tar -xf frp_0.30.0_linux_amd64.tar_2.gz -C /usr/local/
[root@frp-server ~]# cd /usr/local/
[root@frp-server local]# mv frp_0.30.0_linux_amd64/ frp

配置并启动服务端
FRP 默认给了两个服务端配置文件,简版 frps.ini 和完整版 frps_full.ini。这里用简版:
[root@frp-server local]# cd frp/
[root@frp-server frp]# vim frps.ini
[common]
bind_port = 7000
bind_port 是服务端监听端口,客户端通过它连接,建议按需修改。
启动服务端
[root@frp-server frp]# nohup ./frps -c ./frps.ini >/dev/null 2>&1 &
防火墙放通 7000 端口:
[root@frp-server frp]# firewall-cmd --permanent --zone=public --add-port=7000/tcp
[root@frp-server frp]# firewall-cmd --reload
success
更规范的做法是交给 systemd 管理:
[root@nps-server frp]# vim /etc/systemd/system/frps.service
[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
[root@nps-server frp]# systemctl daemon-reload
[root@nps-server frp]# systemctl start frps.service
[root@nps-server frp]# systemctl enable frps.service
ExecStart 里换成自己的路径。systemctl start frps 启动,systemctl enable frps 设开机自启。
配置并启动客户端
客户端同样有 frpc.ini 和完整版两个文件。内网机器上的 frpc.ini:
[root@frp-server frp]# vim frpc.ini
[common]
server_addr = 58.242x.x //frp服务端外网IP地址
server_port = 7000 //为FRP服务端监听的端口
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
注意 local_port 和 remote_port:前者按需求定,要远程桌面就填 3389;后者自定义,比如设 1234,访问服务端外网 IP:1234 就会被转发到客户端的 3389。
启动客户端:
[root@frp-server frp]# nohub ./frpc -c ./frpc.ini >dev/null 2>&1 &


服务端放通转发端口:
[root@frp-server frp]# firewall-cmd --permanent --zone=public --add-port=6000/tcp
success
[root@frp-server frp]# firewall-cmd --permanent --zone=public --add-port=1234/tcp
success
[root@frp-server frp]# firewall-cmd --reload
success
测试连通:
[root@localhost ~]# ssh dqz@192.168.66.33 -p 6000

Dashboard
给 frps 加上 dashboard 配置:
[root@frp-server ~]# vim /usr/local/frp/frps.ini
# 指定 Dashboard 的监听的 IP 地址
dashboard_addr = 0.0.0.0
# 指定 Dashboard 的监听的端口
dashboard_port = 7500
# 指定访问 Dashboard 的用户名
dashboard_user = admin
# 指定访问 Dashboard 的密码
dashboard_pwd = admin

放通 7500 端口:
[root@frp-server ~]# firewall-cmd --permanent --zone=public --add-port=7500/tcp
success
[root@frp-server ~]# firewall-cmd --reload
success
重启 frps 服务:
[root@frp-server ~]# /usr/local/frp/frps -c /usr/local/frp/frps.ini &
浏览器访问 dashboard,登录后可见当前注册的连接:


身份验证与加密压缩
默认只要知道服务端开放的端口,任意客户端都能来注册端口映射,公网服务上这不安全。在服务端和客户端的 common 配置里启用 privilege_token 即可,两边不一致就注册失败:
[root@nps-server frp]# vim frps.ini
...
privilege_token = dqz123456
另外客户端与服务器的时间差不能超过 15 分钟,时间戳用于加密验证、防报文被劫持利用;超时可通过 authentication_timeout 修改,单位秒,默认 900,设 0 则不校验。
内网防火墙若识别屏蔽了 SSH 之类的协议,给指定代理开 use_encryption = true 加密传输防拦截;报文较长时开 use_compression = true 压缩流量、加快转发,代价是多耗一点 CPU,压缩算法是 snappy。两个功能默认关闭:
[root@nps-server frp]# vim frpc.ini
[ssh]
type = tcp
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
Windows 端远程桌面穿透
下载 Windows 客户端程序包解压到磁盘任意目录(建启动脚本要用),修改 frpc.ini:

[common]
server_addr = 58.242.xx.xx #FRP服务端的公网IP
server_port = 7000 #服务器监听的port,与frps.ini文件中配置的bind_port的值一致
privilege_token = dqz123456 #服务端配置的token
[rdp] #远程桌面配置的名称
type = tcp
local_ip = 目标PC主机IP
local_port = 3389 # 监听本地端口;当用户连接以下remote_port的7001端口时,会被转发到frp client的3389端口(远程桌面的默认端口)。
remote_port = 7001 # 绑定远程端口;frpc 在与frps建立连接后,server会监听于此端口用于被用户连接。需要打开frp服务端的防火墙需要放通此端口
在同目录建 frpstart.bat:
#创建个.bat文件,命名为frpstart.bat,添加如下内容
@echo off
start "C:WindowsSystem32cmd.exe"
cd D:frp_0.30.0_windows_amd64 //frpc存储路径
frpc -c frpc.ini
exit
双击测试脚本能否正常运行:

注册成系统服务实现开机自启:
sc create frp_client binPath= D:frp_0.30.0_windows_amd64frpstart.bat start= auto

报错的话,用管理员身份运行 CMD 再执行:


服务端防火墙放通 7001:
[root@frp-server ~]# firewall-cmd --permanent --zone=public --add-port=7001/tcp
浏览器输入服务端 IP:dashboard 端口,确认注册成功:

最后确认办公机已开启远程桌面访问:


本机按 Win+R,mstsc 里输 服务端公网IP:7001:



输入办公机的开机用户和密码登入:

收尾检查三件事:token 两边必须一致;每一段转发用到的端口(bind_port、remote_port、dashboard_port)都要在服务端防火墙放行;家里 PC 休眠断网后穿透即失效,电源设置里把睡眠关掉。

















暂无评论内容