起因
由于工作需要,有时需要在家中连公司服务器处理一些问题,但是办公室又没有固定IP,也没法做DDNS
。平时只能teamviewer
访问放在公司的另一台笔记本,但是Mac和Win的快捷键又不同,有时候操作起来很别扭,而且多数时候是连接上Windows后再开个Xshell
之类的工具访问服务器,感觉流程过于复杂。
多使用几次后发现这样工作流程过于复杂,且会出现teamviewer
自动更新导致两地版本不一致无法连接的情况。
技术选型
为了提高效率同时处于安全考虑,现在需要一款简单、稳定、高效、安全、内网穿透、跨平台的工具。这时想到之前使用过FRP来做反向代理使用,该工具由于使用Golang
开发的缘故天生自带跨平台,同时也是现在流行的内网穿透工具,可以使用 stcp(secret tcp) 类型的代理避免让任何人都能访问到要穿透的服务。
使用
由于主要是在家临时工作使用,且已找电信获取外网IP,在家做了DDNS
,所以FRPS
服务端我直接部署在家中服务器上,这样在家中通过FRPS
的IP加FRPC
配置的端口就可以访问公司的服务
如果需要在外面临时处理事情,使用stcp模式代理,然后通过相同的
sk
来做认证访问
部署FRPS
根据你服务器操作系统下载FRP,并修改frps.ini
配置文件
[common]
# 服务监听端口
bind_port = 17000
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin
然后控制台启动frps
# frps -c frps.ini
部署FRRC
在需要内网穿透的服务器、PC上下载FRP,并修改frpc.ini
,启动后可以通过浏览器上访问Admin UI
来修改配置文件重载和查看状态
[common]
# FRPS服务器IP或域名
server_addr = YourServerIP
# FRPS服务端口
server_port = 17000
# Admin UI
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
[RDP]
# 使用stcp
type = stcp
# 只有 sk 一致的用户才能访问到此服务
sk = akiya
local_ip = 127.0.0.1
local_port = 3389
remote_port = 13389
# 加密流量
use_encryption = true
use_compression = true
[SSH]
type = stcp
sk = akiya
local_ip = 172.16.15.5
local_port = 22
remote_port = 10022
use_encryption = true
use_compression = true
由于我是部署在windows下,为了方便使用脚本加入到系统启动中,编写frpc-start.vbs
CreateObject("WScript.Shell").Run "D:\apps\frp_0.29.1_windows_amd64\frpc.exe -c D:\apps\frp_0.29.1_windows_amd64\frpc.ini",0
创建快捷方式并复制快捷方式到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
路径下
如果是Linux下添加到系统服务,创建/lib/systemd/system/frpc.service
[Unit]
Description=fraps service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target
[Service]
Type=simple
#启动服务的命令(此处写你的frps的实际安装目录)
ExecStart=/opt/frp_0.30.0_linux_amd64/frpc -c /opt/frp_0.30.0_linux_amd64/frpc.ini
[Install]
WantedBy=multi-user.target
- 启动服务:
systemctl start frpc
- 开机自启:
systemctl enable frpc
使用FRPC
本地选择使用stcp
模式连接,官方还提供了xtcp模式,可用于应对在希望传输大量数据且流量不经过服务器的场景,但是还处于开发阶段且成功率低,所以不做描述。
访问终端与FRPS同局域网
如果是使用的客户端与FRPS在同一局域网中可以直接访问FRPS的内网IP加FRPC中的remote_port
访问,由于笔者是在家中架设FRPS,且没端口映射remote_port
端口到外网,所以只可在内网访问服务,理论上没暴露服务到公网是安全的。
此种内网穿透方式请在frpc.ini
中配置为type = tcp
,否者无法直接访问。
访问终端与FRPS不同网络
如果FRPS
服务器与访问终端不在同一网络,例如单独购买了ECS或者VPS服务器做FRPS
服务,或者是在外需要临时工作的情况下,就需要在公司FRPC的frpc.ini
中配置为type = stcp
,具体配置如部署FRRC中所示。
同时,需要在访问端也启动一个FRPC
,frpc.ini
配置如下
[common]
# FRPS服务器IP或域名
server_addr = YourServerIP
# FRPS服务端口
server_port = 17000
# 点对点安全访问
[RDP-visitor]
# 使用相同的stcp
type = stcp
# 设置访问角色
role = visitor
# 填写内网穿透端服务名
server_name = RDP
# 配置为内网穿透端相同的sk值
sk = akiya
# 映射到本地IP与端口
bind_addr = 127.0.0.1
bind_port = 3389
[SSH-visitor]
type = stcp
role = visitor
server_name = SSH
sk = akiya
bind_addr = 127.0.0.1
bind_port = 13322
在需要使用的时候启动本地FRPC
# frpc -c frpc.ini
启动成功后就可以使用RDP工具或者终端访问远程服务器了
- Windows
- mstsc:localhost直接连接RDP协议
- xshell等工具通过:localhost:13322连接远程ssh服务器
- Mac
ssh -p 13322 root@localhost
- Royal TSX 工具可以连接RDP协议