Tcp

tcpdump TCP 標頭偏移 13

  • July 21, 2018

我試圖了解如何tcpdump工作並嘗試讀取 TCP 標頭控制標誌 SYN、ACK 等。

在網上研究後,我知道控制標誌在偏移量 13 處可用,我需要使用 tcp

$$ 13 $$但是我無法理解這個值 13 是如何計算的。 任何人都可以幫忙嗎?

TCP

$$ 13 $$是位(標誌)的數組。當它們設置為 1 時,它們被啟用,當它們為 0 時,它們被禁用。 這些tcpdump命令顯示瞭如何收集 TCP

$$ 13 $$bits 並按位進行 ands 以測試這些位是否已啟用:

Show all URG packets:
# tcpdump 'tcp[13] & 32 != 0'

Show all ACK packets:
# tcpdump 'tcp[13] & 16 != 0'

Show all PSH packets:
# tcpdump 'tcp[13] & 8 != 0'

Show all RST packets:
# tcpdump 'tcp[13] & 4 != 0'

Show all SYN packets:
# tcpdump 'tcp[13] & 2 != 0'

Show all FIN packets:
# tcpdump 'tcp[13] & 1 != 0'

Show all SYN-ACK packets:
# tcpdump 'tcp[13] = 18

引用的 URL(如下)有這個項目符號,它也解釋了它:

請記住這些過濾器起作用的原因。上面的過濾器會找到這些不同的數據包,因為 tcp

$$ 13 $$查看 TCP 標頭中的偏移量 13,數字表示字節內的位置,!=0 表示有問題的標誌設置為 1,即打開。

TCP 標頭

如果您查看RFC 793 3.1以及這篇關於tcpdump 高級過濾器的文章,它就會變得更加明顯。

TCP header
----------

   0                   1                   2                   3   
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |       |C|E|U|A|P|R|S|F|                               |
   | Offset|  Res. |W|C|R|C|S|S|Y|I|            Window             | 
   |       |       |R|E|G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

- Matching any TCP traffic with a source port > 1024
# tcpdump -i eth1 'tcp[0:2] > 1024'

- Matching TCP traffic with particular flag combinations

The flags are defined in the 14th byte of the TCP header.

   +-+-+-+-+-+-+-+-+
   |C|E|U|A|P|R|S|F|
   |W|C|R|C|S|S|Y|I|
   |R|E|G|K|H|T|N|N|
   +-+-+-+-+-+-+-+-+

**注意:**這些是我們感興趣的標誌。

計算標誌的位置

您從頂部開始計算字節(8 位),將它們編號為 0:

  • 所以*“源埠”“目標埠”*將組成字節 0、1、2 和 3。
  • 下一行*“Sequence Number”*將是 4-7。
  • *“確認號”*將是字節 8-11。
  • “數據偏移”和“資源” 將是字節 12。
  • 這會將您帶到第 13 個字節,該字節中的位是標誌。

位順序

我還要提到儲存在字節 13 中的數字是這樣排序的:

  • 位 1 = FIN
  • 位 2 = SYN
  • 位 4 = RST
  • 位 8 = PSH
  • 位 16 =確認
  • 位 32 = URG

參考

引用自:https://serverfault.com/questions/922988