偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux防火墻:Netfilter的深度解析

系統(tǒng) Linux
Netfilter 就像是這座網(wǎng)絡城市的超級警察和交通指揮中心,它能夠精準地識別哪些 “車輛” 可以通行,哪些需要攔截。現(xiàn)在,就讓我們深入了解一下這位網(wǎng)絡世界的 “守護者”——Netfilter 的工作原理和應用吧!

想象一下,Linux 系統(tǒng)的網(wǎng)絡世界是一座繁華的城市,數(shù)據(jù)包就像是川流不息的車輛。但是,這座城市需要交通規(guī)則和守護者來維持秩序,避免混亂和危險。Netfilter 就像是這座網(wǎng)絡城市的超級警察和交通指揮中心,它能夠精準地識別哪些 “車輛” 可以通行,哪些需要攔截?,F(xiàn)在,就讓我們深入了解一下這位網(wǎng)絡世界的 “守護者”——Netfilter 的工作原理和應用吧!

一、Netfilter概述

Linux 2.4.x引入的子系統(tǒng),Netfilter是Linux 2.4.x引入的一個子系統(tǒng),它作為一個通用的、抽象的框架,提供一整套的hook函數(shù)的管理機制,使得諸如數(shù)據(jù)包過濾、網(wǎng)絡地址轉(zhuǎn)換(NAT)和基于協(xié)議類型的連接跟蹤成為了可能, 在 Linux 系統(tǒng)中發(fā)揮著至關重要的作用。它是一個強大而靈活的網(wǎng)絡包過濾框架,為系統(tǒng)管理員提供了對網(wǎng)絡數(shù)據(jù)包的精細控制。

Netfilter 通過在內(nèi)核中插入鉤子點,實現(xiàn)對網(wǎng)絡數(shù)據(jù)包的過濾、修改和轉(zhuǎn)發(fā)。它在 IP 報文處理流程中插入了 5 個掛載點,分別是 NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_LOCAL_OUT 和 NF_IP_POST_ROUTING。在這些掛載點上,可以注冊處理數(shù)據(jù)包的回調(diào)函數(shù)。當數(shù)據(jù)包進入 Linux 內(nèi)核經(jīng)過掛載點的時候,會執(zhí)行回調(diào)函數(shù)來處理數(shù)據(jù)包。

回調(diào)函數(shù)有多種返回值,例如 NF_ACCEPT 表示繼續(xù)正常的報文處理;NF_DROP 將報文丟棄;NF_STOLEN 表示由鉤子函數(shù)處理了該報文,不要再繼續(xù)傳送;NF_QUEUE 將報文入隊,通常交由用戶程序處理;NF_REPEAT 表示再次調(diào)用該鉤子函數(shù)。

Netfilter 支持多種協(xié)議棧,目前 Linux 2.6 版內(nèi)核的 Netfilter 支持 IPv4、IPv6 以及 DECnet 等協(xié)議棧。它主要通過表、鏈實現(xiàn)規(guī)則,其中規(guī)則是對特定報文的處理說明,包括匹配字段和 action;鏈是一組規(guī)則的集合;表是鏈中相同功能的規(guī)則集合。

Netfilter 可以實現(xiàn)多種功能,如在 Linux 內(nèi)核中利用 Netfilter 解析數(shù)據(jù)包,自適應多層 VLan 和 PPPoe 網(wǎng)絡環(huán)境;對特定 DNS 域名的請求數(shù)據(jù)包進行過濾;解析 IP 層數(shù)據(jù)頭部;對特定端口的數(shù)據(jù)包進行過濾;解析 HTTP 請求和返回數(shù)據(jù)包,對特定 Host、URI、文件下載的數(shù)據(jù)包進行過濾;在以太網(wǎng)環(huán)境中,對數(shù)據(jù)包進行處理;在網(wǎng)橋環(huán)境中,對經(jīng)過網(wǎng)橋的數(shù)據(jù)包進行解析。

二、Netfilter工作原理

2.1 什么是Netfilter

Netfilter是Linux內(nèi)核中的一個數(shù)據(jù)包處理模塊,它可以提供數(shù)據(jù)包的過濾、轉(zhuǎn)發(fā)、地址轉(zhuǎn)換NAT功能。Iptables是一個工具,可以用來在Netfilter中增加、修改、刪除數(shù)據(jù)包處理規(guī)則,Netfilter是位于網(wǎng)卡和內(nèi)核協(xié)議棧之間的一堵墻,是一種免費的軟件防火墻。

Netfilter中有三個主要的概念:規(guī)則、表、鏈,等級依次遞增

  • 規(guī)則是對特定報文的處理說明,包括匹配字段和action。
  • 鏈是一組規(guī)則的集合。
  • 表是鏈中相同功能的規(guī)則集合。

圖片圖片

這幅示意圖中,IP包一進一出,有幾個關鍵的檢查點,它們正是Netfilter設置防火墻的地方。Netfilter通過向內(nèi)核協(xié)議棧中不同的位置注冊鉤子函數(shù)來對數(shù)據(jù)包進行過濾或者修改操作,這些位置稱為掛載點,主要有 5 個:PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT 和 POST_ROUTING,如下圖所示:

圖片圖片

  • PRE_ROUTING:IP包進入IP層后,還沒有對數(shù)據(jù)包進行路由判定前;
  • LOCAL_IN:進入主機,對IP包進行路由判定后,如果IP 包是發(fā)送給本地的,在進入傳輸層之前對IP包進行過濾;
  • LOCAL_OUT:IP包通過傳輸層進入用戶空間,交給用戶進程處理。而處理完成后,用戶進程會通過本機發(fā)出返回的 IP 包,在沒有對輸出的IP包進行路由判定前進行過濾;
  • FORWARD:IP包進行路由判定后,如果IP包不是發(fā)送給本地的,在轉(zhuǎn)發(fā)IP包出去前進行過濾;
  • POST_ROUTING:對于輸出的IP包,在對IP包進行路由判定后進行過濾;

在圖中可以看出決定IP包走向就是路由,按照路由的判定可以分為兩條路線:

  • 第一個路由通過查找輸入數(shù)據(jù)包 IP頭部的IP地址,判斷是否為本機的IP地址是否一致,如果與本機的 IP地址一致,說明數(shù)據(jù)是發(fā)送給本機的,否則說明數(shù)據(jù)包是發(fā)送給其他主機,只是經(jīng)過本機中轉(zhuǎn);
  • 第二個路由判定根據(jù)輸出數(shù)據(jù)包 IP頭部的IP地址 從路由表中查找對應的路由信息,然后根據(jù)路由信息獲取下一主機的 IP地址,然后進行數(shù)據(jù)傳輸;

