通訊網路/IP 表
netfilter 框架,其中 iptables 是其中的一部分,允許 系統管理員 定義如何處理網路 資料包 的規則。規則被分組到鏈 中 - 每個鏈都是規則的有序列表。鏈被分組到表 中 - 每個表與不同的資料包處理型別相關聯。
每個規則包含一個指定哪些資料包與之匹配的規範和一個目標,它指定如果資料包與該規則匹配,則對資料包執行的操作。到達或離開計算機的每個網路資料包至少會遍歷一個鏈,並且該鏈上的每個規則都會嘗試匹配該資料包。如果規則與資料包匹配,則遍歷停止,並且該規則的目標 指示對該資料包執行的操作。如果資料包到達預定義鏈的末尾,但沒有被該鏈上的任何規則匹配,則該鏈的策略 目標指示對該資料包執行的操作。如果資料包到達使用者定義鏈的末尾,但沒有被該鏈上的任何規則匹配,或者使用者定義的鏈為空,則遍歷繼續在呼叫鏈上進行(隱式目標 RETURN)。只有預定義的鏈具有策略。
iptables 中的規則被分組到鏈中。鏈是一組針對 IP 資料包的規則,用於確定對它們執行的操作。每個規則都可能將資料包從鏈中丟棄(短路),並且不會考慮其他鏈。一個鏈可能包含一個指向另一個鏈的連結 - 如果資料包通過了整個鏈或匹配了 RETURN 目標規則,它將繼續在第一個鏈中進行。巢狀鏈的數量沒有限制。存在三個基本鏈(INPUT、OUTPUT 和 FORWARD),使用者可以建立任意數量的鏈。規則可能只是一個指向鏈的指標。
存在三個內建表,每個表都包含一些預定義的鏈。擴充套件模組可以建立新的表。管理員可以在任何表中建立和刪除使用者定義的鏈。最初,所有鏈都是空的,並且具有一個策略目標,該目標允許所有資料包透過,而不會被阻止或以任何方式更改。
- filter 表 — 該表負責過濾(阻止或允許資料包繼續進行)。每個資料包都會透過 filter 表。它包含以下預定義的鏈,並且任何資料包都會透過其中的一個
- INPUT 鏈 — 所有註定要傳送到此係統的資料包都會透過此鏈(因此有時被稱為LOCAL_INPUT)
- OUTPUT 鏈 — 此係統建立的所有資料包都會透過此鏈(又名LOCAL_OUTPUT)
- FORWARD 鏈 — 所有僅僅經過此係統的資料包(被 路由)都會透過此鏈。
- nat 表 — 該表負責設定重寫資料包地址或埠的規則。任何連線中的第一個資料包都會透過此表:此處的所有判決都會決定如何重寫該連線中的所有資料包。它包含以下預定義的鏈
- mangle 表 — 該表負責調整資料包選項,例如 服務質量。所有資料包都會透過此表。由於它是為高階效果而設計的,因此它包含所有可能的預定義鏈
- PREROUTING 鏈 — 所有以任何方式進入系統的資料包,在路由決定是否轉發資料包(FORWARD 鏈)還是將其傳送到本地(INPUT 鏈)之前。
- INPUT 鏈 — 所有註定要傳送到此係統的資料包都會透過此鏈
- FORWARD 鏈 — 所有僅僅經過此係統的資料包都會透過此鏈。
- OUTPUT 鏈 — 此係統建立的所有資料包都會透過此鏈
- POSTROUTING 鏈 — 所有離開系統的資料包都會透過此鏈。
除了內建鏈之外,使用者可以在每個表中建立任意數量的使用者定義鏈,這使他們能夠以邏輯方式對規則進行分組。
每個鏈包含一個規則列表。當資料包被髮送到鏈時,它會按順序與鏈中的每個規則進行比較。該規則指定資料包必須具有哪些屬性才能與該規則匹配,例如 埠號 或 IP 地址。如果該規則不匹配,則繼續處理下一個規則。但是,如果該規則確實與資料包匹配,則會遵循該規則的目標 指令(並且通常會中止對該鏈的進一步處理)。某些資料包屬性只能在某些鏈中檢查(例如,輸出網路介面在 INPUT 鏈中是無效的)。某些目標只能在某些鏈中或某些表中使用(例如,SNAT 目標只能在 nat 表的 POSTROUTING 鏈中使用)。
規則的目標可以是使用者定義鏈的名稱或以下內建目標之一ACCEPT, DROP, QUEUE,或RETURN。當目標是使用者定義鏈的名稱時,資料包會被轉移到該鏈進行處理(很像 子例程 在 程式語言 中的呼叫)。如果資料包透過使用者定義鏈,而沒有被該鏈中的任何規則操作,則資料包的處理將從當前鏈中停止的位置繼續。這些鏈間呼叫可以巢狀到任意深度。
存在以下內建目標
- ACCEPT
- 此目標導致 netfilter 接受資料包。這意味著什麼取決於執行接受的鏈。例如,在 INPUT 鏈上被接受的資料包被允許由主機接收,在 OUTPUT 鏈上被接受的資料包被允許離開主機,在 FORWARD 鏈上被接受的資料包被允許透過主機路由。
- DROP
- 此目標導致 netfilter 丟棄資料包,而不會進行任何進一步處理。該資料包簡單地消失,而不會向傳送主機或應用程式提供任何關於它被丟棄的事實。這通常會使傳送方看起來像是通訊超時,這可能會造成混淆(雖然丟棄不需要的入站資料包通常被認為是一個好的安全策略,因為它不會向潛在的攻擊者提供任何關於你的主機存在的跡象)。
- QUEUE
- 此目標會導致資料包被髮送到 使用者空間 中的佇列。應用程式可以使用 libipq 庫,該庫也是 netfilter/iptables 專案的一部分,來修改資料包。如果沒有應用程式讀取佇列,則此目標等同於 DROP。
- RETURN
- 根據官方的 netfilter 文件,此目標具有與從鏈的末尾掉落相同的效果:對於內建鏈中的規則,會執行該鏈的策略。對於使用者定義鏈中的規則,遍歷將繼續在先前的鏈中進行,就在跳轉到該鏈的規則之後。
有許多擴充套件目標可用。以下是一些最常見的目標
- REJECT
- 此目標與“DROP”的效果相同,但會向原始傳送者傳送錯誤資料包。它主要用於過濾表中的 INPUT 或 FORWARD 鏈。資料包型別可以透過“--reject-with”引數控制。拒絕資料包可以明確指出連線已被過濾(ICMP 連線-管理-過濾資料包),儘管大多數使用者更喜歡資料包簡單地表明計算機不接受該型別的連線(此類資料包將是拒絕 TCP 連線的 tcp-reset 資料包,拒絕 udp 會話的 icmp-port-unreachable 或非 tcp 非 udp 資料包的 icmp-protocol-unreachable)。如果未指定“--reject-with”引數,則預設拒絕資料包始終為 icmp-port-unreachable。
- LOG
- 此目標記錄資料包。這可以在任何表中的任何鏈中使用,並且通常用於除錯(例如,檢視哪些資料包被丟棄)。
- ULOG
- 此目標記錄資料包,但與 LOG 目標不同。LOG 目標將資訊傳送到 核心 日誌,而 ULOG 組播 與此規則匹配的資料包透過 netlink 套接字,以便使用者空間程式可以透過連線到套接字來接收這些資料包。
- DNAT
- 此目標導致資料包的目標地址(以及可選的埠)被重寫以進行 網路地址轉換。必須提供“--to-destination”標誌以指示要使用的目標。這僅在 nat 表中的 OUTPUT 和 PREROUTING 鏈中有效。此決定將被記住,適用於屬於同一連線的所有未來資料包,並且回覆將將其源地址和埠更改回原始地址(即此資料包的反向操作)。
- SNAT
- 此目標導致資料包的源地址(以及可選的埠)被重寫以進行 網路地址轉換。必須提供“--to-source”標誌以指示要使用的源。這僅在 nat 表中的 POSTROUTING 鏈中有效,並且與 DNAT 一樣,會記住屬於同一連線的所有其他資料包。
- MASQUERADE
- 這是一種特殊的,受限的 SNAT 形式,用於動態 IP 地址,例如大多數 網際網路服務提供商 為 調變解調器 或 DSL 提供。與其每次 IP 地址更改時都更改 SNAT 規則,不如透過檢視資料包匹配此規則時傳出介面的 IP 地址來計算要使用的源 IP 地址。此外,它會記住哪些連線使用 MASQUERADE,如果介面地址更改(例如重新連線到 ISP),則所有 NAT 到舊地址的連線都會被遺忘。
- REDIRECT
- REDIRECT 目標用於將資料包和流重定向到機器本身。這意味著,例如,我們可以將所有指向 HTTP 埠的資料包重定向到我們主機上的 HTTP 代理,例如 squid。本地生成的資料包對映到 127.0.0.1 地址。換句話說,這會將目標地址重寫到我們自己的主機,用於轉發或類似的資料包。當我們想要透明代理時,REDIRECT 目標非常有用,例如,區域網主機根本不知道代理。
- 請注意,REDIRECT 目標僅在 nat 表中的 PREROUTING 和 OUTPUT 鏈中有效。它在僅從這些鏈呼叫,而不在其他地方呼叫的使用者定義鏈中也有效。REDIRECT 目標只接受一個選項,如下所述。
圖表
[edit | edit source]這些圖表說明了資料包如何遍歷核心 netfilter 表/鏈。

