[料理佳餚] 什麼是 CIDR 標記法?(或稱 CIDR 表示法)

在設定 GCP Firewall 規則的時候,限制來源 IP 範圍的欄位要我們以 CIDR 標記法 輸入。

什麼是 CIDR 標記法? 如果是真.網管的朋友應該很熟悉,對於我這個偶爾沾個醬油、跑個龍套的來講,這又是一個陌生的名詞。

CIDR 標記法

查了 Wiki 之後,我的理解是這樣的,IPv4(以下簡稱 IP)的位址是由兩個部分組成:字首+主機位址,長度為 32bits,字首跟主機位址取決於所在的子網路及可分配的位址數量,舉例來說,我的 IP 是 192.168.1.168,子網路遮罩為 255.255.255.0,那麼可分配的位址數量就是 256 個,我的 IP 字首就是 192.168.1,主機位址則是 168。

在早期的時候要做 IP 分配,字首只能是 8bits、16bits 或 24bits,這使得可分配位址數量從最小的 256 個,跳下一級直接到 65536 個,對大部分的企業來說 256 個太少,而 65536 個又太多,很不方便,因此 IETF 就在 RFC 1519 定義了新的分配 IP 的方式,就是 CIDR(Classless Inter-Domain Routing)

CIDR 標記法的格式是由字首加上一個 0 ~ 32 數字的字尾所組成的,像是這樣 192.168.1.0/24,字尾的數字指的是字首的位數,也是子網路遮罩 1 的數量,例如:24 就代表字首為 24bits,子網路遮罩是 24 個 1,其他為 0:

11111111.11111111.11111111.00000000

這種方式使得分配 IP 的彈性變大了,從最小的 1 個、下一級是 3 個、再下一級是 7 個、…依此類推,而這樣的設計也被 IPv6 給延用了。

那我怎麼知道我 IP 的字首? 我們就拿我們的 IP 跟子網路遮罩做 AND 運算,就會得到字首了,用剛剛的例子我的 IP 是 192.168.1.168 轉成二進位表達是這樣:

11000000.10101000.00000001.10101000

跟子網路遮罩做 AND 運算就會得到:

11000000.10101000.00000001.00000000

這就是我們 IP 的字首 192.168.1.0

用在防火牆規則上

CIDR 標記法用在防火牆的規則上,就用來判斷我們的 IP 是不是在所允許的範圍內,我們可以這樣理解,將我們的 IP 跟子網路遮罩做 AND 運算,其結果若等於所設定的字首,防火牆就放行,假定我的 IP 是 118.186.134.82,來源 IP 範圍設定為 118.186.134.82/32,這就表示只限定我的 IP 能通過防火牆。

如果是要設定成任一 IP 皆能通過防火牆就設成 0.0.0.0/0,不過這樣等同於在網路上裸奔,最好還是限定一下 IP 範圍,網路上有一堆 Scanner 時時刻刻在 Scan,萬一有漏洞沒有修補或是開了不該開的 Port,那很危險。