Sijie.Sun
Sijie.Sun
下个版本就解决了。gui 可以用外挂服务方式执行
我感觉 upnp 应该映射 -l 的那个监听器吧,这样还可以复用 mapped-listener 功能
另外这个 upnp 库是同步库吧,在 tokio 里用会阻塞线程吧
我早前尝试过在尽可能少引入新依赖的前提下实现 upnp-igd 协议,commit 在这里,不过还没有完全调通,我的 openwrt 会报奇怪的错误。 https://github.com/EasyTier/EasyTier/commit/f272a1775ec75ce162b6d25db3355f128624a914#diff-fd68a3890144ee6ac17a4d82457cc42460e79b8d9fa195156aa48fe32c85ce20
> 如果WAN还走NAT,那还是有打洞需要,还要维持NAT Mapping状态 这里我没有很理解,假设网络拓扑是 A(EasyTier) -> B (Router) --- NAT1 --> C,A 在 B 上建立 upnp 映射,那么打洞实际是由 B 完成的吧。 我理解的过程是:A 发送 upnp 请求将 B 上的 54321 端口映射到 A 的 10010...
> NAT1的话这样可以,但是也需要复用Listener的端口/socket定时发送一些包保活NAT。我不确定现在是否已经有类似机制 UDP 端口是多路复用的,假设还是刚才的例子,C 在连接到 A 后,更上层会发心跳包保活的。保活包 src port 就是 10010,dst 是 C 的地址。 > 另外UPnP应该也能解决WAN是NAT2/3的问题,但打洞时也要复用Listener的端口/socket去发送。 NAT2/3 的话 UPnP 应该是无能为力的吧,UPnP 应该是只映射了入站,不会映射出站的。也就是说 A 节点发出的打洞包,不一定会走 B 上的对应端口。
> > UDP 端口是多路复用的,假设还是刚才的例子,C 在连接到 A 后,更上层会发心跳包保活的。保活包 src port 就是 10010,dst 是 C 的地址。 > > 如果是中途一段时间内暂时没有udp peer,是否会有问题呢? > > > NAT2/3 的话 UPnP 应该是无能为力的吧,UPnP 应该是只映射了入站,不会映射出站的。也就是说 A 节点发出的打洞包,不一定会走 B 上的对应端口。...
我考虑一下。这个 pr 有测试过不,路由器上可以正确增加新的 upnp entry 不
> 大佬如果想自己实现的话,可以看看是不是上述问题导致的。 按照你的方法来实现吧。我就不做重复工作了 > 但是client代码在构造upnp url时,对IPv6地址url的构造是错误的,导致会报错。 > 我在igd-next那边提的PR就是加了一下对IPv6 upnp地址的过滤。 为啥这里的修复不是让它构造正确的 url 呢