iT邦幫忙

0

iptables u32比對模組的使用

CMAN 2014-02-26 15:19:523979 瀏覽

大家好~最近在研究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表頭

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

10
海綿寶寶
iT邦大神 1 級 ‧ 2014-02-26 17:32:33
最佳解答

你要先確定你明白這兩件事再往下看
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

打完收工

H5 iT邦研究生 4 級 ‧ 2014-02-27 11:42:59 檢舉

專業教材~~

CMAN iT邦新手 4 級 ‧ 2014-03-03 11:28:29 檢舉

感謝~~~~~~~小弟我稍微能了解它的方式了!!!謝謝

我要發表回答

立即登入回答