通過向掛載點注冊鉤子函數(shù),就能夠?qū)μ幱诓煌A段的數(shù)據(jù)包進行過濾或者修改操作。由于鉤子函數(shù)能夠注冊多個,因此掛載點通過鏈表鏈接,所以掛載點又被稱為鏈,因此LOCAL_IN掛載點又稱為INPUT鏈、LOCAL_OUT 掛載點又稱為 OUTPUT鏈、FORWARD掛載點又稱為 PORWARD鏈、PRE_ROUTING掛載點又稱為 PREROUTING鏈、POST_ROUTING掛載點又稱為 POSTOUTING鏈。

2.2 什么是iptables

iptables是建立在 Netfilter 之上的數(shù)據(jù)包過濾器,通過向 Netfilter 的掛載點上注冊鉤子函數(shù)來實現(xiàn)對數(shù)據(jù)包過濾的,從iptables這個名字上可以看出一定具有表的概念,iptables通過把這些規(guī)則表掛載在 Netfilter 的不同鏈上,對進出內(nèi)核協(xié)議棧的數(shù)據(jù)包進行過濾或者修改操作。

iptables包括四種表:

  • Filter表用于過濾數(shù)據(jù)包,是iptables的默認表,因此如果你配置規(guī)則時沒有指定表,那么就默認使用Filter表,F(xiàn)ilter表可以作用于INPUT鏈、OUTPUT鏈、PORWARD鏈;
  • NAT表用于對數(shù)據(jù)包的網(wǎng)絡地址轉(zhuǎn)換(IP、端口),分別可以掛載到PREROUTING鏈、POSTOUTING鏈、OUTPUT鏈;
  • Mangle主要用來修改IP數(shù)據(jù)包頭,比如修改TTL值,同時也用于給數(shù)據(jù)包添加一些標記,從而便于后續(xù)其它模塊對數(shù)據(jù)包進行處理,可以作用在所有鏈上;
  • Raw表用于判定數(shù)據(jù)包是否被狀態(tài)跟蹤處理,可以作用于PREROUTING鏈、OUTPUT鏈;

圖片圖片

數(shù)據(jù)包從網(wǎng)絡中進入到內(nèi)核協(xié)議棧的過程中,要執(zhí)行的 iptables 規(guī)則,如果在執(zhí)行某條 iptables 規(guī)則失敗后,會直接把數(shù)據(jù)包丟棄,不會繼續(xù)執(zhí)行下面的規(guī)則。

表的實現(xiàn)

表的基本數(shù)據(jù)結(jié)構(gòu)是ipt_table(位于include/linux/netfilter_ipv4/iptables.h,Line413)。

1 struct ipt_table
 2 {
 3 struct list_head list; // 一個雙向鏈表
 4 char name[IPT_TABLE_MAXNAMELEN]; // 被用戶空間使用的表函數(shù)的名字
 5 struct ipt_replace *table; // 表初始化的模板,定義了一個初始化用的表,該表的所默認的HOOK 所包含的規(guī)則等信息
 7 // 用戶通過系統(tǒng)調(diào)用進行表的替換時也要用
 8 unsigned int valid_hooks; // 表所監(jiān)聽的HOOK,實質(zhì)是一個位圖
 9 rwlock_t lock; // 整個表的讀/寫自旋鎖
10 struct ipt_table_info *private; // 表所存儲的數(shù)據(jù)信息,也就是實際的數(shù)據(jù)區(qū),
11 // 僅在處理ipt_table 的代碼內(nèi)部使用
12 struct module *me; // 如果是模塊,那么取THIS_MODULE,否則取NULL
13 };

其中:

unsigned int valid_hooks;:這個位圖有兩個作用:一個是檢查Netfilter中哪些Hook對應著合法的entries;二是用來為ipt_match以及ipt_target數(shù)據(jù)結(jié)構(gòu)中的checkentry()函數(shù)核算可能的Hook。

struct module *me;:當取值為THIS_MODULE時,可以阻止用戶rmmod一個仍然被某個規(guī)則指向的模塊的嘗試。

struct ipt_replace *table;:該數(shù)據(jù)結(jié)構(gòu)是被用戶空間來替換一個表的,其定義位于include/linux/netfilter_ipv4/ip_tables.h,Line230。

struct ipt_replace
{
char name[IPT_TABLE_MAXNAMELEN];
unsigned int valid_hooks;

unsigned int num_entries; // 規(guī)則表入口的數(shù)量
unsigned int size; // 新的規(guī)則表的總大小
/* Hook entry points. */
// 表所監(jiān)聽HOOK 的規(guī)則入口, 是對于entries[ ]的偏移
unsigned int hook_entry[NF_IP_NUMHOOKS];
unsigned int underflow[NF_IP_NUMHOOKS]; // 規(guī)則表的最大下界
 // 舊的計數(shù)器數(shù)目,即當前的舊entries 的數(shù)目
unsigned int num_counters;
struct ipt_counters *counters; // 舊的計數(shù)器
struct ipt_entry entries[0]; // 規(guī)則表入口
};

上文所提到的filter、nat、mangle表分表是ipt_table這個數(shù)據(jù)結(jié)構(gòu)的三個實例:packet_filter(位于net/ipv4/netfilter/iptable_filter.c,Line84)、Nat(位于net/ipv4/netfilter/ip_nat_rule.c,Line104)以及packet_mangler(位于net/ipv4/netfilter/iptable_mangler.c,Line117);

ipt_table_info(位于net/ipv4/netfilter/iptables.c,Line86),是實際描述規(guī)則表的數(shù)據(jù)結(jié)構(gòu)。

struct ipt_table_info
{
unsigned int size;
unsigned int number; // 表項的數(shù)目
unsigned int initial_entries; // 初始表項數(shù)目
 // 所監(jiān)聽HOOK 的規(guī)則入口
unsigned int hook_entry[NF_IP_NUMHOOKS];
unsigned int underflow[NF_IP_NUMHOOKS]; // 規(guī)則表的最大下界
// 規(guī)則表入口,即真正的規(guī)則存儲結(jié)構(gòu)ipt_entry 組成塊的起始地址,
//對多CPU,每個CPU 對應一個
char entries[0] ____cacheline_aligned;
};

添加iptables規(guī)則

使用 iptables 命令添加規(guī)則,iptables可以分為四部分:

iptables -t表  -A鏈  匹配規(guī)則  動作

匹配條件

匹配條件分為基本匹配條件與擴展匹配條件,基本匹配條件包括源IP地址和目標IP地址等,擴展匹配條件包括源端口和目標端口等;

