You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Torrent Tracker无手动端口转发做种方案咨询:NAT-PMP及替代方案

问题

我出于爱好开发了一个Torrent Tracker,现在想找不需要手动端口转发就能做种的方案。试过NAT-PMP和UPnP,但UPnP搜不到设备,NAT-PMP也无法正常工作,求通用可行的解决办法。

尝试过的NAT-PMP代码

void nat_pmp_request(boost::asio::io_service& io_service, const std::string& gateway, unsigned short int local_port, unsigned short int external_port) {
  udp::socket socket(io_service, udp::v4());
  udp::endpoint endpoint(boost::asio::ip::address::from_string(gateway), 5351); // NAT-PMP网关IP和端口
  unsigned char request[] = {
    0, 0, 0, 2, // NAT-PMP版本(2)
    0, 0, 0, 0, // 保留字段
    0, 1, // NAT-PMP操作码(端口映射请求)
    0, 0, // 保留字段
    (external_port >> 8) & 0xff, external_port & 0xff, // 目标外部端口(网络字节序)
    (local_port >> 8) & 0xff, local_port & 0xff, // 本地端口(网络字节序)
    0, 0, 0, 0, // 映射生命周期(0表示直到主动删除才失效)
    0, 0, 0, 0  // 保留字段
  };
  socket.send_to(boost::asio::buffer(request, sizeof(request)), endpoint);
}

// 主函数
boost::asio::io_service io_service;
nat_pmp_request(io_service, "192.168.0.1", 49905, 49905);
io_service.run();
通用可行方案
  • 修复NAT-PMP实现:你的代码仅发送了请求未处理响应,NAT-PMP需要等待网关返回响应确认映射是否成功;另外不要硬写网关IP,可通过读取系统路由表或DHCP请求自动获取;同时要确认网关是否开启了NAT-PMP功能,以及请求的字节序是否完全符合协议规范。
  • STUN/TURN协议:STUN可检测公网IP和端口,让其他节点通过检测到的信息建立连接;若STUN失效,TURN可作为中继服务器转发流量,缺点是需依赖第三方服务或自行搭建TURN服务器。
  • 内网穿透工具:使用FRP、Ngrok这类工具,将本地做种端口映射到公网服务器的端口,无需路由器支持UPnP/NAT-PMP;自行搭建服务器成本较低,第三方服务可能有带宽限制。
  • DHT网络辅助:确保Tracker客户端支持DHT,即使无端口映射,DHT可通过节点中继让其他用户发现你,虽连接速度较慢,但能保证做种可用性。
  • 被动模式做种:若主动端口映射均失败,可采用被动模式,仅接收其他节点发起的连接。此模式无需对外暴露端口,但只能作为被动节点参与 swarm,依赖其他有公网端口的节点中转连接。

内容的提问来源于stack exchange,提问作者NexaHn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:32:10