TTL、IP ID 定位防火墙;NAT 和 TCP Keep-alive 之间的关系
===========================================================================================================================
TTL、IP ID 定位防火墙
通过 TTL 定位防火墙的原理:
本质原因就是这个 IP 报文是防火墙自己构造的,而在构造时 TTL 被设置为了初始值。(接收端收到服务端和防火墙发出的报文,TTL值不同!)
同理,在 IP 层,还有一个IP ID字段。
IP ID 字段占用了 2 个字节,所以它的最大值是 2^16-1,也就是 65535。IP ID 一般是 IP 报文的发起端设置的,每次发包递增 1,然后在 0 到 65535 之间循环使用。
它最主要的用途,是接收端会根据这个 ID 来组装(assemble)同一组 IP 分片(fragments),而中间设备(交换机、路由器)不会改动 IP ID。
并且在防火墙构造 RST 报文的时候,IP 包的 TTL 和 ID 值也是防火墙自己设置的,也就有可能被我们用来发现防火墙。
所以,如果 SYN+ACK 和 RST 的 IP ID 不连续,我们就可以判断出防火墙
注意:Linux 系统发送 SYN+ACK 的时候,IP ID 一定是 0,但是我既在 Wireshark 里看到了这个现象,也在内核代码里证实了这一点。
这就给我们利用 IP ID 带来了障碍:因为即使 RST 真的是对端发出的,两个报文的 IP ID 也会不同。
其实就是在描述这样一种情况:server端回复syn+ack后,马上发送RST,这2个报文的IP ID是不同的
所以,利用 IP ID 的方法,对于 TCP 握手后就发生 RST 的情况并不适用,但对于交互过程中发生 RST 的情况应该是适用的。
------------------------------------------------------------------------------------------------------------------------------
NAT 和 TCP Keep-alive 之间的关系。
NAT 是维护连接跟踪表的,里面的表项有一定的有效期,过了有效期的表项就会被清空。
而 TCP Keep-alive 正好可以定期去刷新这个计时器,让它“永葆青春”,表项不被删除,这个连接就可以一直愉快地工作下去了。
Chrome 每隔 45 秒的 TCP Keep-alive,主要是起到下面这两个作用:
避免连接被中间环节给撤销掉。一般客户端是在内网里的,出公网的时候 NAT 会转换为公网 IP 跟对端通信。而跟上面的例子类似,为了保持 NAT 表项不被回收,所以 Chrome 要发送保活报文。
避免被服务端认为是无效连接给撤销掉。服务端一般也有 idle timeout 时间,也就是如果一个客户端连接超过一定时间没有报文传送,服务端就会取消这个连接,而且这时很可能不发送 FIN 或者 RST,导致客户端对连接失效这个事情并不知情。