自家用 Transparent Mode Firewall

今次都係教啲窮人生存技能,大家如果用想抖個Transparent Mode嘅Firewall,又或者想guard住一台hypervisor裡面的VM仔,可以睇睇,可能救你一命。但都係個句,有錢人請過主,直接買部Cisco ASA就了事,七千蚊到十幾萬都有交易。至於其它牌子,我唔咁推介,怕大家衰咗搵我算賬 :) 咁用我個 firewall 有咩好處呀?型咯!我用 openvswitch 做嘅,問你驚未!

Mode呀?

相信無咩人唔知咩嘢係routed mode (Layer 3)同transparent mode (Layer 2)架啦,真唔知就大春袋啦,千奇唔好比你老闆知道你唔識!唉,睇睇呢度講解啦。實際嚟講你唔多機會會用到 Transparent Mode,好多時用佢都係扮高級。因為以前未有咁嘅技術,係新嘢。不過我地如果理解一個 Transparent Mode 嘅 Firewall 為一個 switch,佢可以做倒 mac address 同 IP address 過濾一個 port 流入嘅packet,咁大家會比較容易接受啲,實際呢個 mode 亦是如此的東西。呢種 port 上做 filter 嘅功能,大部分中檔以上嘅 switch都提供,咩model得?唔喺度幫人賣告白啦(tips,兩皮嘢以上一定得)。

至於routed mode 係好傳統 firewall 嘅使用手法,效率亦係最高嘅,原因好簡單,佢真正做filter嘅一刻需要做過濾檢查嘅packet數量係大大降低。因為要過Layer 3,大量無聊 packet已經唔會參與。相反,Layer 2 層面要照顧所有有聊、無聊、裸聊等嘅 packet,一個不漏,漏咗就唔 Transparent 啦!CPU會體現倒你有壓力我有壓力。如果喺部VM(虛擬機)上面行走,仲要記得開埋network adapter 嘅 Promiscuous Mode,忘記了係咁先,等住炒粉。

 

架構

安裝

(requirement)預設條件好簡單 Linux 乙台,RHEL 6.0 以上(RHL 7 好啲),debian 7.0 或以上(ubuntu 12.04 LTS或以上好啲)。安裝以下 packages:

RHEL: perl, perl-JSON

debian: perl, libswitch-perl, libjson-perl, openvswitch-switch

注意 RHEL 自己 compile openvswitch,無 openvswitch,自己 compile 或 download

Download 我個靚 script vdom.zip,喺  /usr/local/bin 解放。然後 chmod u+x /usr/local/bin/vdom

搭建一個 VDOM (virtual domain)

先選擇好兩個 network adapter作為 untrusted 同 trusted port,如果 trusted port 係你用嚟 access 個 O/S,咁就要小心,配置中途會斷線,因為個 IP 要刪除,再加喺個 bridge interface 度。跟住諗個靚 VDOM 名,夠啦,開始:

vdom create myvdom1 eth1 eth2 

第一個一定係 untrusted port!

大家注意啦,如果你無一個獨立嘅 management network,要靠 firewall 個做 management(即係有個 IP去access 部 Linux 囖),千奇唔好用 physical NIC,根據正規操作系統(不論 Windows 定 Unix)接橋理論,係唔可以喺 port 上面配置 IP Address 嘅,即一隻 Cisco 或 Dell 嘅 Switch,個 port 喺 Layer 2 嘅設定下係唔可以有 IP 嘅,所以你會見到有 vlan interface,上面有 IP。O/S一樣,有啲類似 CloudLinux CentOS 等會比你做 bridge 又比你喺 NIC 上面配置 IP,點解釋呀?一句,唔正規囖,你千奇唔好學呀,學壞手勢!正確嘅做法係將個 IP 配置喺嘅 bridge 度,你當個 birdge 係一個 virtual 個 interface 咁做就得架啦。要 boot 機啟動有效,唔可以用標準嘅 network configuration file 做,因為ifdown嘅時候會 delete 嗮所有 ovs 有關呢個 bridge 嘅 setting。所以你乾脆喺 /etc/rc.local 上面做算啦。嗱!可以咁:

/usr/local/bin/vdom load myvdom1
ip addr add 192.168.1.2/24 dev myvdom1
ip route add default via 192.168.1.1 

 

Filter

filter 輸入 syntax 係咁。刪除都差不多,rule del 無 -j {action}而已。當中 -i {nic} 默認係 untrusted port(唔係所有!),永遠係 bridge 嘅第一個 port。-I {priority} 優先級好有用,rule分先後嘅,呢個數值越大,越先執行,記住啦!-j 可以 accept 可以 drop。{protocol} 有效值為 ip, icmp, arp, rarp, tcp, udp。其中 rarp 好重要,好多三流牌子 firewall 都唔識處理,搞到 redundant IP 死嗮,例如你個 firewall 前面有個 vrrp 容錯 router,後面有個用 heartbeat 做嘅 redundant mail server,保證你死無全尸。 -m/-n 係針對 mac address 嘅 filter,喺 hypervisor bridge 上面好有用。{src_addr}/{src_port}/{dst_addr}/{dst_port} 好簡單,只說明,用的 -S, -D 一定要指定 protocol (udp 或 tcp,其它無得傾)。最後講講 -R,佢可以幫你喺 {auto_remove} 秒之後 delete 翻條 rule。呢個功能要藉助 minischeduler.pm 模塊,好嘢嚟架!最簡單幫你排queue 定時執行嘅方法。原perl代碼做好簡單嘅配合就OK。
vdom rule add {vdom_name} -j {action} [-I {priority}]
    [-i {nic}]
    [-p {protocol}] [-m {src_mac}] [-n {dst_mac}]
    [-s {src_addr}] [-S {src_port}] [-d {dst_addr}] [-D {dst_port}]
    [-R {auto_remove}]