處理動作

處理動作是指當匹配條件成功后要進行的一系列操作過程,動作也可以分為 基本動作 和 擴展動作,常用的動作如下:

  • ACCEPT:允許數(shù)據(jù)包通過;
  • DROP:直接丟棄數(shù)據(jù)包,不給任何回應信息;
  • REJECT:拒絕數(shù)據(jù)包通過,必要時會給數(shù)據(jù)發(fā)送端一個響應的信息,客戶端剛請求就會收到拒絕的信息;
  • SNAT:源IP地址轉(zhuǎn)換;
  • DNAT:目標IP地址轉(zhuǎn)換;
  • REDIRECT:在本機做端口映射;
-t <表>:指定要操縱的表;
-A <鏈>:向規(guī)則鏈中添加條目;
-D <鏈>:從規(guī)則鏈中刪除條目;
-I <鏈>:向規(guī)則鏈中插入條目;
-R <鏈>:替換規(guī)則鏈中的條目;
-L:顯示規(guī)則鏈中已有的條目;
-F:清楚規(guī)則鏈中已有的條目;
-Z:清空規(guī)則鏈中的數(shù)據(jù)包計算器和字節(jié)計數(shù)器;
-N:創(chuàng)建新的用戶自定義規(guī)則鏈;
-P:定義規(guī)則鏈中的默認目標;
-h:顯示幫助信息;
-p:指定要匹配的數(shù)據(jù)包協(xié)議類型;
-s:指定要匹配的數(shù)據(jù)包源ip地址;
-j <動作>:指定要進行的動作行為;
-i <網(wǎng)絡接口>:指定數(shù)據(jù)包進入本機的網(wǎng)絡接口;
-o <網(wǎng)絡接口>:指定數(shù)據(jù)包要離開本機所使用的網(wǎng)絡接口。
--dport <端口>:匹配目標端口號。
--sport <端口>:匹配來源端口號。

一條完整的規(guī)則由三個數(shù)據(jù)結(jié)構(gòu)共同實現(xiàn),分別是:

一個ipt_entry結(jié)構(gòu),存儲規(guī)則的整體信息;

0或多個ipt_entry_match結(jié)構(gòu),存放各種match,每個結(jié)構(gòu)都可以存放任意的數(shù)據(jù),這樣也就擁有了良好的可擴展性;

1個ipt_entry_target結(jié)構(gòu),存放規(guī)則的target,類似的,每個結(jié)構(gòu)也可以存放任意的數(shù)據(jù);

下面將依次對這三個數(shù)據(jù)結(jié)構(gòu)進行分析:

存儲規(guī)則整體的結(jié)構(gòu)ipt_entry,其形式是一個鏈表(位于include/linux/netfilter_ipv4/ip_tables.h,Line122),如下所示:

struct ipt_entry
{
    struct ipt_ip ip;
    unsigned int nfcache;
    u_int16_t target_offset;
    u_int16_t next_offset;
    unsigned int comefrom;
    struct ipt_counters counters;
    unsigned char elems[0];
};
   其成員含義如下:
    struct ipt_ip ip;:這是對其將要進行匹配動作的IP 數(shù)據(jù)報報頭的描述,其定義于include/linux/netfilter_ipv4/ip_tables.h,Line122,其成員包括源/目的IP 及其掩碼,出入端口及其掩碼,協(xié)議族、標志/取反flag 等信息。
    unsigned int nfcache;:HOOK 函數(shù)返回的cache 標識,用以說明經(jīng)過這個規(guī)則后數(shù)據(jù)報的狀態(tài),其可能值有三個,定義于include/linux/netfilter.h,Line23:
    #define NFC_ALTERED 0x8000 //已改變
    #define NFC_UNKNOWN 0x4000 //不確定
    另一個可能值是0,即沒有改變。

    u_int16_t target_offset;:指出了target 的數(shù)據(jù)結(jié)構(gòu)ipt_entry_target的起始位置,即從ipt_entry 的起始地址到matc存儲結(jié)束的位置    u_int16_t next_offset;:指出了整條規(guī)則的大小,也就是下一條規(guī)則的起始地址,即ipt_entry 的起始地址到match 偏移再到target 存儲結(jié)束的位置
    unsigned int comefrom;:所謂的“back pointer”,據(jù)引用此變量的代碼(主要是net/ipv4/netfilter/ip_tables.c 中)來看,它應該是指向數(shù)據(jù)報所經(jīng)歷的上一個規(guī)則地址,由此實現(xiàn)對數(shù)據(jù)報行為的跟蹤
    struct ipt_counters counters;:說明了匹配這個規(guī)則的數(shù)據(jù)報的計數(shù)以及字節(jié)計數(shù)(定義于include/linux/netfilter_ipv4/ip_tables.h,Line100)
  unsigned char elems[0];:表示擴展的match 開始的具體位置(因為它是大小不確定的),當然,如果不存在擴展的match 那么就是target 的開始位置

擴展match的存儲結(jié)構(gòu)ipt_entry_match,位于include/linux/netfilter_ipv4/ip_tables.h,Line48。

struct ipt_entry_match
{
    union {
        struct {
        u_int16_t match_size;
        char name[IPT_FUNCTION_MAXNAMELEN];
        } user;

        struct {
        u_int16_t match_size;
        struct ipt_match *match;
        } kernel;
        u_int16_t match_size; //總長度
    } u;
    unsigned char data[0];
};
      其中描述match 大小的`u_int16_t match_size;`,從涉及這個變量的源碼看來,在使用的時候需要注意使用一個宏IPT_ALIGN(位于include/linux/netfilter_ipv4/ip_tables.h,Line445)來進行4 的對齊處理(0x3 & 0xfffffffc),這應該是由于match、target 擴展后大小的不確定性決定的。
      在結(jié)構(gòu)中,用戶空間與內(nèi)核空間為不同的實現(xiàn),內(nèi)核空間中的描述擁有更多的信息。在用戶空間中存放的僅僅是match 的名稱,而在內(nèi)核空間中存放的則是一個指向ipt_match 結(jié)構(gòu)的指針。
      結(jié)構(gòu)ipt_match 位于include/linux/netfilter_ipv4/ip_tables.h,Line342:
