NAT网关自动去掉TCP syn包的时间戳
来源:互联网 发布:手机pppoe拨号软件 编辑:程序博客网 时间:2024/06/09 16:45
猛士设计了Netfilter,在失眠的时候就有事做了,安息日应守为圣日,否则会激怒神,因此双休日我一般不学习和工作,相反,我会在午夜玩一些自己喜欢的东西。我没有受过洗,不是因为不是笃信者,没有安息夜...
Padding: variable
The TCP header padding is used to ensure that the TCP header ends
and data begins on a 32 bit boundary. The padding is composed of
zeros.
在本文中,我心爱的NOP并不是为了填充的,而是为了用其替换时间戳选项。我不知道别的系统怎么处理NOP,反正在Linux中,是直接忽略NOP,而这种忽略正是提供了一种将时间戳选项替换为NOP的可能性。
该有的解释都在注释里面了。用户态的模块就不贴出了了,例行公事而已,没有任何逻辑,毕竟目前的版本YYY target不需要任何参数。
iptables -A FORWARD -p tcp -......-j YYY
接下来的时间里,你将不会再面对NAT设备的TCP timestamps的问题了。值得注意的是,由于TCP服务端仅仅针对新建连接来做检查,因此可以不必对非SYN包来做YYY target,我自己在测试的时候,抓包结果如下:
NAT和timestamps问题
这个问题就不多说了,总之,NAT设备将所有数据包的大量不同的源地址都转换为了单一的或者少数几个地址,这个转换动作和TCP服务器的PAWS机制一起工作的时候会导致无法新建连接的问题。解决办法
简单的讲,解决办法有两个,一个是在客户端禁掉TCP的时间戳机制,另一个是在TCP服务端禁掉TCP的时间戳机制,可是一般而言,这两个地方都不是我们所能控制的,比如,你能禁掉每一个智能手机的TCP时间戳,也不能指望手机用户去做这件事,你同样也不能指望可以顺利地禁掉服务器的TCP时间戳,于是,第三个办法就出炉了,那就是在中间的NAT设备上修改掉TCP数据包,实际上只要修改TCP初始化的SYN包即可,将时间戳选项去掉,只所有这么做是可行的,归功于TCP协议和IP协议的协议头是规则且简单的。关于TCP协议头的options与NOP
任何协议,如果没有被设计成可扩展性的,那它就不是一个好的协议。一个好的协议,在其基础部分应该取定长的格式,而其扩展的部分,应该是一定范围内的变长格式,不管是IP协议还是TCP协议,协议头都有一个“头长度”这么一个字段,该字段正是为了表示所谓的扩展协议头,否则如果都是定长的,也就不需要该字段了,因此可以说,IP协议和TCP协议都是比较好的协议。识别了协议好坏的标准之后,扩展字段如何布局就纯粹成了一个编码问题,一般而言,“类型-长度-值”的方式是首选,它可以很方便的编码任意类型,任意长度的扩展字段,在TCP的协议头扩展中,其名称叫做options,即TCP选项,它便是采用了上述的编码方式,每一个选项我可以称之为一个“块”,整个TCP options由多个块组成,每一个块由下面的结构组成:
Padding: variable
The TCP header padding is used to ensure that the TCP header ends
and data begins on a 32 bit boundary. The padding is composed of
zeros.
在本文中,我心爱的NOP并不是为了填充的,而是为了用其替换时间戳选项。我不知道别的系统怎么处理NOP,反正在Linux中,是直接忽略NOP,而这种忽略正是提供了一种将时间戳选项替换为NOP的可能性。
代码与解释
Netfilter原则上可以将所有的数据包“偷走”,从标准协议栈偷走,这么极端的事它都可以做,还有什么不能做的呢?和往常一样,还是写一个iptables的module,包括两个组件,一个是内核模块,另一个是iptables的用户态模块。我依然将取名字这件事搁置,因此我的这个target姑且确定为YYY,内核模块代码如下:该有的解释都在注释里面了。用户态的模块就不贴出了了,例行公事而已,没有任何逻辑,毕竟目前的版本YYY target不需要任何参数。
YYY模块的使用
只需要简单地在NAT网关添加一个iptables规则:iptables -A FORWARD -p tcp -......-j YYY
接下来的时间里,你将不会再面对NAT设备的TCP timestamps的问题了。值得注意的是,由于TCP服务端仅仅针对新建连接来做检查,因此可以不必对非SYN包来做YYY target,我自己在测试的时候,抓包结果如下:
新建连接的SYN包:
ESTABLISHED状态的非SYN包:
感悟
对于一个在IT领域从业5年以上的人而言,任何问题靠技术手段解决都不是个事,关键是如何彻底地解决,相比于每次重复相同的排障过程,一次性解决会好很多,当然,这也许会减少一些出头露面的机会。这个timestamps+NAT问题是如此简单,以至于百行量级的代码就能搞定,但是为何加入这项功能的设备却如此之少,反之,网上的这方面的文章却是汗牛充栋(当然我也贡献过几篇)。难道是因为有些服务器确实要用到timestamps吗?而正常的理由就是,不能改变TCP的语义!我想骂了,NAT保留IP的语义了吗?它为何后来成了标准的东西,原始的IP语义是希望任意IP主机可以仅依靠IP路由双向互联互通,结果有了状态NAT以后,事情复杂了,于是更加复杂的各种打洞技术被呼唤出来,几年前我曾经遇到过一个人,自诩他实现的打洞技术世界第一,我C-T-M-D,他就是一小丑! 0 0
- NAT网关自动去掉TCP syn包的时间戳
- NAT网关自动去掉TCP syn包的时间戳
- SYN包TCP选项的设置
- TCP包的类型 (SYN, FIN, ACK, PSH, RST, URG)
- ubuntu 开启ip包转发做网关与nat的设置
- 网关+NAT
- wireshark过滤掉tcp通信中握手ACK/SYN等握手包,只保留带有数据的通信包
- tcp的NAT穿透
- TCP SYN-Cookie背后的人和事
- TCP,SYN,FIN扫描的介绍
- TCP SYN-Cookie的原理和扩展
- Linux TCP SYN包不返回问题解析
- [转]NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- NAT网络下TCP连接建立时可能SYN包被服务器忽略-tcp_tw_recycle
- linux下端口扫描的实现(TCP connect、TCP SYN、TCP FIN、UDP四种方式)4 TCP SYN方式
- 基于TCP的NAT穿透
- TCP的那些事(上)
- tcp 的内核参数
- 程序注释规范
- Spring MVC 的请求参数获取的几种方法
- Group by与having理解
- NAT网关自动去掉TCP syn包的时间戳
- TCP 的那些事儿(下)
- Linux 常用命令 dmesg(显示开机信息命令)
- Just a Numble(求小数的第N位数)
- 《数据结构》第七章 查找技术 知识总结导图
- 数据结构 第一章绪论 思维导图
- 在iOS下如何编译.a文件和使用该文件
- JPA persistence.xml 文件
- 好好生存,就在今日