過濾(filter)默認設定係 allow all,你可以用一個 prirority >= 101 嘅 rule 去 drop 嗮所有 traffic,然後慢慢加翻啲你想 allow 嘅嘢。不過加嘅時候要注意,transparent mode 形式嘅 firewall 好多時都係 stateless (asymmetric嘅),佢唔會有 conntrack 嘅概念。即係每一個 packet 獨立判斷,過唔倒就係過唔倒。如一般 routed mode firewall 會記得你成功 outbound 嘅 connection,當對方(Internet上)回應同一個 connection 嘅 packet 可以默認自動接收(即所謂 iptables 上 -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 嘅效果)。喺 transparent node 無呢枝歌仔唱,要獨立考慮。所以話點解 transparent mode 唔好用就係咁解。一般情況建議大家用 transparent mode firewall 都係以 drop packet 為主,不在 filter 之列一般都 allow,最底部會做如此的 rule,防止非本地 network 作為目的地個 packet 流入:

vdom rule add myvdom1 -I 50000 -p arp -j accept
vdom rule add myvdom1 -I 50000 -p rarp -j accept
vdom rule add myvdom1 -I 500 -d 192.168.1.0/24 -j accept
vdom rule add myvdom1 -I 500 -d 192.168.2.0/24 -j accept

vdom rule add myvdom1 -I 101 -j drop 以上無定義 -i {NIC} ,代表過濾 untrusted port 流入嘅 packet。注意版本2.0是不支持流出過濾條件,好快會有啦(心急自己加啦)。

 

作為 Firewall 使用

好啦,入翻正題。呢個 solution 如果作為 transparent mode 嘅 Firewall 使用,硬件配置就好簡單,兩個 port,一個 untrusted 連接到出Internet嘅router(注意,呢個VLAN上無第三個設備,如果全部係硬嘢就一條cable,cross connect 個 untrusted port 同部 router),另一個 trusted 連接到內部網絡個VLAN,咁所有受保護嘅機就喺嗮呢個VLAN上面。即係要逼所有流入流出嘅packet都經過部 firewall。

 

 

作為 VM Bridging 使用

實際上道理差不多, untrusted port 連接到 hypervsior 出街個 NIC 上,咁啲VM嘅 network 就 join 嗮個 bridge 度,我嘅功能係方便你加減 filter 去個別 VM 嘅 port,一般情況你只係希望部VM configure 咗嘅 IP同埋一定係VM NIC個 mac address作為源頭個 packet先會比佢流入個 bridge(最後當然流出街啦)。而流入一般唔多理會,如果要 filter,一定要比 arp、rarp通過,最少要讓 gateway 嘅 mac address 自由通過,否則部VM係做唔到連接嘅。呢個係防止 spoofing 嘅基本做法。

vdom rule add guestvlan11 -i veth15 -m 80:86:01:05:01:01 -s 201.5.5.1 -j accept
vdom rule add guestvlan11 -i veth15 -I 101 -j drop
注意呢度無放 multicast,有客有需要可以個別放,安全啲,省麻煩可以用: 
vdom -i any -I 50000 -n 01:00:00:00:00:00/01:00:00:00:00:00 -j accept

有時候有啲 VM 客瀨咗嘢,係咁爆 DoS 出街,你又要 UP 住個VM 嘅 network 比個客 check,咁有我就方便啦,例如部 VM sync-flood 人地嘅 tcp port 80,可以 block 咗 tcp/80 24 小時:

vdom rule add guestvlan11 -i veth15 -p tcp -D 80 -j drop -R 86400

後面 -R 會喺 86400 秒後自動 delete 翻條 rule,係唔係好方便呢。

 

Open vSwitch Kernel定位

最後要知道 openvswitch 係建立喺好 kernel driver 嘅位置,同 Linux bridge 唔同,ebtables 同 iptables 對佢都係無效,因為 packet 根本唔會送到上呢一層就已經filter咗,所以效能高啲。尤其是應付 VM network 最好,因為可以跳過好多層硬件模擬,CPU做少好多。Filter 嘅事情越多,效果越明顯。

當然要注意一點,就係 iptables、ebtables 中嘅 FORWARD 係會無效,hypervisor 唔可以用 FORWARD table 嚟把關出入真實網絡。實際啲講係唔需要安裝 ebtables,佢嘅功能就係上面 filter 做嘅事。openvswitch 本身已經有啦。而 iptables 嘅 FORWARD、INPUT、OUTPUT 對VDOM interface而言係有效嘅,如你由個 VDOM route 出另一個 VDOM 或 NIC,係OK嘅,只係VDOM內嘅port無效。假如你部 hypervisor 上嘅 VM 真係要咁樣做 NAT 或route 出街,咁個 untrusted port 會變成局網通信工具(兩部 hypvervisor 上嘅 VM喺同一個subnet上個通信,即靠個 untrusted port 連接真正嘅switch接橋)。咁嘅情況等價於你啲 packet過倒 VM 個虛擬網卡個 input filter rule就成功流入 LOCAL,即歸你個 iptables 管啦。OpenStack 嘅做法類似,通過本地 iptables 翻譯 (NAT) 一個公共 IP先出街。其實小弟好唔 buy 呢種設計,hypervisor 本身太臃腫啦。我總覺得盡快用最簡單同必要嘅處理將 packet 送到 gateway 先係皇道。