struct ipt_match
{
    void *matchinfo, // 指向規(guī)則中match 數(shù)據(jù)的指針,
    // 具體是什么數(shù)據(jù)結(jié)構(gòu)依情況而定
    int offset, // IP 數(shù)據(jù)報的偏移
    const void *hdr, // 指向協(xié)議頭的指針
    u_int16_t datalen, // 實際數(shù)據(jù)長度,即數(shù)據(jù)報長度-IP 頭長度
    int *hotdrop);
    int (*checkentry)(const char *tablename, // 可用的表
    const struct ipt_ip *ip,
    void (*matchinfo,
                unsigned int matchinfosize,
                unsigned int hook_mask); // 對應HOOK 的位圖
    void (*destroy)(void *matchinfo, 
                unsigned int matchinfosize);
                struct module *me;
};
 其中幾個重要成員:
   `int (*match)(……);`:指向用該match 進行匹配時的匹配函數(shù)的指針,match 相關的核心實現(xiàn)。返回0 時hotdrop 置1,立即丟棄數(shù)據(jù)報;返回非0 表示匹配成功。
   `int (*checkentry)(……);`:當試圖插入新的match 表項時調(diào)用這個指針所指向的函數(shù),對新的match 表項進行有效性檢查,即檢查參數(shù)是否合法;如果返回false,規(guī)則就不會被接受(譬如,一個TCP
的match 只會TCP 包,而不會接受其它)。
  `void (*destroy)(……);`:當試圖刪除一個使用這個match 的表項時,即模塊釋放時,調(diào)用這個指針所指向的函數(shù)。我們可以在checkentry()中動態(tài)地分配資源,并在destroy 中將其釋放。

target的存儲結(jié)構(gòu)ipt_entry_target,位于include/linux/netfilter_ipv4/ip_tables.h,Line71,這個結(jié)構(gòu)與ipt_entry_match結(jié)構(gòu)類似,同時其中描述內(nèi)核target結(jié)構(gòu)ipt_target(位于include/linux/netfilter_ipv4/iptables.h,Line375)也與ipt_match類似,只不過其中的target()函數(shù)返回值不是0/1,而是verdict。

而target的實際使用中,是用一個結(jié)構(gòu)ipt_standard_target專門來描述,這才是實際的target描述數(shù)據(jù)結(jié)構(gòu)(位于include/linux/netfilter_ipv4/iptables.h,Line94),它實際上就是一個ipt_entry_target + verdict。

其中成員verdict這個變量時一個很巧妙的設計,也是一個非常重要的東西,其值的正負有著不同的意義。它的值包括IPT_CONTINUE、IPT_RETURN以及前文所述的NF_DROP等值,那么它的作用是什么呢?原因如下:

o 由于iptables 是在用戶空間中執(zhí)行的,也就是說Netfilter/IPTables這個框架需要用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)交換以及識別。而在具體的程序中,verdict 作為`struct ipt_standard_target`的一個成員,也是對于`struct ipt_entry_target`中的target()函數(shù)的返回值。這個返回值標識的是target()所對應的執(zhí)行動作,包括系統(tǒng)的默認動作以及外部提交的自定義動作。
    o 但是,在用戶空間中提交的數(shù)據(jù)往往是類似于“ACCPET”之類的字符串,在程序處理時則是以`#define NF_ACCEPT 1`的形式來進行的;而實際上,以上那些執(zhí)行動作是以鏈表的數(shù)據(jù)結(jié)構(gòu)進行存儲的,在內(nèi)核空間中表現(xiàn)為偏移。
    o 于是,verdict 實際上描述了兩個本質(zhì)相同但實現(xiàn)不同的值:一個是用戶空間中的執(zhí)行動作,另一個則是內(nèi)核空間中在鏈表中的偏移——而這就出現(xiàn)了沖突。
    o 解決這種沖突的方法就是:用正值表示內(nèi)核中的偏移,而用負值來表示數(shù)據(jù)報的那些默認動作,而外部提交的自定義動作則也是用正值來表示。這樣,在實際使用這個verdict 時,我們就可以通過判斷值的正負來進行相應的處理了。
    o 位于net/ipv4/netfilter/ip_tables.h 中的函數(shù)ipt_do_table()中有一個典型的verdict 使用(Line335,其中v 是一個verdict 的實例):
    if (v !=IPT_RETURN)     {
      verdict = (unsigned)(-v) - 1;
      break;
    }
  其中的IPT_RETURN 定義為:
  #define IPT_RETURN (-NF_MAX_VERDICT – 1)
  而宏NF_MAX_VERDICT 實際上就是:
  #define NF_MAX_VERDICT NF_REPEAT
  這樣,實際上IPT_RETURN 的值就是-NF_REPEAT-1,也就是對應REPEAT,這就是對執(zhí)行動

match的定位如下:

  • 起始地址為:當前規(guī)則(起始)地址 + sizeof(struct ipt_entry);
  • 結(jié)束地址為:當前規(guī)則(起始)地址 + ipt_entry->target_offset;
  • 每一個match的大小為:ipt_entry_match->u.match_size;

target的定位則為:

  • 起始地址為match的結(jié)束地址,即:當前規(guī)則(起始)地址 + ipt_entry->target_offset;
  • 結(jié)束地址為下一條規(guī)則的起始地址,即:當前規(guī)則(起始)地址 + ipt_entry->next_offset;
  • 每一個target的大小為:ipt_entry_target->u.target_size;

這些對于理解match以及target相關函數(shù)的實現(xiàn)是很有必要明確的。

同時,include/linux/netfilter_ipv4/ip_tables.h中提供了三個“helper functions”,可用于使對于entry、target和match的操作變得方便,分別為:

  • 函數(shù)ipt_get_target(),作用是取得target的起始地址,也就是上面所說的當前規(guī)則(起始)地址 + ipt_entry->target_offset;
  • 宏IPT_MATCH_ITERATE(),作用是遍歷規(guī)則的所有match,并執(zhí)行同一個(參數(shù)中)給定的函數(shù)。其參數(shù)為一個ipt_entry_match結(jié)構(gòu)和一個函數(shù),以及函數(shù)需要的參數(shù)。當返回值為0時,表示遍歷以及函數(shù)執(zhí)行順利完成;返回非0值時則意味著出現(xiàn)問題已終止;
  • 宏IPT_ENTRY_ITERATE(),作用是遍歷一個表中的所有規(guī)則,并執(zhí)行同一個給定的函數(shù)。其參數(shù)是一個ipt_entry結(jié)構(gòu)、整個規(guī)則表的大小,以及一個函數(shù)和其所需的參數(shù)。其返回值與宏IPT_MATCH_ITERATE()類似;

那么,如何保證傳入的ipt_entry結(jié)構(gòu)是整個規(guī)則表的第一個結(jié)構(gòu)呢?據(jù)源碼看來,實際調(diào)用這個宏的時候傳入的第一個參數(shù)都是某個ipt_table_info結(jié)構(gòu)的實例所指向的entries成員,這樣就保證了對整個規(guī)則表的完整遍歷。

