歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux橋設備以及iptables的效率的一些問題

Linux橋設備以及iptables的效率的一些問題

日期:2017/2/28 15:55:23   编辑:Linux教程

一.組播和網橋

1.一般的IP服務都是和底層的網卡設備沒有關系的,完全由路由來決定,但是組播除外,因為組播需要將一個網卡顯式的加入到一個組播組當中,一邊該接口可以接收組播包,因此IP層和鏈路層就聯系了起來。

2.使能橋接的系統上,由broute來判斷數據包將此設備當成一個橋設備還是一個路由器設備,如果當成路由器設備,那麼橋的概念對於此數據包將徹底消失,如果當成橋設備,那麼即使本地接收的情況下,IP層看到的接收也是一個橋設備而不是實際接收數據包的物理網卡設備。

3.因此很容易由於第1點和第2點引發一系列的問題,比如將一個橋接口加入組播,數據包卻被broute drop掉了,實際的物理網卡和橋接網卡不符,組播不被接收,因此需要在broute的規則中將組播地址放過,或者干脆在Bridge的PREROUTING這個HOOK進行過濾。但是如果你只是想在某個實際的物理接口截獲數據包,那麼還是使用broute規則比較好,然後特意放過組播包,因為這些被截獲的包根本就不應該進入橋接系統,一旦進入了橋接系統,就會影響IP層的Netfilter判斷,起碼你不能再用-i了,而要改為使用physdev模塊的physdev-in這個match了。

二.iptables過濾規則的效率

iptables的規則匹配是按順序匹配的,這就會造成隨著規則數量的增加,效率會下降的問題,如何解決呢?那就是將數據包進行分類,使得大多數的不可能匹配的數據包不用去一一匹配每一條規則。www.linuxidc.com基本上這種想法有兩套方案:

1.使用單獨的自定義鏈來分類數據包。這是手動分類數據包的做法,需要配置者對本網絡的流量類型很熟悉才能定義出美妙的規則鏈。比如說你想開放幾個不連續的地址訪問80端口,使用ipset有點大材小用了,但是你也不必寫下如下的規則:

iptables -A FORWARD -s ip1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s ip2 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s ip3 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s ip4 -p tcp --dport 80 -j ACCEPT

如果你這麼寫了,那麼每一個數據包都要匹配所有的規則,你要這麼寫:

iptables -N SB_FORWARD
iptables -A SB_FORWARD -s ip1 -j ACCEPT
iptables -A SB_FORWARD -s ip2 -j ACCEPT
iptables -A SB_FORWARD -s ip3 -j ACCEPT
iptables -A SB_FORWARD -s ip4 -j ACCEPT
iptables -A FORWARD -p tcp --dport 80 -j SB_FORWARD

如此一來,大多數數據包僅僅需要匹配一個規則即可,那就是最後的那條規則,一旦不匹配就不需要繼續了。這實際上是將共同的東西抽象了出來,將線形的規則進行了分類。Netfilter提供了自定義鏈的機制來使用戶可以將一維鏈表存儲的規則放到多維鏈表中。

2.使用hipac讓內核自己分類數據包。這是使用一個Netfilter新的包分類機制完成的,它自動進行包分類,使用多維的樹來維護規則而不是使用一維鏈表,在匹配方式上不是用規則來匹配數據包,而是用基於多維樹分類的數據包來匹配存於多維樹的規則,在存在大量離散規則的情況下,效果顯著。

Copyright © Linux教程網 All Rights Reserved