资讯动态

UBNT ER-X配置DDNS与frp内网穿透的完整指南

发布时间:2026/9/16 20:48:20 来源:尧图企业网站定制
UBNT ER-X的一体化网络方案DDNS动态域名解析与frp内网穿透的完整落地作为一个常年和网络设备打交道的人我折腾过的路由器不在少数但UBNT EdgeRouter X以下简称ER-X一直是我印象很深的一款。这小家伙体积不大接口齐全基于EdgeOS的配置逻辑相当灵活唯一的问题就是它默认的Web界面把很多高级功能藏得太深甚至有些功能压根没做进图形界面。这次我把ER-X的DDNS动态域名解析和frp内网穿透服务完整跑通了一遍从思路拆解到逐个按钮的操作从云主机上的frps服务端到ER-X上的frpc客户端全程记录下来给同样在折腾的朋友们一个可以直接照着抄的作业。之所以把DDNS和frps放到一起搞是因为这两个东西其实是配套的。光有DDNS你只是把家里的动态公网IP映射成了一个固定域名但运营商封端口、光猫桥接不彻底、部分场景下没有公网IPv4等问题会导致你即使拿到了域名也连不进家里的服务。光有frp内网穿透你又必须在一台有公网IP的服务器上部署frps而目标地址写什么、动态IP变了怎么办这就又回到了DDNS的问题上。把两者结合等于用DDNS解决“找到家”的问题用frp解决“穿透进家”的问题这套组合在远程访问NAS、摄像头、开发调试、远程桌面等场景里都非常实用。如果你手头也有一台ER-X、一台云服务器又恰好想在公网安全地访问家里内网的服务那么这篇文章会很适合你。我不打算只贴几条命令交差了事而是会把每个操作背后的原因、坑点、以及我踩完之后的解决方案全部展开讲清楚。1. 方案整体设计与思路拆解1.1 这套组合解决的核心问题先说一个没有接触过内网穿透的朋友最常问的问题我都已经有公网IP了为什么还要用frp做穿透现实中的情况往往是你确实在光猫或者路由器的WAN口上拿到了一个公网IPv4地址但这不代表你就能愉快地访问家里的服务。第一步你需要在光猫里做端口映射把公网侧的某个端口映射到内网主机的某个端口。如果光猫是桥接模式、由ER-X直接拨号这一步还好办但如果是运营商默认的“光猫路由一体机”那光猫本身就占了一层NAT你还需要在光猫和ER-X两层设备上都做映射这种“双层NAT”的环境最容易出问题。第二步即便映射做好了运营商还经常封掉80、443这些常用端口导致你无法以默认端口建站或提供HTTPS服务。第三步如果你的IPv4地址是动态的每次重拨都要改一次映射目标和DDNS记录想想都头大。frp的出现本质上是为了绕过这些“不自由”。你在一台有公网IP的云服务器上运行frps服务端在ER-X上运行frpc客户端由客户端主动向服务端建立一条长连接。外部用户访问时请求先到达云服务器上的某个公网端口frps再通过这条已经建立好的加密通道把流量转发到你家里的内网设备上。这样做的优势非常明显不需要在光猫或路由器上做任何端口映射不需要知道你家里的公网IP到底是动态还是静态甚至内网设备没有公网IP也能被访问到。而DDNS在这套方案里的角色则是把“云服务器的IP地址”固定成一个好记的域名。云服务器的IP一般是静态的按理说你直接访问IP也行。但问题在于如果你后续要换一台云服务器、或者给服务器挂SSL证书用IP硬编码的方式就非常不灵活。通过DDNS把域名解析到frps所在服务器的IP再让frpc配置文件里的serverAddr直接填写这个域名你会发现后续的维护工作会轻松太多。1.2 工具选型为什么是frp而不是ngrok在提及内网穿透时很多人脑海中首先蹦出来的工具是ngrok。确实ngrok的火爆程度非常高尤其是在开发调试场景下一条命令就能把本机的某个端口暴露到公网体验相当丝滑。但如果你把ngrok放到ER-X这样的嵌入式路由器上来跑问题就来了。ngrok官方客户端的二进制体积相对较大对MIPS架构的兼容性做得并不好。ER-X使用的是MIPS 1004Kc处理器属于比较老的MIPS架构很多现代工具链编译出来的二进制根本没法在上面运行。frp在这方面就要友好得多。frp由Go语言编写在交叉编译方面非常成熟官方Release页面会直接提供MIPS架构的预编译版本比如frp_0.61.0_linux_mips.tar.gz拿下来直接在ER-X上就能跑不需要自己折腾交叉编译。除了平台兼容性frp在功能设计上也更符合“自建服务”的定位。ngrok的客户端是免费开源的但服务端长期放在官方服务器上自建ngrok服务端的配置复杂度反而比frp更高。而frp从诞生之初就主打自建服务端frps和客户端frpc的配置都非常直观支持的代理类型包括TCP、UDP、HTTP、HTTPS、STCP等稳定性也经过了大量生产环境的验证。对于想在ER-X这样的路由器上做长期内网穿透服务的人来说frp是比ngrok更可靠的选择。1.3 整体架构与数据流转我把这套方案的完整数据流转画在脑子里是这样的公网用户执行某个操作比如访问https://yourdomain.com或者通过SSH连接云服务器的某个端口。这个请求首先由DNS解析将yourdomain.com解析到云服务器的公网IP。云服务器上的frps服务端监听两个端口一个是与frpc建立控制连接和转发数据流的服务端口默认7000另一个是映射给外部用户访问的端口比如6000。frpc运行在ER-X上主动向frps的7000端口发起连接并声明“我这边有一个SSH服务请你把我映射到你的6000端口上”。frps收到这个请求后就把6000端口上接收到的流量通过这条长连接全部转发给ER-X上的frpcfrpc再把它转到内网某台主机的22端口上。整个链路中ER-X不需要在WAN口上开放任何入站端口所有流量都是先由frpc主动出站建立连接再由这个既有连接反向承载数据。从配置角度看你只需要依次完成三件事配置DDNS让域名指向云服务器、在云服务器上部署frps并开放相应端口、在ER-X上部署frpc并配置好代理映射。下面我会按照这个顺序逐项展开。2. ER-X上的DDNS配置详解2.1 动态DNS服务商选择与ER-X的兼容性ER-X的EdgeOS内置了DDNS客户端支持的厂商列表很丰富常见的有DynDNS、No-IP、ChangeIP、DNSomatic等。但我在实际使用中发现很多国际服务商在国内访问速度不理想解析生效也偏慢。如果你是国内用户我更推荐使用国内服务商的DDNS服务比如阿里云的云解析DNS、腾讯云的DNSPod它们都提供API接口配合EdgeOS的custom DDNS配置项可以实现动态更新。用国内服务商还有一个额外的好处如果你后续想在frps上挂正式的SSL证书你会需要一套可控的DNS验证机制。阿里云和腾讯云都提供基于API的DNS验证方式配合acme.sh这类工具可以非常方便地自动签发和续期证书。而如果你用的是国内访问不稳定的海外DDNS服务商光是一次证书签名验证的请求都可能在网络链路上出问题。2.2 在ER-X上配置DDNS的分步操作EdgeOS的DDNS配置支持两种方式图形界面和命令行。图形界面的路径是“Dashboard - 右侧WAN口设置 - DHCP Client项 - Edit - DDNS”但这里的配置项比较简单有些自定义服务商没法在Web界面里直接写。因此我更推荐直接通过命令行操作这样可以做到精确控制。SSH登录到ER-X之后进入配置模式configure set service dns dynamic interface eth0 service-name dyndns set service dns dynamic interface eth0 host-name yourdomain.com set service dns dynamic interface eth0 login your-username set service dns dynamic interface eth0 password your-password set service dns dynamic interface eth0 protocol dyndns2 set service dns dynamic interface eth0 server members.3322.org commit save如果你使用的是阿里云DNSEdgeOS没有内置对应的协议通常的做法是使用一个轻量级的shell脚本配合cron定时执行。脚本的核心逻辑是通过调用阿里云DNS的API获取当前WAN口的IP地址然后对比域名当前的解析记录如果发现不一致就调用API更新解析记录。这个脚本可以放在/config/scripts/update_aliyun_ddns.sh然后通过EdgeOS的system task-scheduler配置每5分钟执行一次。configure set system task-scheduler task update-ddns executable path /config/scripts/update_aliyun_ddns.sh set system task-scheduler task update-ddns interval 5 commit save这样做的好处是即使WAN口IP被运营商重新分配最多5分钟内DDNS记录就会自动更新到最新值而frpc那边只需要用域名作为serverAddr不需要关心IP怎么变化。2.3 DDNS验证与ER-X的端口转发联动DDNS配置好之后需要验证三个关键的检查点。第一从任意一台公网机器上ping你的域名看返回的IP是否和你家里的公网IP一致。第二确认ER-X的WAN口IP确实是公网IP而不是运营商内网IP比如100.64.x.x段就属于运营商级NAT地址。第三检查云服务器的安全组和防火墙是否放行了frps相关端口。如果你发现DDNS解析出来的IP是一个100.64.x.x这样的保留地址这说明你处于运营商的CGNAT后面即使DDNS配置再正确也没有办法从公网直接访问到家里的路由器。这种情况下你就必须依赖frp这种主动出站的方案让内网设备先去访问外部服务器而不是等外部来访问你。说实话我遇到过好几个朋友卡在这一步他们一直以为是DDNS配置有问题反复折腾路由器最后才发现是运营商NAT的问题。所以如果你发现自己属于这种情况不要浪费时间去折腾端口映射直接跳到frp部分往下看。3. frps服务端搭建与部署细节3.1 frps应该部署在哪里frps是frp的服务端组件它必须运行在一台拥有公网IP的机器上。最常规的选择是购买一台云服务器阿里云、腾讯云、华为云、搬瓦工等等都可以配置要求不高1核1G的入门机型足够跑frps了。系统推荐选择Debian或Ubuntu的Server版本资源占用小维护也方便。也有一种比较硬核的做法是在ER-X上直接跑frps。ER-X的硬件配置虽然是MIPS双核内存只有256MB但跑frps这种轻量级服务其实是够用的。不过你需要特别注意如果frps跑在ER-X上那么外部用户访问时流量要先进入你家路由器再由路由器转发到frps进程然后再通过frps转发到内网设备。这等于还是在你的WAN口上开了入站端口对网络安全性要求更高而且一旦路由器的WAN口IP变化frps的对外服务地址也会跟着变DDNS就变成了必须品。我更推荐的是把frps部署在云服务器上而把frpc部署在ER-X上这样WAN口不需要开放任何入站端口安全性高得多。3.2 frps配置文件的编写与参数解析在云服务器上部署frps第一步自然是下载对应的二进制文件。Go语言的跨平台编译在这时候体现出巨大优势你只需要根据云服务器的CPU架构选择合适的版本。目前主流的云服务器都是x86_64架构选择amd64版本即可。wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz tar -zxvf frp_0.61.0_linux_amd64.tar.gz mv frp_0.61.0_linux_amd64 /usr/local/frp cd /usr/local/frp编辑frps.toml文件新版frp使用TOML格式老版本是frps.ini注意区分bindPort 7000 auth.method token auth.token your-secure-token-change-me # 控制面板方便查看连接状态 webServer.addr 127.0.0.1 webServer.port 7500 webServer.user admin webServer.password change-this-password这里的bindPort是frps监听frpc连接的服务端口默认7000即可。auth.token是客户端连接时的认证凭据这个值一定要设置得足够复杂最好是一个至少16位的随机字符串。webServer是frp自带的监控面板可以查看当前的代理连接状态和流量统计虽然不算必需但强烈建议开起来。需要注意面板地址尽量绑定在127.0.0.1上或者通过安全组限制访问来源避免面板本身暴露在公网上成为攻击面。3.3 frps的systemd服务管理与防火墙放行为了让frps长期稳定运行并且开机自启我建议把它配置成systemd服务。在/etc/systemd/system/frps.service文件中写入[Unit] Descriptionfrp server Afternetwork.target [Service] Typesimple ExecStart/usr/local/frp/frps -c /usr/local/frp/frps.toml Restarton-failure RestartSec5s [Install] WantedBymulti-user.target然后执行systemctl daemon-reload systemctl enable frps systemctl start frps systemctl status frps注意如果你修改了frps.toml中的端口配置不要忘了在云服务器的网络安全组里放行相应的端口。这里有一个顺序问题经常被人忽略云服务器的安全组Security Group和操作系统自身的防火墙比如ufw是两层不同的机制两层都要放行才行。只放行系统防火墙而不放行安全组外部流量同样进不来。4. ER-X上frpc客户端的部署与关键配置4.1 在ER-X上安装frpc的详细步骤相比云服务器上部署frpsER-X上部署frpc的步骤要稍微绕一点主要原因是它的系统分区空间有限而且用的是MIPS架构。你在下载frp安装包时一定要选择MIPS相关的版本而不是x86版本。wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_mips.tar.gz tar -zxvf frp_0.61.0_linux_mips.tar.gz cd frp_0.61.0_linux_mips这里有一个容易踩的大坑MIPS有两种字节序大端还是小端。ER-X使用的是MIPS 1004Kc处理器属于小端序。因此下载的版本应该是文件名中带mipsle的版本例如frp_0.61.0_linux_mipsle.tar.gz而不是frp_0.61.0_linux_mips.tar.gz。如果你下载的是大端版本运行时会直接报“exec format error”。把frpc复制到持久化存储目录。ER-X的默认存储中/config目录是持久化的重启不丢失其他很多目录在系统升级后会丢失。为了持久化我把frpc和配置文件都放在了/config/frp目录下mkdir -p /config/frp cp frpc /config/frp/ cp frpc.toml /config/frp/如果需要开机自启可以使用EdgeOS的commit/export机制或者简单地把启动命令加入到/config/scripts/post-config.d/目录下这个目录下的脚本会在系统启动完成后自动执行。这也是EdgeOS推荐的扩展方式之一。4.2 frpc配置文件的编写与关键参数说明frpc.toml的配置决定了frpc要建立哪些代理通道以及这些通道要把内网流量映射到frps的哪些端口上。我建议先编写一个最小可用的配置验证基础链路通不通再去叠加更多代理规则。serverAddr yourdomain.com serverPort 7000 auth.method token auth.token your-secure-token-change-me [[proxies]] name ssh-nas type tcp localIP 192.168.1.100 localPort 22 remotePort 6022这段配置的意思是ER-X上的frpc会主动连接yourdomain.com的7000端口建立控制连接。然后声明一个名为ssh-nas的TCP代理frps在它的公网IP上监听6022端口任何发往云服务器6022端口的TCP流量都会被完整地转发到内网192.168.1.100的22端口上。这里有几个参数值得展开讲一下。serverAddr建议直接写DDNS域名而我前面提到的DDNS配置在这里就派上了用场。localIP和localPort指向的是你要访问的内网设备地址它可以是一台NAS、一个树莓派也可以就是你ER-X自己比如把localIP设为127.0.0.1就能代理ER-X自身提供的服务。remotePort是选端口时需要留意的点尽量选择大于1024的高位端口避免与frps自身服务端口冲突也避免使用云服务器上容易被扫描的常见端口。4.3 多代理配置和安全加固实践单条代理通道验证通过之后我们可以继续扩展配置把ER-X管理的整个内网里的远程桌面、摄像头管理、甚至家里的HTTP服务都代理出去[[proxies]] name rdp-office-pc type tcp localIP 192.168.1.50 localPort 3389 remotePort 63389 [[proxies]] name web-nas type tcp localIP 192.168.1.100 localPort 5000 remotePort 6500在多代理配置下有一个安全原则非常重要不要在公网暴露任何没有认证机制的服务。比如你如果直接把家里的摄像头管理页面的HTTP端口通过frp代理到公网那么任何人都可以通过云服务器的对应端口访问到你的摄像头后台。合理的做法是优先使用frp的stcp代理模式这种模式下frps只负责转发控制信令真正的数据流是frpc和另一个frpc客户端之间点对点建立的加密通道公网流量并不会在frps上进行明文暴露。STCP模式在复杂度和使用上都有一定门槛所以对于大多数用er-x做单边穿透的朋友更建议把“用户名密码认证”“IP白名单”这类能力放在应用层本身去解决。然后通过frp的transport.useEncryption和transport.useCompression参数开启传输层的加密和压缩。transport.useEncryption true transport.useCompression true开启加密会略微增加CPU开销但对于穿越公网的流量来说安全性收益远超那一点性能损耗。ER-X的MIPS CPU性能有限如果内网穿透的流量很大建议关闭压缩毕竟压缩是高CPU操作MIPS处理器跑高压缩率时反而可能成为瓶颈。5. 常见问题与排查技巧实录5.1 DDNS解析失败动态公网IP识别不到这是一个非常常见的问题。很多人配置好DDNS后发现域名解析出来的IP还是旧地址或者干脆解析不出来。第一步不是改配置而是先确认ER-X当前WAN口的IP地址到底是不是公网地址。登录ER-X的Web界面或者SSH执行show interfaces ethernet eth0查看返回的IP地址。如果地址落在10.x.x.x、172.16.x.x到172.31.x.x、192.168.x.x这些私有地址段内或者落在100.64.x.x到100.127.x.x这个运营商级NAT地址段内那么即使DDNS配置得再完美也没有太大的意义因为你的出口IP并不是全球唯一可路由的公网IPDDNS客户端拿到的只是运营商NAT池里的一个私有地址。如果确认WAN口是公网IP但DDNS解析还是不更新那就需要检查DDNS脚本本身。我遇到过的问题是脚本中获取IP的方式太死板使用类似curl ifconfig.me这种方式获取公网IP如果云解析API请求失败脚本就直接退出了。后来我把脚本改成了先在本地获取WAN口IP再与DNS解析结果比较只有不一致时才调用API更新同时把日志写入到/config/log/ddns_update.log方便排查。5.2 frpc连接frps失败授权与证书问题frpc启动后通过journalctl或者直接在命令行前台运行frpc来观察日志如果出现“login to server failed: authorization failed”这类错误那基本就是auth.token的值在frpc和frps两端不一致。这个排查起来不难但很容易因为“复制粘贴时多了一个空格”或者“特殊字符被shell转义”导致两边不匹配。如果日志显示“connection refused”则需要按这条链路逐层排查先确认云服务器上frps进程是否正常运行systemctl status frps看一下然后确认云服务器的安全组和系统防火墙是否放行了7000端口接着在云服务器本机用telnet 127.0.0.1 7000测试一下确认frps监听正常最后再从ER-X侧测试到云服务器的7000端口连通性。很多时候问题都出在安全组只放行了TCP入站规则却忘了放行对应的端口或者安全组规则绑定的云服务器实例不对。5.3 流量通了但访问很慢CPU占用过高frp本身对CPU的占用并不高但如果同时开启了useEncryption和useCompression在低端路由器上就会出现CPU满载、转发速率下降的情况。我推荐的调整策略是对于SSH、远程桌面等交互型应用保留加密但关闭压缩对于纯文本或者代码内容传输可以保留压缩对于NAS上的大文件传输则建议打开压缩因为大文件的内容重复度高压缩率可观。但如果你发现CPU还是很高就需要考虑是不是并发连接数太多或者是不是在frpc配置中把localIP写成了广播地址或非实际主机地址。另外MIPS架构下frp版本的选择也需要留意。frp在0.52.0版本之后对配置文件格式进行了调整同时社区也持续在完善对旧架构的支持。如果你下载的版本过新可能在老内核上运行时会遇到缺少某些系统调用的麻烦。如果你在ER-X上运行frpc时遇到段错误或者莫名退出不妨换用稍微旧一点的稳定版本比如0.50.0实测下来稳定度更好。6. 稳定性优化与长期维护心得frp跑起来只是第一步长期稳定运行才是真正的目标。我在使用过程中总结了几个特别值得注意的优化点。第一ER-X的系统存储空间非常有限frpc的日志如果一直无限制增长很容易把Flash空间占满导致配置无法保存、系统异常。所以务必在frpc的启动命令中加入日志轮转或者直接把日志输出到内存文件系统。我比较推荐的是把日志输出到tmpfs重启之后自动清空不占用持久化空间/config/frp/frpc -c /config/frp/frpc.toml /dev/null 21 注意这种方式在系统崩溃或者断电时不会留下任何日志不方便排查。折中的方案是把日志级别调高让frpc只输出警告和错误级别的日志平时不会刷大量信息。第二cron定时任务不仅要用在DDNS更新上还可以用来自动检测frpc进程的存活状态。我在ER-X的CRON中加了一条*/5 * * * * pgrep -f /config/frp/frpc /dev/null || /config/frp/frpc -c /config/frp/frpc.toml /dev/null 21 意思是每5分钟检查一次frpc进程是否存活如果挂了就自动拉起来。frpc本身也有重启策略但配合系统级的检测更加保险。第三云服务器上的frps日志同样需要注意如果长期不清理/var/log下的日志可能会撑满磁盘空间。可以在frps.service中加入日志轮转配置或者使用logrotate服务定期清理。对于DDNS和frp之间的联动还有一个值得一提的细节frpc的serverAddr一定要填域名而不是直接填IP。一旦serverAddr填的是域名那么frpc内建的DNS resolver会定期去解析这个域名即便DDNS更换了IPfrpc也会自动重连到新的地址。这样整套方案就有了抵抗IP漂移的能力。如果你在测试时发现frpc日志里反复出现连接超时不妨先在ER-X上用nslookup yourdomain.com确认解析结果是否已经变成最新的公网IP。最后再分享一个小技巧如果你担心frp的0.7000等默认端口被扫描器盯上可以在frps.toml中把bindPort改成其他高位端口例如18723并在frpc.toml中同步修改。这样做虽然不能从根本上避免被扫描但至少能减少大量无差别攻击的干扰。同时配合ipset或云服务器的安全组把frps的访问来源限制在可信的IP段安全系数会高很多。我个人的习惯是先改端口再用安全组限制来源IP等到真正需要从更多网络环境访问时再逐步放宽。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价