規(guī)則的使用

當一個特定的Hook被激活后,數(shù)據(jù)報就進入Netfilter/iptables系統(tǒng)進行遍歷,首先檢查‘struct ipt_ip ip’,然后數(shù)據(jù)報將依次遍歷各個match,也就是'struct ipt_entry_match',并執(zhí)行相應的match函數(shù),即ipt_match結(jié)構(gòu)中的*match所指向的函數(shù)。當match函數(shù)匹配不成功時返回0,或者hotdrop被置為1時,遍歷將會停止。(這部分有點亂,先放這,等看源碼好好看看。。)

對match的遍歷完成后,會開始檢查'struct ipt_entry_target',其中如果是一個標準的target,那么會檢查‘struct ipt_standard_target'中的verdict,如果verdict值是正的而偏移卻指向了不正確的位置,那么,ipt_entry中的comefrom成員就有了用武之地——數(shù)據(jù)報返回所經(jīng)歷的上一個規(guī)則。對于非標準的target呢?就會調(diào)用target()函數(shù),然后根據(jù)其返回值進行后面的處理。(對于verdict不太明白,先放這。。)

iptables 與 Netfilter 的關系

iptables 作為用戶空間的工具,為用戶提供了一個直觀的界面來編寫防火墻規(guī)則。用戶可以通過命令行操作 iptables,將特定的規(guī)則配置下發(fā)到內(nèi)核空間的 Netfilter。而 Netfilter 作為內(nèi)核中的防護框架,接收來自 iptables 的規(guī)則,并在網(wǎng)絡數(shù)據(jù)包流經(jīng)內(nèi)核協(xié)議棧時,依據(jù)這些規(guī)則對數(shù)據(jù)包進行處理。例如,當用戶使用 iptables 命令設置了一條過濾規(guī)則,iptables 會將這條規(guī)則轉(zhuǎn)化為特定的格式,并通知 Netfilter 在相應的位置進行處理。這樣,兩者緊密配合,共同實現(xiàn)了對網(wǎng)絡流量的精細控制。

三、Netfilter/iptables-IPv4總體架構(gòu)

Netfilter主要通過表、鏈實現(xiàn)規(guī)則,可以這么說,Netfilter是表的容器,表是鏈的容器,鏈是規(guī)則的容器,最終形成對數(shù)據(jù)報處理規(guī)則的實現(xiàn)。

3.1 Netfilter的Hook機制

Netfilter的通用框架不依賴于具體的協(xié)議,而是為每種網(wǎng)絡協(xié)議定義一套Hook函數(shù)。這些Hook函數(shù)在數(shù)據(jù)報經(jīng)過協(xié)議棧的幾個關鍵點時被調(diào)用,在這幾個點中,協(xié)議棧將數(shù)據(jù)報以及Hook函數(shù)標號作為參數(shù),傳遞給Netfilter框架。

對于它在網(wǎng)絡堆棧中增加的這些Hook,內(nèi)核的任何模塊可以對每種協(xié)議的一個或多個Hook進行注冊,實現(xiàn)掛接。這樣當某個數(shù)據(jù)報被傳遞給Netfilter框架時,內(nèi)核能檢測到是否有任何模塊對該協(xié)議和Hook函數(shù)進行了注冊。

若注冊了,則調(diào)用該模塊的注冊時使用的“回調(diào)”函數(shù),這樣這些模塊就有機會檢查、修改、丟棄該數(shù)據(jù)報及指示Netfilter將該數(shù)據(jù)報傳入用戶空間隊列。

這樣,Hook提供了一種方便的機制:在數(shù)據(jù)報通過Linux內(nèi)核的不同位置上截獲和操作處理數(shù)據(jù)報。

3.2 iptables基礎模塊

iptables基礎模塊實現(xiàn)了三個表來篩選各種數(shù)據(jù)報,具體的講,Linux2.4內(nèi)核提供了這三種數(shù)據(jù)報的處理功能是相互間獨立的模塊,都基于Netfilter的Hook函數(shù)和各種表、鏈實現(xiàn)的。這三個表包括:filter表、nat表以及mangle表。具體功能模塊:

  • 數(shù)據(jù)報過濾模塊
  • 連接跟蹤模塊
  • 網(wǎng)絡地址轉(zhuǎn)換模塊(NAT)
  • 數(shù)據(jù)報修改模塊(mangle)
  • 其他高級功能模塊

3.3 Netfilter 的架構(gòu)

Netfilter 的四表五鏈架構(gòu)是其實現(xiàn)強大功能的關鍵。filter 表主要用于數(shù)據(jù)包過濾,當數(shù)據(jù)包經(jīng)過 filter 表中的鏈時,會根據(jù)預先設置的規(guī)則判斷是否允許數(shù)據(jù)包通過。例如,可以設置規(guī)則只允許特定 IP 地址或端口的數(shù)據(jù)包通過。nat 表用于網(wǎng)絡地址轉(zhuǎn)換,在網(wǎng)絡環(huán)境中,當需要將內(nèi)部網(wǎng)絡的 IP 地址轉(zhuǎn)換為外部可訪問的地址時,nat 表就發(fā)揮了重要作用。比如,在一個企業(yè)網(wǎng)絡中,通過 nat 表可以將內(nèi)部多個設備的私有 IP 地址轉(zhuǎn)換為一個公共 IP 地址,實現(xiàn)對外通信。mangle 表用于修改數(shù)據(jù)包的頭部信息,如修改服務類型(TOS)、生存時間(TTL)等。這可以用于實現(xiàn)服務質(zhì)量調(diào)整和策略路由等應用。raw 表則主要用于決定數(shù)據(jù)包是否被狀態(tài)跟蹤機制處理。優(yōu)先級的設置確保了數(shù)據(jù)包在處理過程中按照特定的順序進行。當數(shù)據(jù)包進入 Netfilter 框架時,首先會經(jīng)過 raw 表的處理,如果 raw 表處理完后決定不進行連接跟蹤處理,那么數(shù)據(jù)包將跳過 nat 表和連接跟蹤處理,直接進入后續(xù)的處理階段。

防火墻狀態(tài)機制配置

