• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于域名的iptables防火墻設(shè)計(jì)與實(shí)現(xiàn)

      2023-04-14 08:41:23李臣
      電腦知識(shí)與技術(shù) 2023年6期
      關(guān)鍵詞:網(wǎng)絡(luò)安全

      李臣

      摘要:網(wǎng)絡(luò)安全問(wèn)題在現(xiàn)實(shí)生活中變的愈發(fā)重要,而研究利用操作系統(tǒng)自帶的防火墻系統(tǒng)來(lái)阻斷異常流量是解決網(wǎng)絡(luò)安全問(wèn)題最常使用且高效的手段。Linux操作系統(tǒng)作為一個(gè)開(kāi)源的操作系統(tǒng)廣泛應(yīng)用于服務(wù)器和嵌入式領(lǐng)域,而這些領(lǐng)域往往是網(wǎng)絡(luò)安全問(wèn)題的重災(zāi)區(qū),研究Linux下的防火墻具有重要意義?,F(xiàn)有的防火墻系統(tǒng)中的配置規(guī)則一般是基于IP配置的,但是對(duì)于多個(gè)域名對(duì)應(yīng)一個(gè)IP的場(chǎng)景這種配置便不再適用,文章在Netfilter框架的基礎(chǔ)上設(shè)計(jì)實(shí)現(xiàn)了一個(gè)基于域名進(jìn)行配置的內(nèi)核模塊來(lái)解決上述問(wèn)題。

      關(guān)鍵詞: 網(wǎng)絡(luò)安全; 異常流量;Linux操作系統(tǒng); 防火墻規(guī)則; Netfilter框架

      中圖分類(lèi)號(hào):TP311? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A

      文章編號(hào):1009-3044(2023)06-0066-03

      開(kāi)放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID)

      隨著虛擬主機(jī)的廣泛應(yīng)用,一個(gè)IP經(jīng)常會(huì)對(duì)應(yīng)多個(gè)域名[1]。這樣導(dǎo)致我們?cè)谑褂梅阑饓M(jìn)行單個(gè)或多個(gè)IP流量阻斷時(shí)會(huì)發(fā)生錯(cuò)誤域名的阻斷。為了解決這一難題,本文基于Netfilter框架的可擴(kuò)展性開(kāi)發(fā)了一個(gè)Linux內(nèi)核模塊使得防火墻可以針對(duì)具體的域名或者域名集進(jìn)行流量的阻斷。

      1? Netfilter/Iptables框架

      Netfilter/Iptables 由三部分組成,分別是Netfilter框架,Iptables(內(nèi)核空間)和Iptables 命令行工具(用戶(hù)空間)[2]。

      1.1? Netfilter框架

      Netfilter是Linux內(nèi)核提供的一個(gè)框架[3],它允許以自定義處理程序的形式實(shí)現(xiàn)各種與網(wǎng)絡(luò)相關(guān)的操作。Netfilter 在 Linux內(nèi)核中表現(xiàn)為一系列的hook, 并允許Linux 內(nèi)核模塊注冊(cè)為回調(diào)函數(shù),Linux內(nèi)核模塊通過(guò)回調(diào)函數(shù)操作網(wǎng)絡(luò)報(bào)文。Netfilter框架一共提供了5個(gè)hook,分別位于linux 網(wǎng)絡(luò)棧中的各個(gè)處理節(jié)點(diǎn),如圖1所示:

      Netfilter Hook的意義:

      NF_IP_PRE_ROUTING: 位于路由之前,報(bào)文一致性檢查之后(報(bào)文一致性檢查包括: 報(bào)文版本、報(bào)文長(zhǎng)度和checksum)。

      NF_IP_LOCAL_IN: 位于報(bào)文經(jīng)過(guò)路由之后,并且目的是本機(jī)的。

      NF_IP_FORWARD:位于在報(bào)文路由之后,目的地非本機(jī)的。

      NF_IP_LOCAL_OUT: 由本機(jī)發(fā)出去的報(bào)文,并且在路由之前。

      NF_IP_POST_ROUTING: 所有即將離開(kāi)本機(jī)的報(bào)文。

      Linux 內(nèi)核模塊可以注冊(cè)到任何的hook,注冊(cè)的回調(diào)函數(shù)也必須指定優(yōu)先級(jí)。當(dāng)一個(gè)報(bào)文通過(guò)hook的時(shí)候,hook將會(huì)依據(jù)優(yōu)先級(jí)調(diào)用回調(diào)函數(shù)。注冊(cè)的回調(diào)函數(shù),可以有五種返回,每種返回代表對(duì)報(bào)文不同的操作:

      NF_ACCEPT: 繼續(xù)正常處理此報(bào)文,即允許報(bào)文通過(guò)。

      NF_DROP: 丟棄此報(bào)文,不再進(jìn)行繼續(xù)處理,即拒絕此報(bào)文。

      NF_STOLEN: 取走這個(gè)報(bào)文,不再繼續(xù)處理。

      NF_QUEUE: 報(bào)文進(jìn)行重新排隊(duì),可以將報(bào)文發(fā)到用戶(hù)空間的程序,進(jìn)行修改或者決定是拒絕或者允許。

      NF_REPEAT: 報(bào)文重新調(diào)用hook。

      1.2 Iptables內(nèi)核空間

      Iptables 是基于Netfilter框架實(shí)現(xiàn)的報(bào)文選擇系統(tǒng)[4],其可以用于報(bào)文的過(guò)濾、網(wǎng)絡(luò)地址轉(zhuǎn)換和報(bào)文修改等功能。Iptables 本質(zhì)上是包含了5個(gè)規(guī)則表,而規(guī)則表則包含了一些列的報(bào)文的匹配規(guī)則以及操作目標(biāo)。以下對(duì)每個(gè)規(guī)則表進(jìn)行了簡(jiǎn)單說(shuō)明:

      Filter Table: 是一個(gè)默認(rèn)的規(guī)則表,用于報(bào)文的過(guò)濾,注冊(cè)了三個(gè)鏈: INPUT、FORWARD和OUTPUT。

      NAT Table: 主要用于NAT轉(zhuǎn)換,注冊(cè)了四個(gè)鏈:PREROUTING、INPUT、OUTPUT和POSTROUTING。

      Mangle Table: 主要用于報(bào)文的修改,一共注冊(cè)了五個(gè)鏈: PREROUTING、OUTPUT、INPUT、FORWARD和POSTROUTING。

      Raw Table: 可以對(duì)報(bào)文不進(jìn)行鏈路跟蹤,其優(yōu)先級(jí)在hook中注冊(cè)很高,注冊(cè)了兩個(gè)鏈: PREROUTING和OUTPUT。

      Security Table: 用于強(qiáng)制網(wǎng)絡(luò)接入控制,注冊(cè)了三個(gè)鏈:INPUT、OUTPUT 和 FORWARD。

      1.3 Iptables命令行工具(用戶(hù)空間)

      Iptables命令行工具是工作在用戶(hù)空間的操作工具,用于修改內(nèi)核空間的規(guī)則表[5]。

      2 SNI(服務(wù)器名稱(chēng)指示)

      SNI 是 TLS 協(xié)議(以前稱(chēng)為 SSL 協(xié)議)的擴(kuò)展[6],該協(xié)議在 HTTPS 中使用,它的出現(xiàn)是為了解決多個(gè)服務(wù)器域名對(duì)應(yīng)同一個(gè)IP而產(chǎn)生客戶(hù)端不知道鏈接哪個(gè)服務(wù)端的問(wèn)題。它包含在 TLS/SSL 握手流程中,以確保客戶(hù)端設(shè)備能夠看到他們嘗試訪問(wèn)的網(wǎng)站的正確 SSL 證書(shū)。該擴(kuò)展使得可以在 TLS 握手期間指定網(wǎng)站的主機(jī)名或域名 ,而不是在握手之后打開(kāi) HTTP 連接時(shí)指定。

      3 SNI防火墻實(shí)現(xiàn)

      基于Netfilter框架很好的擴(kuò)展性,用戶(hù)可以開(kāi)發(fā)編寫(xiě)自定義的Linux內(nèi)核模塊并在Netfilter上注冊(cè)為回調(diào)函數(shù)來(lái)實(shí)現(xiàn)自定義的防火墻功能。

      3.1? 匹配模塊的實(shí)現(xiàn)

      每一條iptables配置的規(guī)則中都包含了匹配條件(match)和動(dòng)作(target),要定義一個(gè)新的匹配條件就要實(shí)現(xiàn)一個(gè)匹配條件模塊[7]。匹配模塊的職責(zé)是檢測(cè)每一個(gè)數(shù)據(jù)包確定是否滿足匹配條件。首先要定義一個(gè)xt_match結(jié)構(gòu)體類(lèi)型的變量,模塊初始化的時(shí)候調(diào)用xt_register_match函數(shù)將其注冊(cè)到netfilter框架中,xt_match結(jié)構(gòu)體的定義如下:

      struct xt_match {

      const char name[XT_EXTENSION_MAXNAMELEN];

      unsigned short family;

      bool (*match) (const struct sk_buff *sbk, struct xt_action_param *);

      int (*checkentry) (const struct xt_mtchk_param *);

      void (*destroy) (const struct xt_mtdtor_param *);

      }

      3.1.1 自定義結(jié)構(gòu)體

      我們?cè)趇ptables命令中支持的匹配條件包括域名精確匹配、域名模糊匹配和域名集匹配。域名集的匹配借鑒了ipsets[8]。為了支持這些功能自定義了一個(gè)結(jié)構(gòu)體xt_tls_info和host_set

      struct xt_tls_info {

      char host_or_set_name[MAX_HOSTNAME_LEN + 1]; //匹配條件中的單個(gè)域名和域名集

      __s32 hostset_index; //域名集存儲(chǔ)在域名表中的位置

      }

      3.1.2 域名集數(shù)據(jù)的存入與查詢(xún)

      域名集中的數(shù)據(jù)集合的存入使用Linux系統(tǒng)中的proc文件系統(tǒng),每一個(gè)域名集對(duì)應(yīng)proc文件系統(tǒng)中的一個(gè)目錄。

      host_set hs;

      hs->proc_file = proc_create_data(name, 0644, proc_fs_hostset_dir, &proc_fops, hs);

      在做查詢(xún)的時(shí)候我們使用紅黑樹(shù)來(lái)做高性能查詢(xún)。

      3.1.3 tls_mt_init函數(shù)

      原型為:static int __init tls_mt_init (void)

      主要完成xt_register_matches函數(shù)將xt_match類(lèi)型的變量tls_mt_regs[]注冊(cè)到netfilter框架中及host_set表的初始化:

      static struct host_set *host_set_table;

      host_set_table = kmalloc(sizeof (struct host_set) * max_host_sets, GFP_KERNEL);

      3.1.4 tls_mt_check函數(shù)

      原型為:static int tls_mt_check (const struct xt_mtchk_param *par)

      首先得到iptable命令中的匹配信息,對(duì)應(yīng)到代碼中的xt_tls_info類(lèi)型的變量match_info,判斷規(guī)則中的匹配信息是不是域名集,如果是則把該域名集信息存入到host_set_table中。存入到表中的索引位置也要放入match_info變量的hostset_index中。

      3.1.5 tls_mt函數(shù)

      原型為:static bool tls_mt(const struct sk_buff *skb, struct xt_action_param *par)

      首先我們會(huì)根據(jù)HTTPS協(xié)議的格式從skb->data中解析出SNI中的域名,然后從par->mathchinfo中取出我們?cè)趇ptables中創(chuàng)建的匹配信息,從而進(jìn)行規(guī)則匹配。根據(jù)標(biāo)準(zhǔn)以太網(wǎng)數(shù)據(jù)格式RFC6066[],SNI字段的位置和多個(gè)字段有關(guān)。具體處理流程為:

      在整個(gè)TCP報(bào)文中截取TCP報(bào)文頭之后的有效TLS協(xié)議負(fù)載報(bào)文數(shù)據(jù)data

      檢測(cè)data數(shù)組的第一個(gè)元素Content Type判斷是否為0x16(Handshake)

      檢測(cè)data數(shù)組的第六個(gè)元素Handshake協(xié)議判斷是否為0x01(Client Hello)

      依次檢測(cè)Session ID長(zhǎng)度、ciphers長(zhǎng)度、compression types長(zhǎng)度是否小于報(bào)文頭長(zhǎng)度

      檢測(cè)通過(guò)后得到所有擴(kuò)展數(shù)據(jù)項(xiàng),依次遍歷這些擴(kuò)展數(shù)據(jù)得到SNI的數(shù)據(jù)

      得到域名的信息之后我們?cè)倥c規(guī)則中的域名或者域名集信息進(jìn)行匹配。若是域名信息則直接使用glob_match函數(shù)進(jìn)行精確或者模糊匹配。若是域名集信息則根據(jù)match_info的索引信息精確定位到host_set_table表中的位置再進(jìn)行匹配。

      3.1.6 tls_mt_destroy函數(shù)

      原型為:static void tls_mt_destroy(const struct xt_mtdtor_param *par)

      在iptables命令中刪除規(guī)則時(shí)根據(jù)par中的match_info信息刪除相應(yīng)的域名或者域名集信息。

      3.2 用戶(hù)態(tài)功能實(shí)現(xiàn)

      首先定義一個(gè)xtables_match類(lèi)型的變量:

      static struct xtables_match tls_match = {

      .name = "tls",? ? // 擴(kuò)展名稱(chēng)與匹配模塊中的名稱(chēng)一致

      .size = XT_ALIGN(sizeof(struct xt_tls_info)),

      .userspacesize = XT_ALIGN(sizeof(struct xt_tls_info)),

      .help = tls_help,? // 輸入iptables -m tls -h調(diào)用

      .save = tls_save,

      .x6_parse = tls_parse, // 解析命令行參數(shù)

      };

      使用iptables的示例如下:

      1)阻止去往facebook的流量:

      sudo iptables -A OUTPUT -p tcp --dport 443 -m tls --tls-host "www.facebook.com" -j DROP

      2)模糊匹配:

      sudo iptables -A OUTPUT -p tcp --dport 443 -m tls --tls-host "*.googlevideo.com" -j DROP

      3)域名集匹配:

      sudo iptables -A OUTPUT -p tcp --dport 443 -m tls --tls-hostset blacklist -j DROP

      域名集中添加域名:

      sudo echo +facebook.com > /proc/net/xt_tls/hostset/blacklist

      sudo echo +googlevideo.com > /proc/net/xt_tls/hostset/blacklist

      域名集中刪減域名:

      sudo echo -facebook.com > /proc/net/xt_tls/hostset/blacklist

      4 結(jié)論

      針對(duì)一個(gè)IP經(jīng)常會(huì)對(duì)應(yīng)多個(gè)域名在使用Linux系統(tǒng)自帶的防火前進(jìn)行IP阻斷會(huì)發(fā)生誤阻斷的問(wèn)題,基于Netfilter/Iptables框架開(kāi)發(fā)了一個(gè)Linux內(nèi)核模塊進(jìn)行基于域名或者域名集的阻斷,具體原理是使用HTTPS協(xié)議中的SNI標(biāo)示。實(shí)驗(yàn)表明,在配置了基于域名的相關(guān)規(guī)則后對(duì)應(yīng)的流量被正常阻斷,而且規(guī)則支持精準(zhǔn)匹配和模糊匹配。

      參考文獻(xiàn):

      [1] 賴(lài)雋文,張煥杰,楊壽保.大規(guī)模WWW虛擬主機(jī)設(shè)計(jì)[J].小型微型計(jì)算機(jī)系統(tǒng),2001,22(3):373-375.

      [2] 姚曉宇,趙晨.Linux內(nèi)核防火墻Netfilter實(shí)現(xiàn)與應(yīng)用研究[J].計(jì)算機(jī)工程,2003,29(8):112-113,163.

      [3] 王一平,韋衛(wèi).網(wǎng)絡(luò)安全框架Netfilter在Linux中的實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2006,27(3):439-442,468.

      [4] (美)Robert Love.Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)[M].2版.陳莉君,康華,張波.北京:機(jī)械工業(yè)出版社,2006.

      [5] Daniel P.Bovet,Marco Cesati.深入理解LINUX內(nèi)核[M].陳莉君,張瓊聲,張宏偉,譯.北京:中國(guó)電力出版社,2007.

      [6] 毛偉杰,李永忠.基于SNI的加密流量檢測(cè)在蜜罐中的研究與應(yīng)用[J].信息技術(shù),2021,45(8):97-101.

      [7] 毛新宇.Linux內(nèi)核防火墻netfilter的原理和應(yīng)用[J].微型機(jī)與應(yīng)用,2004,23(4):35-37.

      [8] 岳新.Linux2.4內(nèi)核下基于Netfilter框架可擴(kuò)展性研究與實(shí)現(xiàn)[D].哈爾濱:哈爾濱理工大學(xué),2005.

      【通聯(lián)編輯:光文玲】

      猜你喜歡
      網(wǎng)絡(luò)安全
      網(wǎng)絡(luò)安全知多少?
      新形勢(shì)下的特種設(shè)備網(wǎng)絡(luò)安全防護(hù)探討
      新量子通信線路保障網(wǎng)絡(luò)安全
      網(wǎng)絡(luò)安全
      網(wǎng)絡(luò)安全人才培養(yǎng)應(yīng)“實(shí)戰(zhàn)化”
      上網(wǎng)時(shí)如何注意網(wǎng)絡(luò)安全?
      網(wǎng)絡(luò)安全與執(zhí)法專(zhuān)業(yè)人才培養(yǎng)探索與思考
      設(shè)立網(wǎng)絡(luò)安全專(zhuān)項(xiàng)基金 促進(jìn)人才培養(yǎng)
      網(wǎng)絡(luò)安全監(jiān)測(cè)數(shù)據(jù)分析——2015年12月
      網(wǎng)絡(luò)安全監(jiān)測(cè)數(shù)據(jù)分析——2015年11月
      延津县| 台湾省| 江华| 长阳| 芜湖县| 遵义县| 镇江市| 宁晋县| 青阳县| 朝阳区| 敦化市| 彰武县| 烟台市| 宜宾县| 塘沽区| 榆社县| 娄烦县| 宜兴市| 磴口县| 峡江县| 肇东市| 阜城县| 太原市| 广汉市| 阿拉善盟| 五莲县| 岚皋县| 上栗县| 松滋市| 汶川县| 高淳县| 行唐县| 界首市| 澎湖县| 崇文区| 芜湖市| 始兴县| 德清县| 巢湖市| 开化县| 五莲县|