大家好~最近在研究iptables的時候看到一個u32模組~@@"
但是在書上寫的內容我老實說不太懂,在這裡請教各位先進~
書本範例:若要判別封包內所使用的通訊協定是否為TCP,只要抓出IP表頭裡的Protocol欄位內的值比對是否為6即可,u32的使用語法如下:
iptables -A INPUT -m u32 --u32 '6&0xFF=6' -j DROP
書上說法:u32模組每次固定抓IP表頭4個bytes來進行比對,所以如果要取得Protocol欄位那麼就得從第6個bytes開始取得資料,但是我們所需要的資料只有第四個bytes而已,所以接下來要把不需要的內容清掉,清掉的方法就是把抓取到的4個bytes與0x000000FF進行AND運算。
如此就能只得到Protocol欄位。6&0xFF所代表即是從第4個bytes開始抓取資料,然後再與0xFF進行AND運算,最後值等於6即條件成立。
哇= =",這讓我看的真的是看的有點難懂.....如果有人了解能解釋一下的話..感激不盡!
另附:ipv4表頭
你要先確定你明白這兩件事再往下看
1.8 bits=1 byte
2.AND 的計算方式及用途
確定之後開始說明
你附上的 IPv4 圖
最上方標示 0,4,8,16,19,31
其單位是 bit
所以每一「橫列」是 32bits = 4 bytes
五個橫列總共是 4x5 = 20 bytes
以下用資料來看比較容易理解
<pre class="c" name="code">
45 00 00 44 ad 0c 01 03 40 06 72 72 ac 14 02 fd ac 14 00 07
目的是要取得 protocol 欄位
也就是第 10 個 byte
在此例中的值是 06
使用 u32 每次固定取 4 個 bytes
所以為了要取到 06 這個值
就從 01 03 40 06 取得 4 個 bytes
01 是第 7 個 byte
但這裡的索引是從 0 開始算
所以最後的參數是用 6
取得 01 03 40 06 4 個 bytes
再跟 00 00 00 FF 做 AND 運算
就可以得到最後的 06 值
即代表其為 TCP
打完收工