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

Linux防火墻:Netfilter的深度解析

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

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

一、Netfilter概述

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

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

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

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

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

二、Netfilter工作原理

2.1 什么是Netfilter

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

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

  • 規(guī)則是對特定報(bào)文的處理說明,包括匹配字段和action。
  • 鏈?zhǔn)且唤M規(guī)則的集合。
  • 表是鏈中相同功能的規(guī)則集合。

圖片圖片

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

圖片圖片

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

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

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

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

2.2 什么是iptables

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

iptables包括四種表:

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

圖片圖片

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

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

其中:

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

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

struct ipt_replace *table;:該數(shù)據(jù)結(jié)構(gòu)是被用戶空間來替換一個(gè)表的,其定義位于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ī)則表的最大下界
 // 舊的計(jì)數(shù)器數(shù)目,即當(dāng)前的舊entries 的數(shù)目
unsigned int num_counters;
struct ipt_counters *counters; // 舊的計(jì)數(shù)器
struct ipt_entry entries[0]; // 規(guī)則表入口
};

上文所提到的filter、nat、mangle表分表是ipt_table這個(gè)數(shù)據(jù)結(jié)構(gòu)的三個(gè)實(shí)例: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),是實(shí)際描述規(guī)則表的數(shù)據(jù)結(jié)構(gòu)。

struct ipt_table_info
{
unsigned int size;
unsigned int number; // 表項(xiàng)的數(shù)目
unsigned int initial_entries; // 初始表項(xiàng)數(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,每個(gè)CPU 對應(yīng)一個(gè)
char entries[0] ____cacheline_aligned;
};

添加iptables規(guī)則

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

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

匹配條件

匹配條件分為基本匹配條件與擴(kuò)展匹配條件,基本匹配條件包括源IP地址和目標(biāo)IP地址等,擴(kuò)展匹配條件包括源端口和目標(biāo)端口等;

處理動作

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

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

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

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

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

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

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

存儲規(guī)則整體的結(jié)構(gòu)ipt_entry,其形式是一個(gè)鏈表(位于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;:這是對其將要進(jìn)行匹配動作的IP 數(shù)據(jù)報(bào)報(bào)頭的描述,其定義于include/linux/netfilter_ipv4/ip_tables.h,Line122,其成員包括源/目的IP 及其掩碼,出入端口及其掩碼,協(xié)議族、標(biāo)志/取反flag 等信息。
    unsigned int nfcache;:HOOK 函數(shù)返回的cache 標(biāo)識,用以說明經(jīng)過這個(gè)規(guī)則后數(shù)據(jù)報(bào)的狀態(tài),其可能值有三個(gè),定義于include/linux/netfilter.h,Line23:
    #define NFC_ALTERED 0x8000 //已改變
    #define NFC_UNKNOWN 0x4000 //不確定
    另一個(gè)可能值是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 中)來看,它應(yīng)該是指向數(shù)據(jù)報(bào)所經(jīng)歷的上一個(gè)規(guī)則地址,由此實(shí)現(xiàn)對數(shù)據(jù)報(bào)行為的跟蹤
    struct ipt_counters counters;:說明了匹配這個(gè)規(guī)則的數(shù)據(jù)報(bào)的計(jì)數(shù)以及字節(jié)計(jì)數(shù)(定義于include/linux/netfilter_ipv4/ip_tables.h,Line100)
  unsigned char elems[0];:表示擴(kuò)展的match 開始的具體位置(因?yàn)樗谴笮〔淮_定的),當(dāng)然,如果不存在擴(kuò)展的match 那么就是target 的開始位置

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

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

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

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

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

match的定位如下:

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

target的定位則為:

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

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

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

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

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

規(guī)則的使用

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

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

iptables 與 Netfilter 的關(guān)系

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

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

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

3.1 Netfilter的Hook機(jī)制

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

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

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

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

3.2 iptables基礎(chǔ)模塊

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

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

3.3 Netfilter 的架構(gòu)

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

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

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

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

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

四、Netfilter基本配置

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

使用 iptables 可以靈活地配置 22/ssh 端口的訪問控制規(guī)則。例如,可以使用以下命令禁止所有人訪問 22 端口:iptables -A INPUT -p tcp --dport 22 -j DROP。若要恢復(fù)連接,可以使用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ī)則行號刪除相應(yīng)規(guī)則,如iptables -D INPUT 2。如果只允許特定 IP(如 10.0.0.1)通過 ssh 連接這臺服務(wù)器,可以使用iptables -I INPUT -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT。

禁止網(wǎng)段連入

要禁止特定網(wǎng)段連入服務(wù)器,可以使用以下命令。例如,禁止 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)段訪問服務(wù)器主機(jī)的端口

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

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

可以通過兩種方法設(shè)置除特定網(wǎng)段外其他網(wǎng)段禁止連接。方法一是修改默認(rèn)規(guī)則,將默認(rèn)規(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 測試匹配列舉端口范圍。設(shè)置連續(xù)多端口控制策略可以使用iptables -A INPUT -p tcp --dport 22:80 -j DROP;設(shè)置不連續(xù)多端口控制策略可以使用iptables -A INPUT -p tcp -m multiport --dport 22,80 -j DROP。

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

備份服務(wù)器的重要性

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

開放 SSH 端口

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

防止配置出錯(cuò)導(dǎo)致無法連接服務(wù)器

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

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

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

六、Netfilter的應(yīng)用案例

6.1 Netfilter 在不同場景中的應(yīng)用

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

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

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

6.2 具體案例

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

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

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

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

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

強(qiáng)大的擴(kuò)展性

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

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

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

豐富的功能和可配置性

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

高效的工作流程

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

高度的靈活性和控制能力

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

八、Netfilter的不足之處

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

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

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

目標(biāo)功能單一導(dǎo)致效率低

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

缺乏某些功能

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

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

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

責(zé)任編輯:武曉燕 來源: 深度Linux
相關(guān)推薦

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

2009-02-21 10:28:43

2010-08-20 11:08:46

2009-09-28 10:06:09

Linux防火墻Linux規(guī)則

2011-03-17 16:00:57

2010-09-16 10:52:44

防火墻負(fù)載分擔(dān)

2010-03-19 16:13:43

2010-07-07 20:06:53

2009-02-22 09:30:24

2011-03-15 16:35:27

2020-04-07 13:20:52

Linux防火墻ufw

2011-07-05 14:34:23

2010-09-14 13:08:52

2009-10-12 11:24:10

RHEL 5防火墻

2010-03-05 09:36:04

linux系統(tǒng)防火墻

2010-09-17 10:07:28

2010-01-07 14:12:11

Linux防火墻
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號