Netfilter 的防火墻狀態(tài)機制是其高效處理數(shù)據(jù)包的重要手段之一。根據(jù)連接狀態(tài)匹配數(shù)據(jù)包,可以加快轉(zhuǎn)發(fā)速度。連接狀態(tài)主要有 New、Established、Related 和 INVALID 四種。當一個新的連接建立時,數(shù)據(jù)包處于 New 狀態(tài)。一旦連接建立成功,后續(xù)的數(shù)據(jù)包就處于 Established 狀態(tài)。Related 狀態(tài)表示與已建立連接相關的數(shù)據(jù)包,比如 FTP 數(shù)據(jù)連接與控制連接相關。INVALID 狀態(tài)表示數(shù)據(jù)包的狀態(tài)無法確定或無效。這種狀態(tài)機制可以記錄動態(tài)網(wǎng)絡地址轉(zhuǎn)換(dnat),方便在需要時進行還原。例如,在進行網(wǎng)絡地址轉(zhuǎn)換時,Netfilter 可以記錄下轉(zhuǎn)換前的地址信息,以便在后續(xù)的數(shù)據(jù)包處理中進行還原。同時,狀態(tài)機制還可以控制規(guī)則的存放和開啟,根據(jù)不同的連接狀態(tài)應用不同的規(guī)則,提高了防火墻的靈活性和效率。

Netfilter 模塊收發(fā)和轉(zhuǎn)發(fā)數(shù)據(jù)包流程

Netfilter 模塊在收發(fā)和轉(zhuǎn)發(fā)數(shù)據(jù)包時,經(jīng)過多個關鍵處理階段。當數(shù)據(jù)包進入網(wǎng)絡層時,首先會經(jīng)過 Netfilter 的 hook function。這些 hook function 就像一個個檢查點,對數(shù)據(jù)包進行特定的處理。例如,在 NF_IP_PRE_ROUTING 掛載點,數(shù)據(jù)包剛剛進入網(wǎng)絡層,此時可以進行目的地址轉(zhuǎn)換等操作。內(nèi)置鏈在數(shù)據(jù)包處理過程中也起著重要作用。不同的鏈對應著不同的處理階段和功能。例如,在轉(zhuǎn)發(fā)數(shù)據(jù)包時,會經(jīng)過 NF_IP_FORWARD 鏈的處理,在這里可以進行 FORWARD 包過濾。Netfilter 根據(jù)優(yōu)先級和規(guī)則對數(shù)據(jù)包進行處理,確保數(shù)據(jù)包按照既定的策略進行轉(zhuǎn)發(fā)、過濾或其他操作。在整個處理過程中,Netfilter 充分發(fā)揮了其靈活性和可擴展性,為網(wǎng)絡安全提供了堅實的保障。

四、Netfilter基本配置

配置 22/ssh 端口訪問控制規(guī)則

使用 iptables 可以靈活地配置 22/ssh 端口的訪問控制規(guī)則。例如,可以使用以下命令禁止所有人訪問 22 端口:iptables -A INPUT -p tcp --dport 22 -j DROP。若要恢復連接,可以使用iptables -I INPUT -p tcp --dport 22 -j ACCEPT。還可以通過插入指定行號信息,將規(guī)則插入到特定位置,如iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT。刪除指定規(guī)則可以使用iptables -D INPUT -p tcp --dport 22 -j ACCEPT或根據(jù)規(guī)則行號刪除相應規(guī)則,如iptables -D INPUT 2。如果只允許特定 IP(如 10.0.0.1)通過 ssh 連接這臺服務器,可以使用iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT。

禁止網(wǎng)段連入

要禁止特定網(wǎng)段連入服務器,可以使用以下命令。例如,禁止 172.16.1.0 網(wǎng)段訪問 172.16.1.188,可以使用iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -j DROP。

控制特定網(wǎng)段訪問服務器主機的端口

如果要禁止某個 172.16.1.0 網(wǎng)段訪問服務器主機的 22 端口,可以使用iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -p tcp --dport 22 -j DROP。在入方向控制時,可以使用iptables -I INPUT -i eth0 -p tcp --dport 22 -j ACCEPT;在出方向控制時,可以使用iptables -I OUTPUT -o eth0 -p tcp --sport 22 -j DROP。

設置除特定網(wǎng)段外其他網(wǎng)段禁止連接

可以通過兩種方法設置除特定網(wǎng)段外其他網(wǎng)段禁止連接。方法一是修改默認規(guī)則,將默認規(guī)則改為拒絕,如iptables -A INPUT -s 10.0.0.0/24 -d 172.16.1.8 -j ACCEPT;方法二是使用取反操作,如iptables -A INPUT! -s 10.0.0.0/24 -d 172.16.1.8 -j DROP。

測試匹配列舉端口范圍

可以使用 iptables 測試匹配列舉端口范圍。設置連續(xù)多端口控制策略可以使用iptables -A INPUT -p tcp --dport 22:80 -j DROP;設置不連續(xù)多端口控制策略可以使用iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP。

五、企業(yè)級防火墻配置

備份服務器的重要性

在企業(yè)級防火墻配置中,備份服務器起著至關重要的作用。備份服務器可以確保在防火墻配置出現(xiàn)問題或遭受攻擊時,能夠快速恢復到之前的穩(wěn)定狀態(tài)。例如,飛塔防火墻自動備份技巧中,通過在 CentOS 7 備份服務器上安裝工具 sshpass,并進行一系列配置,可以實現(xiàn)對飛塔防火墻的自動備份。創(chuàng)建存儲備份文件的文件夾,編寫備份腳本firewallbackup.sh,同時創(chuàng)建ip.txt文件記錄飛塔防火墻的登陸地址。通過配置 CentOS 7 的計劃任務crontab -e,可以實現(xiàn)每天定時自動備份,如每天 11 點和 23 點自動備份一次。這樣可以有效防止因防火墻配置丟失或損壞而導致的業(yè)務中斷,為企業(yè)網(wǎng)絡安全提供了有力的保障。

開放 SSH 端口

開放 SSH 端口是企業(yè)級防火墻配置中的常見需求。使用 iptables 可以靈活地配置 SSH 端口的訪問控制規(guī)則。例如,可以使用以下命令禁止所有人訪問 22 端口:iptables -A INPUT -p tcp --dport 22 -j DROP。若要恢復連接,可以使用iptables -I INPUT -p tcp --dport 22 -j ACCEPT。還可以通過插入指定行號信息,將規(guī)則插入到特定位置,如iptables -I INPUT 2 -p tcp --dport 22 -j ACCEPT。刪除指定規(guī)則可以使用iptables -D INPUT -p tcp --dport 22 -j ACCEPT或根據(jù)規(guī)則行號刪除相應規(guī)則,如iptables -D INPUT 2。如果只允許特定 IP(如 10.0.0.1)通過 ssh 連接這臺服務器,可以使用iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT。

防止配置出錯導致無法連接服務器

