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就是一个五元组。
        这一点正是给了我们一点启示,那就是可以通过尝试不同端口,直到找到没有被改变源端口的那次连接。而印证这一点也很容易,那就是打洞成功。这也从反方面说明没有必要存在外部服务器了,因为它根本帮不上什么忙。

  • 1
  • 2
  • 下一页

相关内容