以下資源也可能有用
- http://xkr47.outerspace.dyndns.org/netfilter/packet_flow/packet_flow9.png
- http://www.shorewall.net/images/Netfilter.png
- http://dmiessler.com/images/DM_NF.PNG
- http://linux-ip.net/nf/nfk-traversal.pdf
連線跟蹤
[edit | edit source]建立在 netfilter 框架之上的重要功能之一是連線跟蹤。連線跟蹤允許核心跟蹤所有邏輯網路連線或會話,從而關聯構成該連線的所有資料包。NAT 依賴於此資訊以相同的方式轉換所有相關資料包,iptables 可以使用此資訊充當狀態防火牆。
連線跟蹤將每個資料包歸類為以下四種狀態之一。NEW(嘗試建立新的連線),ESTABLISHED(已存在連線的一部分),RELATED(與現有連線相關,但並非實際的現有連線的一部分)或INVALID(不是現有連線的一部分,並且無法建立新的連線)。一個正常的例子是防火牆看到的第一資料包將被歸類為NEW,回覆將被歸類為ESTABLISHED,而 ICMP 錯誤將是RELATED。與任何已知連線不匹配的 ICMP 錯誤資料包將是INVALID.
連線狀態完全獨立於任何TCP 狀態。如果主機使用 SYN ACK 資料包響應以確認傳入的新 TCP 連線,則 TCP 連線本身尚未建立,但跟蹤的連線已建立 - 此資料包將與狀態 ESTABLISHED 匹配。
無狀態協議(如 UDP)的跟蹤連線仍然具有連線狀態。
此外,透過使用外掛模組,連線跟蹤可以瞭解應用程式層協議,從而理解兩個或多個不同的連線是“相關的”。例如,考慮 FTP 協議。建立了控制連線,但無論何時傳輸資料,都會建立一個單獨的連線來傳輸資料。當載入 ip_conntrack_ftp 模組時,FTP 資料連線的第一資料包將被歸類為RELATED而不是NEW,因為它在邏輯上是現有連線的一部分。
iptables 可以使用連線跟蹤資訊來使資料包過濾規則更強大,更易於管理。“conntrack”匹配擴充套件允許 iptables 規則檢查資料包的連線跟蹤分類。例如,一條規則可能只允許NEW來自防火牆內部的資料包到防火牆外部,但允許RELATED和ESTABLISHED在任一方向。這允許來自外部的正常回複數據包(ESTABLISHED),但不允許從外部到內部建立新的連線。但是,如果 FTP 資料連線需要從防火牆外部到防火牆內部,它將被允許,因為資料包將被正確地歸類為RELATED到 FTP 控制連線,而不是NEW連線。
iptables
[edit | edit source]iptables 是一個 使用者空間 應用程式,它允許系統管理員配置 netfilter 表、鏈和規則(如上所述)。由於 iptables 需要提升的許可權才能操作,因此必須由使用者 root 執行,否則它將無法正常工作。在大多數 Linux 系統上,iptables 安裝為/sbin/iptables。的詳細語法iptables命令在它的 手冊頁 中有記錄,可以透過鍵入命令“"來顯示man iptables".
常用選項
[edit | edit source]在下面顯示的每個 iptables 呼叫形式中,以下常用選項都可用
- -t table
- 使命令應用於指定的table。省略此選項時,命令預設應用於filter 表。
- -v
- 產生詳細輸出。
- -n
- 產生數字輸出(即埠號而不是服務名稱,IP 地址而不是 域名)。
- --line-numbers
- 列出規則時,在每條規則的開頭新增行號,對應於該規則在其鏈中的位置。
規則規範
[edit | edit source]大多數 iptables 命令形式要求您提供一個規則規範,該規範用於匹配由鏈處理的網路資料包流量的特定子集。規則規範還包括一個目標,該目標指定對與規則匹配的資料包執行的操作。以下選項用於(經常組合在一起)建立規則規範。
- -j target
- --jump target
- 指定規則的目標。目標是使用者定義鏈的名稱(使用-N選項建立),內建目標之一,ACCEPT, DROP, QUEUE,或RETURN,或擴充套件目標,例如REJECT, LOG, DNAT,或SNAT。如果規則中省略此選項,則匹配規則將不會影響資料包的命運,但規則上的計數器將遞增。
- -i [!] 入介面
- --in-interface [!] 入介面
- 資料包將要接收的介面名稱(僅適用於進入 INPUT、FORWARD 和 PREROUTING 鏈的資料包)。當在介面名稱之前使用 '!' 引數時,其意義將被反轉。如果介面名稱以 '+' 結尾,則以該名稱開頭的任何介面都將匹配。如果省略此選項,則任何介面名稱都將匹配。
- -o [!] 出介面
- --out-interface [!] 出介面
- 資料包將要傳送的介面名稱(適用於進入 FORWARD、OUTPUT 和 POSTROUTING 鏈的資料包)。當在介面名稱之前使用 '!' 引數時,其意義將被反轉。如果介面名稱以 '+' 結尾,則以該名稱開頭的任何介面都將匹配。如果省略此選項,則任何介面名稱都將匹配。
- -p [!] 協議
- --protocol [!] 協議
- 匹配指定協議名稱的資料包。如果 '!' 位於協議名稱之前,則匹配所有不是指定協議的資料包。有效的協議名稱是icmp, udp, tcp... 所有有效協議的列表可以在 /etc/protocols 檔案中找到。
- -s [!] 源[/字首]
- --source [!] 源[/字首]
- 匹配來自指定源地址的 IP 資料包。源地址可以是 IP 地址、帶有關聯的 w:網路字首 的 IP 地址或主機名。如果 '!' 位於源之前,則匹配所有不是來自指定源的資料包。
- -d [!] 目標[/字首]
- --destination [!] 目標[/字首]
- 匹配要傳送到指定目標地址的 IP 資料包。目標地址可以是 IP 地址、帶有關聯的 w:網路字首 的 IP 地址或主機名。如果 '!' 位於目標之前,則匹配所有不是要傳送到指定目標的資料包。
- --destination-port [!] [埠[:埠]]
- --dport [!] [埠[:埠]]
- 匹配 TCP 或 UDP 資料包(取決於對-p選項的引數),這些資料包的目標是指定的埠或埠範圍(當使用埠:埠形式時)。如果 '!' 位於埠規範之前,則匹配所有不是目標為指定埠或埠範圍的 TCP 或 UDP 資料包。
- --source-port [!] [埠[:埠]]
- --sport [!] [埠[:埠]]
- 匹配 TCP 或 UDP 資料包(取決於對-p選項的引數),來自指定的埠或埠範圍(當使用埠:埠形式時)。如果 '!' 位於埠規範之前,則匹配所有不是來自指定埠或埠範圍的 TCP 或 UDP 資料包。
- --tcp-flags [!] 掩碼 比較
- 匹配具有某些 TCP 協議標誌設定或未設定的 TCP 資料包。第一個引數指定要檢查的每個 TCP 資料包中的標誌,寫為逗號分隔的列表(不允許空格)。第二個引數是一個逗號分隔的標誌列表,這些標誌必須在那些被檢查的標誌中設定。標誌是:SYN、ACK、FIN、RST、URG、PSH、ALL 和 NONE。因此,選項 "--tcp-flags SYN,ACK,FIN,RST SYN" 將僅匹配設定了 SYN 標誌且未設定 ACK、FIN 和 RST 標誌的資料包。
- [!] --syn
- 匹配設定了 SYN 標誌且未設定 ACK、RST 和 FIN 標誌的 TCP 資料包。此類資料包用於啟動 TCP 連線。阻止 INPUT 鏈上的此類資料包將阻止傳入的 TCP 連線,但傳出的 TCP 連線不受影響。此選項可以與其他選項結合使用,例如--source僅阻止或允許來自某些主機或網路的入站 TCP 連線。此選項等效於 "--tcp-flags SYN,RST,ACK SYN"。如果 '!' 標誌位於--syn之前,則選項的意義將被反轉。
- 此部分正在建設中。
呼叫
[edit | edit source]iptables { -A | --append | -D | --delete } chain rule-specification [ options ]
此形式的命令新增(-A或--append)或刪除(-D或--delete)指定鏈中的規則。例如,要向 filter 表(當未指定選項-t時,預設表)的 INPUT 鏈新增一個規則,以丟棄所有 UDP 資料包,請使用以下命令
- iptables -A INPUT -p udp -j DROP
要刪除上述命令新增的規則,請使用以下命令
- iptables -D INPUT -p udp -j DROP
上面的命令實際上刪除了 INPUT 鏈上第一個與規則規範匹配的規則 "-p udp -j DROP"。如果鏈上有多個相同的規則,則只會刪除第一個匹配的規則。
iptables { -R | --replace | -I | --insert } chain rulenum rule-specification [ options ]
此形式的命令替換(-R或--replace)現有規則或插入(-I或--insert)指定鏈中的新規則。例如,要將 INPUT 鏈中的第四個規則替換為丟棄所有 ICMP 資料包的規則,請使用以下命令
- iptables -R INPUT 4 -p icmp -j DROP
要將一個新規則插入 OUTPUT 鏈的第二個槽中,該規則會丟棄所有傳送到任何主機上的埠 80 的 TCP 流量,請使用以下命令
- iptables -A INPUT-p tcp -m tcp --dport 22 -j ACCEPT
iptables { -D | --delete } chain rulenum [ options ]
此形式的命令刪除指定鏈中指定數字索引處的規則。規則從 1 開始編號。例如,要從 FORWARD 鏈刪除第三個規則,請使用以下命令
- iptables -D FORWARD 3
iptables { -L | --list | -F | --flush | -Z | --zero } [ chain ] [ options ]
此形式的命令用於列出鏈中的規則(-L或--list),重新整理(即,刪除)鏈中的所有規則(-F或--flush),或將鏈的位元組和資料包計數器歸零(-Z或--zero)。如果沒有指定鏈,則操作將對所有鏈執行。例如,要列出 OUTPUT 鏈中的規則,請使用以下命令
- iptables -L OUTPUT
要重新整理所有鏈,請使用以下命令
- iptables -F
要將 nat 表中 PREROUTING 鏈的位元組和資料包計數器歸零,請使用以下命令
- iptables -t nat -Z PREROUTING
iptables { -N | --new-chain } chain
iptables { -X | --delete-chain } [ chain ]
此形式的命令用於建立(-N或--new-chain)一個新的使用者定義鏈或刪除(-X或--delete-chain)一個現有的使用者定義鏈。如果未用-X或--delete-chain選項指定鏈,則將刪除所有使用者定義的鏈。無法刪除內建鏈,例如 filter 表中的 INPUT 或 OUTPUT 鏈。
iptables { -P | --policy } chain target
此形式的命令用於設定鏈的策略目標。例如,要將 INPUT 鏈的策略目標設定為 DROP,請使用以下命令
- iptables -P INPUT DROP
iptables { -E | --rename-chain } old-chain-name new-chain-name
此形式的命令用於重新命名使用者定義的鏈。
ipset
[edit | edit source]ipset 用於設定、維護和檢查 Linux 核心中所謂的“IP 集”。IP 集通常包含一組 IP 地址,但根據其 "型別",也可以包含其他網路號集。
任何一個集合中的條目都可以繫結到另一個集合,從而允許進行復雜的匹配操作。
只有當沒有 iptables 規則或其他集合引用集合時,才能刪除(銷燬)集合。
命令
[edit | edit source]這些選項指定要執行的特定操作。除非下面另有說明,否則命令列上只能指定其中一個。對於命令和選項名稱的所有長版本,您只需要使用足夠的字母來確保 ipset 可以將其與所有其他選項區分開來。
- -N setname 型別 型別特定選項
- --create setname 型別 型別特定選項
建立一個用 setname 標識並指定型別的集合。必須提供型別特定選項。
- -X [setname]
- --destroy [setname]
銷燬指定的集合,如果未指定或指定了關鍵字 ":all:",則銷燬所有集合。在銷燬集合之前,將刪除屬於集合元素的所有繫結以及集合的預設繫結。如果集合仍然被引用,則不會執行任何操作。
- -F [setname]
- --flush [setname]
從指定的集合中刪除所有條目,或者如果未指定或指定了關鍵字 ":all:",則重新整理所有集合。繫結不受重新整理操作的影響。
- -E from-setname to-setname
- --rename from-setname to-setname
重新命名一個集合。用 to-setname 標識的集合必須不存在。
- -W from-setname to-setname
- --swap from-setname to-setname
交換 Linux 核心中引用的兩個集合。指向 from-setname 內容的 iptables 規則或 ipset 繫結將指向 to-setname 的內容,反之亦然。這兩個集合都必須存在。
- -L [setname]
- --list [setname]
列出指定集合的條目和繫結,或者如果未指定或指定了關鍵字 ":all:",則列出所有集合的條目和繫結。-n、--numeric 選項可用於禁止名稱查詢並生成數字輸出。當給出 -s、--sorted 選項時,將按順序列出條目(如果給定的集合型別支援該操作)。
- -S [setname]
- --save [setname]
將給定的集合儲存到 stdout,如果未指定或指定了關鍵字 :all:,則將所有集合儲存到 stdout,以—restore 可以讀取的格式。
- -R
- --restore
恢復—save 生成的已儲存會話。已儲存的會話可以從 stdin 饋送。
生成會話檔案時,請注意,支援的命令(create set、add element、bind)必須按嚴格順序出現:首先建立集合,然後新增所有元素。然後建立下一個集合,新增其所有元素,依此類推。最後,您可以列出所有繫結命令。另外,這是一個恢復操作,因此要恢復的集合必須不存在。
-A, --add setname IP 將 IP 新增到集合。
-D, --del setname IP 從集合中刪除 IP。
-T, --test setname IP 測試 IP 是否在集合中。如果測試的 IP 在集合中,則退出狀態碼為零,如果它不在集合中,則退出狀態碼為非零。
-T, --test setname IP—binding to-setname 測試屬於集合的 IP 是否指向指定的繫結。如果繫結指向指定的集合,則退出狀態碼為零,否則為非零。可以使用關鍵字:default: 來測試集合的預設繫結。
-B, --bind setname IP—binding to-setname 將集合 setname 中的 IP 繫結到 to-setname。
-U, --unbind setname IP 刪除屬於集合 setname 中的 IP 的繫結。
-H, --help [settype] 列印幫助,如果指定了 settype,則列印 settype 特定的幫助。在 -B、-U 和 -T 命令中,您可以使用標記:default: 來繫結、取消繫結或測試集合的預設繫結,而不是 IP。在 -U 命令中,您可以使用標記:all: 來銷燬集合中所有元素的繫結。
其他選項
可以指定以下附加選項
-b, --binding setname 該選項指定 -B 繫結命令的繫結的值,它是該命令的必需選項。您也可以在 -T 測試命令中使用它來測試繫結。
-s, --sorted 排序輸出。列出集合時,條目按排序順序列出。
-n, --numeric 數字輸出。列出集合、繫結、IP 地址和埠號時,將以數字格式列印。預設情況下,程式將嘗試將它們顯示為主機名、網路名或服務(如果適用),這可能會觸發緩慢的 DNS 查詢。
-q, --quiet 抑制任何輸出到 stdout 和 stderr。ipset 仍然會返回可能的錯誤。
ipset 支援以下集合型別
ipmap
ipmap 集合型別使用記憶體範圍,其中每個位代表一個 IP 地址。ipmap 集合最多可以儲存 65536(B 類網路)個 IP 地址。ipmap 集合型別非常快,記憶體消耗少,非常適合用於匹配某個範圍內的特定 IP。使用—netmask 選項和 CIDR 網路掩碼值在 0-32 之間時,在建立 ipmap 集合時,您可以儲存和匹配網路地址:即,如果透過使用指定的網路掩碼遮蔽地址得到的值可以在集合中找到,則 IP 地址將在集合中。
建立 ipmap 集合時要使用的選項
--from from-IP—to-IP 從指定的範圍建立 ipmap 集合。--network IP/mask 從指定的網路建立 ipmap 集合。--netmask CIDR-netmask 當指定可選的—netmask 引數時,將儲存網路地址而不是 IP 地址,並且 from-IP 引數必須是網路地址。
macipmap
macipmap 集合型別使用記憶體範圍,其中每個 8 位元組代表一個 IP 和一個 MAC 地址。macipmap 集合型別最多可以儲存 65536(B 類網路)個帶有 MAC 的 IP 地址。將條目新增到 macipmap 集合時,必須將條目指定為 IP%MAC。刪除或測試 macipmap 條目時,%MAC 部分不是必需的。
建立 macipmap 集合時要使用的選項
--from from-IP—to-IP 從指定的範圍建立 macipmap 集合。--network IP/mask 從指定的網路建立 macipmap 集合。--matchunset 當指定可選的—matchunset 引數時,即使尚未設定,可以儲存在集合中的 IP 地址也將始終匹配。請注意,集合和 SET netfilter 核心模組始終使用資料包中的源 MAC 地址來匹配、新增或刪除來自 macipmap 型別集合的條目。
portmap
portmap 集合型別使用記憶體範圍,其中每個位代表一個埠。portmap 集合型別最多可以儲存 65536 個埠。portmap 集合型別非常快,記憶體消耗少。
建立 portmap 集合時要使用的選項
--from from-port—to-port 從指定的範圍建立 portmap 集合。
iphash
iphash 集合型別使用雜湊表來儲存 IP 地址。為了避免雜湊衝突,使用雙重雜湊,並且作為最後手段,執行雜湊表的動態增長。iphash 集合型別非常適合儲存隨機地址。透過在建立集合時使用—netmask 選項和 CIDR 網路掩碼值在 0-32 之間,您可以儲存和匹配網路地址而不是 IP 地址:即,如果遮蔽了指定網路掩碼的值可以在集合中找到,則 IP 地址將在集合中。
建立 iphash 集合時要使用的選項
--hashsize hashsize 初始雜湊表大小(預設值為 1024)--probes probes 在將 IP 新增到雜湊表時嘗試透過雙重雜湊解決衝突的次數(預設值為 8)。--resize percent 在將 IP 新增到雜湊表後,如果在 probes 次雙重雜湊後無法執行,則按此百分比(預設值為 50)增加雜湊表大小。--netmask CIDR-netmask 當指定可選的—netmask 引數時,將儲存網路地址而不是 IP 地址。由值為零的 resize 引數建立的集合不會被調整大小。iphash 型別集合中的查詢時間大約與 probes 引數的值線性增長。同時,較高的 probes 值會導致雜湊表利用率更高,而較小的值會導致雜湊表更大、更稀疏。
nethash
nethash 集合型別使用雜湊表來儲存不同大小的網路地址。ipset 命令中使用的 IP “地址” 必須採用 IP-address/cidr-size 的形式,其中 CIDR 塊大小必須在 1-31 的包含範圍內。為了避免雜湊衝突,使用雙重雜湊,並且作為最後手段,執行雜湊表的動態增長。
建立 nethash 集合時要使用的選項
--hashsize hashsize 初始雜湊表大小(預設值為 1024)--probes probes 在將 IP 新增到雜湊表時嘗試透過雙重雜湊解決衝突的次數(預設值為 4)。--resize percent 在將 IP 新增到雜湊表後,如果在將 IP 新增到雜湊表後無法執行,則按此百分比(預設值為 50)增加雜湊表大小。IP 地址將在 nethash 型別集合中,如果它在新增到集合的任何網路塊中,並且匹配始終從最小的網路塊大小(最具體的網路掩碼)開始,一直到最大的網路塊大小(最不具體的網路掩碼)。當透過 SET netfilter 核心模組將 IP 地址新增到 nethash 集合或從集合中刪除 IP 地址時,它將透過集合中可以找到的最小網路塊大小進行新增或刪除。
nethash 型別集合中的查詢時間大約與 probes 引數的次數和雜湊表中不同掩碼引數的數量線性增長。否則,相同的速度和記憶體效率評論適用於此處,如 iphash 型別。
ipporthash
ipporthash 集合型別使用雜湊表來儲存 IP 地址和埠對。為了避免雜湊衝突,使用雙重雜湊,並且作為最後手段,執行雜湊表的動態增長。ipporthash 集合最多可以儲存 65536(B 類網路)個 IP 地址以及所有可能的埠值。在 ipporthash 型別集合中新增、刪除和測試值時,必須將條目指定為“IP%port”。
ipporthash 型別的集合評估集合匹配的兩個 src/dst 引數和 SET 目標。
建立 ipporthash 集合時要使用的選項
--from from-IP—to-IP 從指定的範圍建立 ipporthash 集合。--network IP/mask 從指定的網路建立 ipporthash 集合。--hashsize hashsize 初始雜湊表大小(預設值為 1024)--probes probes 在將 IP 新增到雜湊表時嘗試透過雙重雜湊解決衝突的次數(預設值為 8)。--resize percent 在將 IP 新增到雜湊表後,如果在 probes 次雙重雜湊後無法執行,則按此百分比(預設值為 50)增加雜湊表大小。與 iphash 型別一樣,相同的調整大小、速度和記憶體效率評論適用。
iptree
iptree 集合型別使用樹來儲存 IP 地址,可以選擇使用超時值。建立 iptree 集合時要使用的選項:--timeout value 條目的超時值(以秒為單位)(預設值為 0)在將 IP 地址新增到集合時,可以使用語法 IP%timeout-value 將其新增到特定超時值。