在配置企業(yè)級防火墻時,需要注意防止配置出錯導致無法連接服務器??梢栽谂渲们斑M行備份,以便在出現(xiàn)問題時能夠快速恢復。同時,可以使用其他工具配置和管理 Netfilter 規(guī)則,如 firewalld。firewalld 是一個動態(tài)防火墻管理器,它可以動態(tài)修改單條規(guī)則,不需要像 iptables 那樣,修改了規(guī)則后必須全部刷新才可以生效。firewalld 的配置方法主要有三種:firewall-config、firewall-cmd 和直接編輯 xml 文件。其中 firewall-config 是圖形化工具,firewall-cmd 是命令行工具。通過使用 firewalld,可以更加方便地管理防火墻規(guī)則,提高配置的準確性和可靠性。

使用其他工具配置和管理 Netfilter 規(guī)則

除了 iptables 和 firewalld,還有其他工具可以配置和管理 Netfilter 規(guī)則。例如,Juniper 防火墻配置備份中,可以通過多種方式備份和恢復防火墻配置,包括設備重啟動、操作系統(tǒng)備份和恢復、配置文件備份和恢復等。通過這些工具,可以更加全面地管理企業(yè)級防火墻,提高網(wǎng)絡安全水平。

六、Netfilter的應用案例

6.1 Netfilter 在不同場景中的應用

Netfilter 在網(wǎng)絡安全領域有著廣泛的應用。它可以作為強大的防火墻,通過設置規(guī)則過濾網(wǎng)絡數(shù)據(jù)包,阻止惡意流量進入系統(tǒng)。例如,可以根據(jù)數(shù)據(jù)包的源 IP 地址、目標 IP 地址、協(xié)議類型、端口號等信息進行精細過濾,確保只有合法的數(shù)據(jù)包能夠通過。

在實現(xiàn)負載均衡方面,Netfilter 也發(fā)揮著重要作用。正如前面提到的,通過利用 Netfilter 的功能,可以實現(xiàn)將網(wǎng)絡流量分配到不同的服務器上,提高系統(tǒng)的可用性和性能。例如,通過 DNAT(目標網(wǎng)絡地址轉(zhuǎn)換)可以將請求數(shù)據(jù)包分離到不同的目的地址,然后配置路由將這些數(shù)據(jù)包導向不同的服務器,實現(xiàn)負載均衡。

Netfilter 還可以與 VPN 技術集成,保護數(shù)據(jù)傳輸。例如,IPSec VPN 技術中,Netfilter 可以在數(shù)據(jù)包處理過程中進行加密、認證等操作,確保數(shù)據(jù)在傳輸過程中的安全性。

6.2 具體案例

丟棄網(wǎng)絡包:有開發(fā)者編寫了一個簡單的內(nèi)核模塊,通過注冊 Netfilter 鉤子函數(shù),實現(xiàn)對所有網(wǎng)絡包的丟棄,并將這一操作記錄到/var/log/messages中。其實現(xiàn)過程如下:首先定義一個nf_hook_ops結(jié)構(gòu)體變量nfho,然后編寫鉤子函數(shù)hook_func,在該函數(shù)中打印 “packet dropped” 并返回NF_DROP,表示丟棄數(shù)據(jù)包。在模塊加載時,將鉤子函數(shù)、協(xié)議類型、鉤子觸發(fā)點編號等信息設置到nfho結(jié)構(gòu)體中,并調(diào)用nf_register_hook注冊鉤子函數(shù)。當模塊卸載時,調(diào)用nf_unregister_hook注銷鉤子函數(shù)。

針對 UDP 包過濾:另一個案例是針對 UDP 包進行過濾。同樣通過編寫內(nèi)核模塊,在 Netfilter 的鉤子函數(shù)中獲取 IP 頭部和 UDP 頭部,檢查協(xié)議字段是否為 UDP(協(xié)議號為 17),如果是則進行相應處理。在這個案例中,首先定義了nf_hook_ops結(jié)構(gòu)體變量nfho以及udphdr和iphdr結(jié)構(gòu)體指針。在鉤子函數(shù)中,通過skb_network_header和skb_transport_header函數(shù)獲取網(wǎng)絡頭部和傳輸頭部,然后檢查協(xié)議字段。如果是 UDP 包,則打印 “got udp packet” 并返回NF_DROP,表示丟棄該數(shù)據(jù)包。在模塊加載和卸載時,分別進行注冊和注銷鉤子函數(shù)的操作。

禁止 IP 協(xié)議:可以使用 iptables 的u32匹配方法來禁止具有特定 IP 選項的數(shù)據(jù)包。例如,通過檢查數(shù)據(jù)包的 IHL(互聯(lián)網(wǎng)標題長度)字段,如果大于 20(沒有選項的 IPv4 標頭長度),則丟棄數(shù)據(jù)包??梢允褂胕ptables -A INPUT -m u32! --u32 '0 & 0x0F000000 >>24 = 5' -j DROP命令來實現(xiàn),該命令表示如果數(shù)據(jù)包的前 32 位值經(jīng)過處理后不等于 5(沒有選項的 IHL 值),則丟棄該數(shù)據(jù)包。

禁止特定端口及 PING:可以使用 iptables 來禁止特定端口的訪問。例如,要禁止所有人訪問 22/ssh 端口,可以使用iptables -A INPUT -p tcp --dport 22 -j DROP命令。如果要禁止特定網(wǎng)段訪問服務器主機的 22 端口,可以使用iptables -A INPUT -s 172.16.1.0/24 -d 172.16.1.188 -p tcp --dport 22 -j DROP命令。此外,還可以使用 iptables 禁止 ICMP 包,實現(xiàn)其他機器不能 ping 通本機的效果,例如使用iptables -I INPUT -p icmp --icmp-type 8 -j DROP命令,其中--icmp-type 8表示能在本機 ping 通其他機器,而其他機器不能 ping 通本機。

七、Netfilter的特點及優(yōu)勢

強大的擴展性

Netfilter 最大的優(yōu)點就在于其擴展性好,可以任意定義新的模塊擴展其功能。用戶瀏覽 netfilter.org 就會知道,它里面融合了大量的策略,如 ebtables、arptables、nft 等都是 Netfilter 的擴展之一。Liuux 中使用的僅僅是它的一個很小的部分,大部分的內(nèi)容作為可插拔的 module 處于待命狀態(tài),為用戶提供了極大的靈活性來滿足不同的網(wǎng)絡管理需求。

易于理解的結(jié)構(gòu)

