ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

frp内网穿透与UDP打洞:Windows远程桌面配置、调优及安全加固

frp内网穿透与UDP打洞:Windows远程桌面配置、调优及安全加固 frp 内网穿透这套东西我最早是被一个很朴素的需求逼着去学的办公室那台跑着内部工具和资料库的 Windows 机器蹲在 NAT 后面出差在外想连回去翻个日志、改条配置结果发现自己既没有公网 IP也不方便在路由器上做端口映射现成的远程协助软件又常常在画质和响应上让人抓狂。后来我把一台便宜的云主机拿来当公网入口用 frp 把内网的 3389 端口搬出去再进一步用 xtcp 的 UDP 打洞让两端直连才算把这件事彻底做顺了。这篇就把这条链路从选型、配置、打洞、调优到加固完整走一遍重点讲清楚每个参数为什么这么填以及我自己踩过的那些坑。不管你是刚接触 frp 内网穿透的新手还是已经能跑通 TCP 转发、想进一步搞明白 UDP 打洞的人下面的内容都能直接抄作业。1. 先把需求拆清楚为什么最后落在公网服务器 frp上远程访问内网机器这件事听起来只有一句话但真正动手之前需求必须先拆干净否则很容易在错误的方案上耗掉一整天。我们要解决的问题本质是一台处在 NAT 后面的 Windows 主机如何在没有任何公网入口的前提下被外部的一台设备以 Windows 远程桌面的方式访问到。这里面有三个约束条件同时存在——内网机器没有公网 IP、路由器不一定有权限改、远程桌面协议本身要求一条能双向传输的长连接。搞清楚这三个约束方案的范围其实就很窄了。1.1 内网里的那台 Windows凭什么能被外面看见NAT 的工作原理说白了就是内部能主动打出去外部不能主动打进来。你的 Windows 机器向公网发起连接时路由器会在自己的 NAT 表里临时开一个洞把回包按端口映射回来但这个洞是给这条连接专用的外面的陌生人拿着你的公网 IP 敲门路由器只会装作没听见。所以关键就在于要么想办法让路由器永久地把某个端口指向你这台机器要么就让内网机器自己主动向外建立一条常驻连接再由外部的某个节点顺着这条连接把请求送进来。frp 走的是第二条路。frpc 跑在内网的 Windows 机器上开机后主动去连公网服务器上的 frps连上之后两者之间保持一条长连接当外部有人访问公网服务器的某个端口时frps 就沿着这条已经建好的长连接把数据倒给 frpcfrpc 再交给本机的 3389。对路由器来说这始终是一条由内向外发起的普通连接完全不需要它配合开任何入站端口。这就是内网穿透最基本的思路也是 frp 能绕开绝大多数家庭和办公网络的底气所在。1.2 四种常见做法摆在一起比答案其实很清楚我前后试过好几条路把它们放到一张表里对比会直观得多。需要说明的是几款第三方远程协助软件在临时帮别人看电脑时确实方便但作为长期访问自己机器的方案它们在画质、延迟、会话限制上都有各自的短板尤其是免费档在带宽和并发上的限制做正事的时候很容易卡在关键节点上。方案是否需要公网 IP是否需要改路由器画质与延迟月成本主要短板路由器端口映射 动态域名需要多数家庭宽带已不给需要接近直连最好域名费几元运营商大内网环境下完全走不通第三方远程协助软件不需要不需要一般免费档受限免费或订阅制带宽受限多设备管理麻烦自建 frp服务器中转需要一台公网服务器不需要取决于服务器带宽云主机几十元起走服务器中转占用服务器流量自建 frpxtcp 打洞需要一台公网服务器不需要接近直连同上打洞成功率受 NAT 类型影响看完这张表就会发现自建 frp 的性价比是最高的一档前期一次性搭好之后只需要维护一台小云主机。而 UDP 打洞也就是 frp 里的 xtcp 模式本质上是在自建方案的基础上又加了一层优化——服务器只负责牵线真正的数据在两端之间直连跑服务器的带宽和流量就彻底省下来了。1.3 frp 的两条路线服务器中转与 UDP 打洞直连frp 的转发规则里类型字段决定了流量怎么走这里必须区分清楚因为后面的配置差异全都源于此。type tcp是最朴素的模式所有数据都经过公网服务器中转服务器就像一个邮局带宽多大你就能跑多快流量也算在服务器头上。type stcp在这个基础上加了密钥校验好处是不在服务器上开公开端口只有拿着同样密钥的另一端 frpc 才能访问适合不想让端口暴露在公网扫描器眼皮底下的场景。type xtcp就是标题里说的 UDP 打洞。它的核心差别在于frps 只参与最初的撮合帮两端互相通报各自的公网出口地址一旦两端的 NAT 都愿意为对方开洞之后的远程桌面数据就不再经过服务器而是从你的笔记本电脑直连到办公室那台 Windows 上。这条路线在体验上最接近直连同时把公网服务器从数据通道降级成了联系人。但它也是四种模式里最娇气的能否打通完全取决于两端的 NAT 类型这一点我在第 5 节会展开讲。2. 开工前的三件准备公网口、端口清单、以及一台能被远程的 Windows很多教程一上来就贴配置文件结果读者卡在第一步——服务器安全组没放行或者本地根本没开远程桌面。我建议在敲任何配置之前先把下面三件事落地一台能用的公网服务器、一份明确的端口清单、以及确认那台 Windows 本身允许被远程。这三件事任何一件没做好后面调多久的 frp 都是白费。2.1 公网服务器的配置怎么挑带宽要按什么算跑 frps 对 CPU 和内存的要求低到可以忽略1 核 1G 甚至 512M 内存的入门云主机完全够用真正需要算清楚的是带宽。这里有个换算关系必须先记住云厂商报的带宽单位是 Mbps而实际传输速度要除以 8也就是说 1 Mbps 大约等于 128 KB/s5 Mbps 大约等于 640 KB/s。Windows 远程桌面在 1080p 分辨率下的带宽消耗差异极大纯文字、表格、终端这类画面变化小的场景压缩后通常在 0.2 到 0.6 Mbps 之间一旦你滚动网页、看视频、拖拽窗口瞬时峰值冲到 5 到 15 Mbps 都很正常。这意味着如果用 1 Mbps 的小水管跑服务器中转模式能用但滚动页面时会明显感到一顿一顿的2 到 5 Mbps 才能算舒服。这也是我后来非要用 xtcp 的原因之一——打洞成功之后服务器只需要承担几十 KB 的信令流量画质和带宽全部由两端之间的实际网络决定。注意如果你打算按流量计费而不是按带宽计费服务器中转模式一定要先估一估月流量。远程桌面每分钟的实际吞吐大概在 1.5 到 7 MB 之间取决于画面活动量每天用两小时、一个月下来就是十几个 GB 的量级。2.2 安全组和系统防火墙到底要放行什么端口清单是我建议提前写在纸上的东西因为服务器上有两层过滤需要同时配置云厂商的安全组在控制台里点和服务器系统自身的防火墙在命令行里配任何一层漏了症状都是连接超时非常容易误判成 frp 配错了。以默认配置为例需要放行的端口是这些端口协议用途是否建议对全网开放7000TCPfrps 的控制端口frpc 连它建议只放行你自己的常用 IP7000UDP打洞撮合需要用到 UDP 通道建议放行否则 xtcp 直接失效7500TCPfrps 的仪表盘和管理接口强烈建议只对自己的 IP 开放7001TCP映射出去的远程桌面端口能不开放就不开放优先用 stcp/xtcp22TCP服务器自身的运维入口建议改端口并限制来源系统防火墙上如果你用的是带 firewalld 的发行版firewall-cmd --add-port7000/tcp --permanent之后别忘了--reload用 ufw 的话就是ufw allow 7000/tcp。这两个命令我都见过有人只敲了前半句没重载然后对着日志怀疑人生。2.3 先证明 3389 在本地是通的这一步特别容易被跳过但我强烈建议先在本机证明一次远程桌面是通的再去折腾 frp。需要确认的东西有几个系统版本。Windows 家庭版只能作为远程桌面的客户端不能作为被控端如果你是家庭版后面所有配置都不用做了先解决系统版本问题。远程桌面开关。在设置 → 系统 → 远程桌面里打开或者直接在运行框输入sysdm.cpl在远程选项卡里勾选允许。监听状态。打开命令行执行netstat -ano | findstr :3389正常应该能看到0.0.0.0:3389处于监听状态。如果只看到127.0.0.1:3389说明它只绑了回环地址外部访问会失败——不过好消息是frpc 跑在同一台机器上localIP填127.0.0.1反而正好对得上这一点我在下一章会讲。账户必须有密码。远程桌面不接受空密码账户登录这是硬性限制。防火墙。系统自带的远程桌面 - 用户模式(TCP-In)规则默认是启用的如果你手动关过或者装了第三方安全软件需要重新放行。还有一个很反直觉的点Windows 客户端版本比如专业版、企业版同一时间只允许一个交互式会话。也就是说你从外面连进去的时候坐在那台机器前面的人会被踢到登录界面。这一点在给同事做支持的时候尤其要注意别以为是网络断了。3. frps 服务端落地从配置文件格式的坑说起服务端是整个方案的锚点配好之后基本就不用再动了。但这里藏着一个几乎人人都会踩的坑frp 在 v0.52.0 版本做了一次配置格式的大改把沿用多年的 ini 全面换成了 toml/yaml/json同时把一堆配置项重命名了。你在网上搜到的绝大多数中文教程还是 ini 格式的直接抄过来会得到一句parse config error而且报错信息不一定告诉你错在哪。3.1 别照抄老教程ini 到 toml 的那次断裂这次变更不是简单的换个后缀名而是字段结构性重排。最典型的几个对照关系是这样的老写法ini新写法toml说明[common]段 token xxxauth.method tokenauth.token xxx鉴权从顶层字段收进了 auth 组tls_enable truetransport.tls.enable true传输层配置统一归到 transportmax_pool_counttransport.maxPoolCount连接池同理[webServer]段webServer.addr/webServer.port从独立段落变成点分字段authentication_methodauth.method与 token 同一组所以判断一份配置能不能用的最快方法就是看它有没有[common]这个段落标记。只要有那它一定是给 v0.52.0 之前的版本写的要么降级使用旧版要么自己动手翻译成 toml。3.2 frps.toml 逐行说明下面这份是我目前在用的服务端配置注释直接写在配置里方便对照。# frps.toml bindPort 7000 # frpc 连过来的控制端口必须对 frpc 可达 auth.method token # 鉴权方式单机自用填 token 足够 auth.token 换成你自己的一长串随机字符 # 这个值 frpc 必须完全一致 # 管理面板出于安全考虑后面会建议限制来源 IP webServer.addr 0.0.0.0 webServer.port 7500 webServer.user admin webServer.password 再换一个强密码 # 限制 frpc 能申请的远程端口范围防止被乱用 allowPorts [ { start 7001, end 7010 } ] # 日志排错阶段建议把 level 调到 debug稳定后调回 info log.to /var/log/frps.log log.level info log.maxDays 7几个需要解释的设计意图。allowPorts看起来很啰嗦但如果你把远程端口范围放开万一哪天 frpc 的鉴权信息泄露了对方可以在你的服务器上申请任意端口把服务器当成跳板。限制成一个十位数的窄区间风险和收益的平衡是最好的。auth.token一定要用足够长的随机串别用生日、手机号或者123456这类我用的是本地生成的一段 32 位随机字符串。日志级别在调通之前设成debug因为很多连接问题只在 debug 日志里才有明确线索通了之后再改回info免得日志文件长得太快。启动 frps 只需要一句./frps -c ./frps.toml。新版 frp 还提供了一个特别好用的校验命令./frps verify -c ./frps.toml它只检查配置文件语法和字段合法性不实际启动服务配置写错的时候用它定位比看运行日志快得多。frpc 那边同样有frpc verify -c ./frpc.toml这两个命令属于用一次就回不去的级别。3.3 用 systemd 把 frps 托管起来手动前台运行只适合调试正式用一定要交给 systemd否则 SSH 一断 frps 就没了。新建/etc/systemd/system/frps.service[Unit] Descriptionfrp server Afternetwork.target [Service] Typesimple Usernobody Restarton-failure RestartSec5s ExecStart/usr/local/frp/frps -c /usr/local/frp/frps.toml [Install] WantedBymulti-user.targetRestarton-failure加RestartSec5s这两行是必加的。云主机偶尔会因为内存回收、网络抖动把进程干掉有了自动重启你第二天起床发现连接还在。改完之后systemctl daemon-reload systemctl enable --now frps再用systemctl status frps确认一下状态是 active。提示Usernobody是为了降权但要注意日志目录的写权限。如果你把log.to指到/var/log/frps.log需要提前给对应目录放权否则服务会启动失败但状态看起来像是运行中——这种情况用journalctl -u frps -n 50一查就清楚了。3.4 仪表盘别裸奔在公网上frps 自带的 web 面板很好用能看到当前的连接数、每条转发规则的实时流量排错的时候非常省事。但它默认是 HTTP 明文而且 7500 这个端口被扫描的频率相当高把它开在0.0.0.0相当于把家门钥匙挂在门上。我的做法是在安全组里把 7500 的来源限制成自己常用的几个 IP出差换了网络就临时改一下规则如果懒得每次改用 SSH 端口转发把面板映射到本地也是个选择——在本地执行ssh -L 7500:127.0.0.1:7500 user服务器IP然后浏览器访问http://127.0.0.1:7500就能看到面板全程不对公网暴露。4. frpc 客户端把内网 3389 映射到公网端口客户端这一侧是跑在 Windows 上的也是很多人第一次接触 frp 会觉得别扭的地方——毕竟在 Windows 上装服务、看日志、配开机自启跟 Linux 上的习惯不太一样。我按先跑通、再做服务、最后排查的顺序讲。4.1 frpc.toml 的最小可用配置先给一份最朴素的 TCP 中转配置它的目标只有一个把内网的 3389 映射到公网服务器的 7001 端口。# frpc.toml serverAddr 你的服务器公网IP serverPort 7000 auth.method token auth.token 和服务端完全一致的那串字符 transport.tls.enable true # 控制通道加密建议开启 loginFailExit false # 登录失败不要退出方便网络恢复后自动重连 log.to frpc.log log.level info log.maxDays 3 [[proxies]] name rdp-tcp # 规则名全局唯一即可 type tcp localIP 127.0.0.1 localPort 3389 remotePort 7001这里有三个地方值得单独说。第一localIP填127.0.0.1而不是本机的局域网 IP。因为 frpc 和远程桌面服务跑在同一台机器上回环地址是最短路径不经过网卡也不受局域网 IP 变化的影响——办公室机器换个网段、插拔网线导致 IP 变了配置都不用改。第二transport.tls.enable我建议打开。它加密的是 frpc 到 frps 之间的控制通道和转发数据虽然远程桌面自己也有加密但多一层没坏处代价只是极小的 CPU 开销。第三loginFailExit false是给做成服务这个场景准备的。默认值是真意味着 frpc 一旦登录失败就直接退出进程如果它作为系统服务运行退出之后就只能等你手动启动。改成 false 之后它会一直在后台重试服务器重启、网络波动、临时改配置都不会让它彻底躺平。4.2 在 Windows 上把 frpc 装成服务把 frpc 装成 Windows 服务的方案有几种用 NSSM、用 WinSW、或者直接用系统自带的sc。我更倾向最后一种因为不需要额外下载任何东西。以管理员身份打开命令提示符执行sc create frpc binPath C:\frp\frpc.exe -c C:\frp\frpc.toml start auto sc description frpc frp client for remote desktop sc failure frpc reset 86400 actions restart/5000/restart/5000/restart/5000sc命令有个特别反人类的语法要求binPath、start这些等号后面必须跟一个空格写成binPathC:\...会直接报参数错误。我第一次配的时候在这里卡了十分钟一直在怀疑路径里有中文。sc failure那行是配置失败恢复策略如果服务异常退出5 秒后重启一天内重置计数。配合前面loginFailExit false基本可以做到配好之后就不用管了。启动服务用sc start frpc看状态用sc query frpc。另外还有一个很多人不知道的细节Windows 服务的运行账户默认是LocalSystem它是可以访问回环地址的但如果你改成了自定义账户就要留意那个账户有没有权限访问网络。另外Windows 防火墙可能会在 frpc 首次运行时弹窗询问是否允许网络访问一定要选允许否则它连不出去。4.3 连不上时我按这个顺序排查连不上是常态别慌按层次往下剥就行。我总结的顺序是从内到外先看 frpc 日志。日志里会明确写login to server success还是dial tcp ... connectex: ...失败。前者说明控制通道通了问题在转发规则或本地服务后者说明根本连不上服务器问题在网络或端口。确认 3389 在监听。netstat -ano | findstr :3389没有输出就去检查远程桌面开关和系统版本。确认控制通道。在服务器上执行ss -lntp | grep 7000看 frps 有没有在监听systemctl status frps看进程有没有活着。确认端口放行。服务器上firewall-cmd --list-ports或ufw status云控制台的安全组再核一遍来源 IP 限制。确认端口没被占用。frpc 日志里如果出现port already used说明remotePort在服务器上被别的程序占了换成 7002 试。确认两端版本接近。frps 和 frpc 版本差异过大时可能出现登录协议不兼容日志里的提示通常比较隐晦直接统一到同一版本最省事。这套顺序的价值在于它是自下而上的先用日志把问题锁定在哪一层再针对性检查比漫无目的地改配置快得多。5. xtcp 的 UDP 打洞让远程桌面的流量绕开服务器到这一步远程桌面其实已经能用了。但只要你用上几天就会开始在意两件事一是服务器带宽不够的时候画面会卡二是每天的流量都在烧钱。xtcp 就是为了解决这两件事而存在的也是这个方案里我最想讲清楚的部分。5.1 打洞这件事五分钟讲明白UDP 打洞的核心前提是大多数 NAT 设备在转发 UDP 的时候只要内网主动向某个外部地址发过一个包NAT 就会临时记住这个内网端口对应那个外部地址并在接下来的一段时间里允许对方从这个地址回包进来。这个临时记住就是洞。整个过程分三步。第一步内网的 A 机器和外面的 B 机器都连上 frpsfrps 通过它们各自的出口地址判断出它们的 NAT 类型和公网出口。第二步frps 把彼此的出口地址告诉对方A 和 B 同时向对方的出口地址狂发 UDP 包。第三步A 发出去的包让 A 的 NAT 记住 BB 发出去的包让 B 的 NAT 记住 A两边一旦收到对方的包洞就成了之后数据直接在这条通道上跑。听起来很美好但它成立的前提是 NAT 足够宽容。家庭路由器的 NAT 通常比较宽松办公网络的出口设备就未必了。这也是为什么同一套配置在家里能打通、在公司就打不通。5.2 两端加服务端配置差在哪xtcp 的配置跟 TCP 模式最大的区别是除了内网那台被访问的机器访问方也要跑一个 frpc。访问方那一侧的 frpc 角色叫 visitor它不在服务器上开端口而是在本机开一个监听端口你连本机的这个端口就相当于连到了远端。先看被访问端办公室那台 Windows新增的规则[[proxies]] name rdp-p2p type xtcp secretKey 两端共享的密钥越长越好 localIP 127.0.0.1 localPort 3389 transport.useEncryption true transport.useCompression true再看访问端你随身带的笔记本的配置它是一个独立的 frpc 实例可以跟上面那份放在同一台机器上也可以分开serverAddr 你的服务器公网IP serverPort 7000 auth.token 和服务端完全一致的那串字符 [[visitors]] name rdp-p2p-visitor type xtcp serverName rdp-p2p # 必须和被访问端那条规则的名字一致 secretKey 两端共享的密钥 bindAddr 127.0.0.1 bindPort 13389 # 本机监听的端口mstsc 连的就是它连的时候你用远程桌面客户端连127.0.0.1:13389流量会先尝试打洞直连成功后就直接指向办公室那台机器的 3389。注意bindAddr填127.0.0.1是出于安全考虑只允许本机访问这个端口如果你想在局域网内让其他设备也通过这个笔记本中转可以改成0.0.0.0但要清楚这意味着同一个局域网里所有人都能用。注意serverName必须严格等于被访问端那条 xtcp 规则里的name一个字符都不能差包括大小写。这个错误在日志里表现为找不到对应的服务新手很容易在这里卡住。5.3 打不通是常态NAT 类型与退路设计我踩过最大的一次坑是在公司的网络里折腾了半小时才意识到问题不在配置。办公网络的出口大多是会话型 NAT 甚至对称型 NAT这种设备会为每一次外出连接分配不同的出口端口导致 frps 告诉对方的那个地址根本对不上洞永远打不成。判断方法其实不复杂看访问端的 frpc debug 日志如果反复出现打洞尝试但始终没有建立连接基本就是 NAT 不配合。几种常见的情况是这样的场景打洞成功率说明两端都是家用路由器 NAT很高最常见的成功场景一端家宽、一端办公网中等取决于办公网出口设备类型一端连手机热点偏低移动网络常用会话型 NAT两端都在企业内网很低建议直接退回 stcp 或 tcp既然打洞不保证成功就一定要设计退路。较新版本的 frp 在 visitor 配置里提供了 fallback 机制你可以让这条 xtcp 规则在超时之后自动退回到一条 stcp 规则上[[visitors]] name rdp-p2p-visitor type xtcp serverName rdp-p2p secretKey 两端共享的密钥 bindAddr 127.0.0.1 bindPort 13389 fallbackTo rdp-stcp # 打洞失败时退回到这条 stcp 规则 fallbackTimeoutMs 500想用这个能力被访问端需要额外配一条名字叫rdp-stcp的type stcp规则参数和 xtcp 那条基本一样。这样最终的体验就是能直连就直连直连不了就自动走服务器中转你在远程桌面这一侧感知不到切换最多是画质有一点差别。这个设计思路值得学——任何依赖环境配合的技术方案都应该准备一条确定能用的兜底路径。另外不同版本对 xtcp 的支持程度不一样有的版本提供过用于保持通道的选项有的已经改成了按需建立。我的建议是如果你的版本里有类似保持通道的开关可以打开试试没有也不用纠结xtcp 本身的按需打洞已经够用了。5.4 打通之后感受上的差别在哪里真打通之后最直观的变化是画质。原来走服务器中转时如果服务器只有 2 Mbps滚动一个长网页会有肉眼可见的撕裂和延迟切到打洞直连之后只要两端之间的实际网络质量还行画面会顺很多跟局域网内直接连远程桌面非常接近。第二个变化是服务器侧的负担。P2P 通道建立之后服务器那边只剩下每分钟几 KB 的心跳流量一个月下来可能还不到一百 MB。这一点对于按流量计费的云主机来说差别巨大我自己的账单从每月十几块降到了基本可以忽略的程度。第三个变化比较微妙延迟。走服务器中转时链路的物理路径是你 → 服务器 → 内网机器如果你的服务器和你在同一个城市还算好跨区域的话延迟就会叠加。直连之后路径变成两点之间最短输入延迟和画面响应都会更跟手。6. 远程桌面本身的调优隧道只是管道把隧道打通之后很多人就停手了其实远程桌面的体验还有相当大一块空间可以挖。这一章讲的东西跟 frp 无关但会实实在在影响你每天用它的感受。6.1 RDP 的 UDP 通道和 frp 的边界从 Windows 8 开始远程桌面协议除了大家熟知的 3389/TCP 之外在支持的场景下还会尝试建立一条 UDP 传输通道用来承载图形和输入数据目的就是改善画面流畅度和输入延迟。这跟 frp 的 UDP 打洞是两件完全不同的事前者是远程桌面协议自己的一条优化通道后者是 frp 用来建立隧道的机制。这里有一个很容易被误解的边界frp 的 xtcp 虽然名字里有 UDP但它承载的仍然是 TCP 流量打洞用的 UDP 只是建立 P2P 通道的手段。所以远程桌面自己那条 UDP 通道是走不到 xtcp 里的。如果你真的想让 3389/UDP 也能通只能单独配一条type udp的转发规则而且这条规则是走服务器中转的没有 P2P 的能力。我的实际做法是直接放弃这条 UDP 通道。原因是在打洞直连的前提下网络延迟本来就已经很低RDP 的 UDP 优化能带来的边际收益非常有限而多配一条 UDP 转发规则意味着要在服务器上多暴露一个端口多一份维护成本。这个取舍我觉得偏保守但确实省事。6.2 mstsc 那几个参数改完体验差一截远程桌面客户端本身的设置对体验影响很大这部分很多人从来没点开过。在连接之前点显示选项几个值得调的地方显示配置里的颜色深度。如果你主要用来看文字和代码从最高质量降到16 位色甚至15 位色带宽占用能降一半以上肉眼几乎看不出区别。分辨率也可以适当降低从 1080p 降到 1600x900 在很多场景下完全够用。体验选项卡里的连接速度选择。这个选项会一次性调整一批底层参数字体平滑、桌面背景、菜单动画、视觉样式等直接选调制解调器或者低速宽带是最省事的做法它会自动帮你关掉一堆华而不实的效果。如果你确实需要保留视觉样式可以手动勾选但把桌面背景和字体平滑关掉。本地资源里的打印机和剪贴板。剪贴板建议保留跨机复制粘贴的便利性太高打印机和智能卡如果你用不上关掉能减少一些初始化开销。如果经常连同一台机器把配置保存成.rdp文件以后双击就行不用每次重新输地址和改设置。还有一个隐藏设置在.rdp文件里手动加一行networkautodetect:i:0可以关闭网络自动检测。这个功能在网络质量波动大时反而会频繁调整压缩策略导致画面忽好忽坏关掉之后表现更一致。6.3 画质、延迟、带宽的三角取舍这三者永远不可能同时最优必须根据你的实际用途定策略。我的划分方式是这样的使用场景优先保证建议设置看代码、改配置、跑命令输入延迟16 位色关闭全部视觉效果看文档、回邮件带宽中等分辨率关闭桌面背景演示、看图、简单设计画质32 位色保留字体平滑看视频基本别想走本地方案远程桌面不适合最后一行是实话。远程桌面协议是为办公场景设计的它对静态画面做增量编码画面大面积快速变化时效率和效果都会急剧下降。如果你有在远端看视频的刚需任何隧道方案都救不了应该换思路解决。7. 放到公网之前的加固清单这一章可能比前面所有配置加起来都重要。一台能被远程访问的 Windows 机器本质上是把内网的一个入口暴露给了整个互联网如果只靠把端口改得奇怪一点来防那基本等于没防。7.1 不要让 3389 或者映射端口对全网敞开优先用 stcp 或 xtcp这两种模式在服务器上不会开任何公开端口只有拿着同样密钥的另一端才能访问公网扫描器扫到它们只会得到端口不存在。这是我推荐所有长期使用的场景都往这两个模式迁移的核心原因。如果你确实需要 TCP 直连模式那就至少做两件事把remotePort换成一个不常见的端口号虽然安全性提升有限但能挡掉绝大多数无差别扫描以及在云安全组里把这个端口的来源限制在你自己常用的几个 IP 段。这两条组合起来暴露面就小得非常多了。顺便说一个很多人问过的问题改本机 3389 端口有没有用。我的看法是作用有限因为 frp 是通过回环地址访问本机服务的改不改端口对外都看不出来而内网本身如果已经被人进来了改端口也挡不住。7.2 账号策略这一层比隧道更关键隧道再安全账号被人暴力破解了也是白搭。几个我认为必须做的账户锁定策略。在本地安全策略里配置账户锁定阈值比如连续输错 5 次就锁定 15 分钟。这条能有效拖慢自动化爆破的速度成本极低。不要用 Administrator 作为日常登录名。即使不能重命名内置管理员账户也建议新建一个普通账户用于远程登录把管理员账户留着做后台维护。密码强度。远程访问的账户密码至少 16 位包含大小写、数字和符号。听起来很烦但这个账户的密码泄露的后果是整台机器被人接管。不要开启记住我的凭据尤其是公用设备上。开启网络级别身份验证NLA。这个选项在sysdm.cpl的远程选项卡里开启后连接方必须在建立会话之前完成身份验证能挡掉相当一部分会话层的攻击尝试。7.3 frp 自身的鉴权、日志与版本frp 这一侧有三件事要盯住。第一是auth.token的强度它相当于整条隧道的总钥匙一旦泄露对方可以在你的服务器上申请端口、建立转发。第二是面板的访问控制前面已经说过7500 端口不要对全网开放。第三是版本frp 的更新节奏不慢历史版本里出现过一些需要关注的修复我习惯每季度去官方发布页看一眼最新的版本号顺手升级一次。日志也要定期看一眼。frps 的日志里如果出现大量来自陌生 IP 的登录失败记录说明你的 7000 端口已经被扫到了这时候应该立刻把来源限制收紧。同样Windows 那边的事件查看器里安全日志中如果出现大量 4625 事件登录失败说明远程桌面正在被撞这时候账户锁定策略的作用就体现出来了。8. 踩过的坑和报错速查这一章把前面散落的问题集中整理一下方便你出问题时直接对号入座。8.1 报错对照表现象 / 日志关键词大概率原因处理方式parse config error用了旧版 ini 配置或 toml 语法写错用verify命令校验检查是不是有[common]段login to server failedtoken 不一致、端口没通、服务器没启动核对 token检查安全组和systemctl statusport already used申请的远程端口被占换remotePort或检查allowPorts范围端口监听正常但连不上Windows 防火墙拦了 frpc允许 frpc.exe 的网络访问连上立刻断开同一个账户已有会话了解 Windows 客户端单会话限制XTCP反复重试无果NAT 类型不配合换网络环境或启用 fallback 退回 stcpvisitor 报找不到服务serverName与规则name不匹配逐字符核对含大小写服务显示运行中但没效果配置路径错误或权限不足看journalctl和日志文件的实际路径8.2 几条反直觉的经验第一条是关于版本一致性的。我一直建议 frps 和 frpc 保持同一版本因为跨版本时某些字段的默认值和协议细节会变出现的现象往往不是明确的报错而是能连上但行为诡异比如转发规则不生效、日志里出现莫名其妙的告警。统一版本能省掉这类排查。第二条是别在调试阶段就把 frpc 装成服务。服务模式下你看不到控制台输出日志文件的位置又可能因为工作目录不对而找不到。我的习惯是先用命令行前台跑一遍确认连接正常再去做服务化。第三条是关于日志级别的。debug级别在排查打洞问题时几乎是必需的但平时开着会让日志文件涨得飞快尤其是带宽统计类的输出。我现在的做法是先设成debug问题解决后立刻改回info并且把log.maxDays设成 3 到 7 天让旧的自动清理。第四条是要接受没有一劳永逸的方案。同一个配置在家里能打洞成功去公司可能就只能退回中转出差住酒店又换一种表现。我现在已经习惯了包里同时带着 xtcp 和 stcp 两套配置需要的时候切一下 visitor 的serverName就完事比反复折腾网络环境高效得多。最后分享一个小技巧如果你有不止一台机器需要远程访问不必为每台都配一个单独的 frpc 实例。同一台机器上跑一个 frpc 完全可以配置多条转发规则只要name和remotePort不冲突就行访问端那边相应地建多个 visitor每个绑一个本机端口。我在笔记本上就是这样管理的bindPort从 13389 开始依次往上排一眼就能看出哪条对应哪台机器。真正需要分开跑的只有那些位于不同内网的机器因为它们各自需要独立的 frpc 去连接服务器。
返回列表