Linux对称NAT的UDP穿越
和同事讨论UDP打洞技术,后做了一个简单的实验,由于Windows上设置NAT以及察看其原理太麻烦或者根本就不可能,于是还是使用Linux做了实验,发现基于Linux ip_conntrack这种对称NAT也能很简单的实现UDP穿越,实验很简单,并且这种UDP穿越还不需要公网服务器的协助(因为它们对于对称NAT或者基于连接的NAT根本帮不上什么忙),很实用。在展示实验之前,首先要明白以下的知识点。
1.Linux的NAT是基于ip_conntrack的
这一点说明仅仅针对五元组决定的一个连接的第一个数据包进行NAT规则的查找和匹配并存入ip_conntrack结构体,后续的包自动应用ip_conntrack结构体中的NAT信息进行NAT。由于五元组标示了一个连接,因此:
1).即使是同一个内网主机发起连接,最终很大程度上也不一定能被转换成同一个(IP地址,协议端口)对
2).目的地址不同,就不是同一个连接,因此绝不可能做到像cone NAT那样的偷梁换柱的效果
2.Linux目前还没有实现cone NAT的模块
Linux的NAT是处于Netfilter模块中的,标准协议栈中没有任何相关支持,那么只要Netfilter不支持cone NAT,Linux NAT就别指望能被常规方式打洞。3.Linux的NAT尽力不改变连接的源端口
Linux的NAT是通过iptables工具配置的,对于隐藏内网主机这种类型的NAT是iptables的SNAT实现的,如果你man iptables将会发现:--to-source [ipaddr[-ipaddr]][:port[-port]]
which can specify a single new source IP address, an inclusive range of IP addresses, and optionally, a port range (which is only valid if the rule also specifies -p tcp or -p udp). If no port range is specified, then source ports below 512 will be mapped to other ports below 512: those between 512 and 1023 inclusive will be mapped to ports below 1024, and other ports will be mapped to 1024 or above. Where possible, no port alteration will occur.
注意最后一句,Linux尽力不改变连接的源端口,除非和另一个tuple相冲突,我们知道一个tuple就是一个五元组。
这一点正是给了我们一点启示,那就是可以通过尝试不同端口,直到找到没有被改变源端口的那次连接。而印证这一点也很容易,那就是打洞成功。这也从反方面说明没有必要存在外部服务器了,因为它根本帮不上什么忙。
相关推荐
missingmuch 2020-05-26
仁鱼 2020-02-12
DumbbellYang 2020-05-07
xx0cw 2020-05-07
SZStudy 2020-04-21
diediexiaomi 2020-04-10
安得情怀似旧时 2020-03-04
OwenJi 2020-01-17
xx0cw 2019-12-13
Lovexinyang 2019-11-17
Jesuslovesme 2010-05-05
LeoHan 2015-08-11
linux爱好者 2010-11-18
thlm0 2019-10-21
batoom 2011-09-23
linuxvfast 2018-03-20
Fangxingt 2019-04-10
dasheng0 2018-03-20