Netfilter 的結(jié)構(gòu)比較容易理解,即使是新手也能很快掌握其規(guī)則配置方法。它的四表五鏈架構(gòu)清晰明了,用戶可以通過 iptables 等工具直觀地配置規(guī)則,對網(wǎng)絡數(shù)據(jù)包進行過濾、修改和轉(zhuǎn)發(fā)等操作。例如,filter 表用于數(shù)據(jù)包過濾,nat 表用于網(wǎng)絡地址轉(zhuǎn)換,mangle 表用于修改數(shù)據(jù)包頭部信息,raw 表用于決定數(shù)據(jù)包是否被狀態(tài)跟蹤機制處理。每個表中的鏈對應著不同的處理階段和功能,用戶可以根據(jù)實際需求進行配置。

豐富的功能和可配置性

Netfilter 允許用戶和系統(tǒng)管理員配置規(guī)則來過濾、修改和轉(zhuǎn)發(fā)網(wǎng)絡數(shù)據(jù)包,實現(xiàn)多種功能。例如,可以通過設置規(guī)則控制哪些流量被允許進出系統(tǒng),實現(xiàn)數(shù)據(jù)包過濾;支持網(wǎng)絡地址轉(zhuǎn)換,使得私有網(wǎng)絡中的設備可以共享一個公共 IP 地址訪問外部網(wǎng)絡;可以跟蹤網(wǎng)絡連接的狀態(tài),動態(tài)地管理連接狀態(tài)。同時,Netfilter 還提供了多個鉤子點,在數(shù)據(jù)包進入系統(tǒng)和離開系統(tǒng)時進行關鍵處理。常見的鉤子點包括 PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING,用戶可以在這些鉤子點上注冊處理數(shù)據(jù)包的回調(diào)函數(shù),對數(shù)據(jù)包進行特定的處理。

高效的工作流程

Netfilter 的工作流程經(jīng)過多個鉤子點處理數(shù)據(jù)包,確保數(shù)據(jù)包按照既定的策略進行轉(zhuǎn)發(fā)、過濾或其他操作。當數(shù)據(jù)包進入網(wǎng)絡棧時,會經(jīng)過 Netfilter 的處理點。根據(jù)定義的規(guī)則,數(shù)據(jù)包可能會被接受、拒絕或修改。例如,在 NF_IP_PRE_ROUTING 掛載點,數(shù)據(jù)包剛剛進入網(wǎng)絡層,此時可以進行目的地址轉(zhuǎn)換等操作。內(nèi)置鏈在數(shù)據(jù)包處理過程中也起著重要作用,不同的鏈對應著不同的處理階段和功能。這種工作流程充分發(fā)揮了 Netfilter 的靈活性和可擴展性,為網(wǎng)絡安全提供了堅實的保障。

高度的靈活性和控制能力

Netfilter 在 Linux 網(wǎng)絡棧中扮演著關鍵角色,提供了高度的靈活性和控制能力。用戶可以根據(jù)自己的需求配置防火墻規(guī)則、進行網(wǎng)絡地址轉(zhuǎn)換、實施流量控制等操作。例如,可以使用 iptables 等工具靈活地配置規(guī)則,對特定 IP 地址、端口號、協(xié)議類型等進行精細過濾。同時,Netfilter 還支持多種協(xié)議棧,目前 Linux 2.6 版內(nèi)核的 Netfilter 支持 IPv4、IPv6 以及 DECnet 等協(xié)議棧,為用戶提供了廣泛的應用場景。

八、Netfilter的不足之處

Netfilter 雖然在網(wǎng)絡安全領域發(fā)揮著重要作用,但也存在一些不足之處。

狀態(tài)表結(jié)構(gòu)效率不高

Netfilter 的狀態(tài)表使用鏈表結(jié)構(gòu),雖然是 HASH 方式,但鏈接數(shù)非常大時,每個 HASH 表內(nèi)的參數(shù)還是很多的,順序查找起來就比較慢。例如,專業(yè)路由器大都使用類似二叉樹結(jié)構(gòu)實現(xiàn)快速查找,而 Linux 內(nèi)核的 Netfilter 卻采用 HASH 表,這在處理大量網(wǎng)絡數(shù)據(jù)包時可能會導致效率下降。

目標功能單一導致效率低

某些目標功能太單一,導致某些情況下效率不高。如要對某類數(shù)據(jù)進行流量限制,對超過限值的包記錄這樣的需求,就需要三條規(guī)則,一條是家流量限制匹配 - j ACCEPT,第二條 - j LOG --log-prefix...,第三條才是 - j DROP,同樣的規(guī)則匹配要匹配三次。如果不要求記錄的話會簡單一些,用一個子鏈來實現(xiàn)流量限制,就不用重復匹配條件了。但 netfilter 把日志作為一個目標而不是象 2.2 的 ipchains 那樣記錄日志是個規(guī)則選項,效率總是不高。

缺乏某些功能

Netfilter 某些功能不太好實現(xiàn),如 SYN 代理,SYN 代理在 freebsd、openbsd 等內(nèi)核都自帶,但在 linux 中卻遲遲未能包括,確實在 netfilter 這個架構(gòu)下這個功能不太好弄。

對攻擊識別和單個 IP 連接數(shù)限制困難

對需要進行統(tǒng)計的攻擊識別比較困難,如各種 flood 攻擊,無法定義 flood 模式,只能簡單的進行流量限制,限制了非法包的同時也限制了合法包。很難對一個網(wǎng)段內(nèi)單個 IP 的連接數(shù)進行限制,這樣一臺機器染毒瘋狂發(fā)包時不能把肇事 IP 挑出來,只能整個網(wǎng)段都限制,一損具損;同樣如果想對內(nèi)容進行過濾,如 string 匹配,也是同樣情況。

責任編輯:武曉燕 來源: 深度Linux
相關推薦

2011-03-15 09:10:43

iptables防火墻

2011-03-15 10:48:47

2011-08-12 16:06:01

2011-03-09 11:23:26

2011-03-15 16:35:27

2020-04-07 13:20:52

Linux防火墻ufw

2009-02-22 09:30:24

2010-07-07 20:06:53

2010-03-19 16:13:43

2010-09-16 10:52:44

防火墻負載分擔

2011-03-17 16:00:57

2009-09-28 10:06:09

Linux防火墻Linux規(guī)則

2010-08-20 11:08:46

2009-02-21 10:28:43

2011-07-05 14:34:23

2010-09-14 13:08:52

2011-03-15 15:47:26

LinuxIptables防火墻

2010-01-07 14:12:11

Linux防火墻

2009-10-12 11:24:10

RHEL 5防火墻

2010-03-05 09:36:04

linux系統(tǒng)防火墻
點贊
收藏

51CTO技術棧公眾號