Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

求教tcp判断NAT类型的理论依据是什么? #120

Open
Cocoon-break opened this issue Nov 5, 2024 · 3 comments
Open

求教tcp判断NAT类型的理论依据是什么? #120

Cocoon-break opened this issue Nov 5, 2024 · 3 comments

Comments

@Cocoon-break
Copy link

Cocoon-break commented Nov 5, 2024

了解到三个RFC标准,发现并没有使用TCP判断NAT类型的具体说明。
RFC3489
RFC5389
RFC8489

@MikeWang000000
Copy link
Owner

MikeWang000000 commented Nov 6, 2024

关于 UDP,RFC3489 中有配有流程图:
https://www.rfc-editor.org/rfc/rfc3489#page-22

RFC 中确实没有对 TCP 进行分类,并且在 RFC5389 中废弃了原定的 UDP 分类。

Furthermore, classic STUN's algorithm for classification of NAT types was found to be faulty, as many NATs did not fit cleanly into the types defined there.

所以 Natter 的 TCP NAT 分类,是根据原先 RFC3489 中对 UDP 的 NAT 分类,类推而来的。
TCP 可以和 UDP 一样按 “包” 分析。将 TCP 的每个 “包” 的行为与 RFC 上的情况对应即可。

@Cocoon-break
Copy link
Author

关于 UDP,RFC3489 中有配有流程图: https://www.rfc-editor.org/rfc/rfc3489#page-22

RFC 中确实没有对 TCP 进行分类,并且在 RFC5389 中废弃了原定的 UDP 分类。

Furthermore, classic STUN's algorithm for classification of NAT types was found to be faulty, as many NATs did not fit cleanly into the types defined there.

所以 Natter 的 TCP NAT 分类,是根据原先 RFC3489 中对 UDP 的 NAT 分类,类推而来的。 TCP 可以和 UDP 一样按 “包” 分析。将 TCP 的每个 “包” 的行为与 RFC 上的情况对应即可。

理论上TCP的NAT分类和UDP的NAT分类应该保持一致,但是一些场景下出现不一致的情况。比如TCP_NAT结果是NAT3 (port_restricted)而UDP_NAT结果是NAT4(symmtric)。是不是表明无法直接通过类推UDP的方式来进行TCP检测?

@MikeWang000000
Copy link
Owner

理论上TCP的NAT分类和UDP的NAT分类应该保持一致,但是一些场景下出现不一致的情况。

理论上 TCP 和 UDP 的 NAT 情况会出现不一致。例如 OpenWRT 中常用的一个内核模块 Chion82/netfilter-full-cone-nat ,这个模块只实现了 UDP 的 Fullcone NAT,那么检测 TCP 结果就是 NAT 3,UDP 为 NAT 1。

同样的,ISP 处的 CGNAT 也会有类似情形。如果怀疑检测结果不准,可以用 stunclient 等工具手动测试。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants