[摘 要] Iptables 是一種基于Linux 2.4.1以上內核的網絡包過濾管理工具,其核心是netfilter(Linux核心中一個通用架構)技術。本文探討了netfilter 技術的基本原理及在電力MIS系統(tǒng)中如何運用iptables 技術實現子系統(tǒng)網絡信息安全。
[關鍵詞] 電力信息網 數據包 防火墻
1 概述
電力行業(yè)一直致力于通過電子信息化建設改造傳統(tǒng)生產經營管理模式,如今,電力信息網絡已不僅是單一的局域網絡,已建設成為包括財務管理網、人事管理網、用電營銷網、調度自動化網等的大型企業(yè)管理信息平臺。各子網絡系統(tǒng)運行相對獨立,有著相對敏感的信息,但與MIS主網又有必要的信息交互。如何保護子系統(tǒng)的信息安全,保障網絡系統(tǒng)安全高效地運行,是企業(yè)信息工作的首要任務。
通常的解決辦法是在子系統(tǒng)網絡與MIS主網接口處加裝專業(yè)防火墻,但對于電力MIS系統(tǒng)與其眾多的子系統(tǒng)來說,是高效但并不經濟的方法。我們這里介紹一種基于RedHat Linux 7.2的iptables包過濾型防火墻系統(tǒng),用來隔離MIS網絡和子系統(tǒng)網絡,保護子系統(tǒng)信息安全。
2 原理
iptables是一個管理內核包過濾的工具,利用它可以追加、插入或刪除包過濾規(guī)則。實際上真正來執(zhí)行這些過慮規(guī)則的是netfilter及其相關模塊(如iptables模塊和nat模塊)。netfilter是Linux 核心中一個通用架構,它提供了一系列的"表"(tables),每個表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數條規(guī)則(rule)組成。我們可以這樣來理解,netfilter是表的容器,表是鏈的容器,而鏈又是規(guī)則的容器(如圖一所示)。

系統(tǒng)缺省的表為"filter",該表中包含了INPUT、FORWARD和OUTPUT 3個鏈。每一條鏈中可以有一條或數條規(guī)則,每一條規(guī)則都是這樣定義的“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。當一個數據包到達一個鏈時,系統(tǒng)就會從第一條規(guī)則開始檢查,看是否符合該規(guī)則所定義的條件: 如果滿足,系統(tǒng)將根據該條規(guī)則所定義的方法處理該數據包; 如果不滿足則繼續(xù)檢查下一條規(guī)則。最后,如果該數據包不符合該鏈中任一條規(guī)則的話,系統(tǒng)就會根據該鏈預先定義的策略來處理該數據包。

數據包在filter表中的流程如圖二所示。當有數據包進入系統(tǒng)時,系統(tǒng)首先根據路由表決定將數據包發(fā)給哪一條鏈,則可能有三種情況:
1.如果數據包的目的地址是本機,則系統(tǒng)將數據包送往INPUT鏈,如果通過規(guī)則檢查,則該包被發(fā)給相應的本地進程處理; 如果沒通過規(guī)則檢查,系統(tǒng)就會將這個包丟掉;
2.如果數據包的目的地址不是本機,也就是說,這個包將被轉發(fā),則系統(tǒng)將數據包送往FORWARD鏈,如果通過規(guī)則檢查,則該包被發(fā)給相應的本地進程處理; 如果沒通過規(guī)則檢查,系統(tǒng)就會將這個包丟掉;
3.如果數據包是由本地系統(tǒng)進程產生的,則系統(tǒng)將其送往OUTPUT鏈,如果通過規(guī)則檢查,則該包被發(fā)給相應的本地進程處理; 如果沒通過規(guī)則檢查,系統(tǒng)就會將這個包丟掉。
我們的包過濾型防火墻使用了FORWARD鏈。
3 實現方法
3.1系統(tǒng)需求
一臺安裝雙網卡的機器(根據網絡流量具體決定配置),操作系統(tǒng)選擇RedHat Linux 7.2或以上(可從www.redhat.com上獲得ISO光盤映像)。
3.2安裝方法
將PC機的一塊網卡(eth0)接192.168.1.0/24網段,另一塊網卡(eth1)接192.168.2.0/24網段(見圖三)。安裝RedHat Linux 7.2時,安全級別需選擇中級或高級。安裝完成后,還需重新編譯內核以支持netfilter (若安裝的是RedHat Linux 8.0,安裝時安全級別選擇了中級或高級,則不需要重新編譯內核)。在編譯新內核時,要求選擇和netfilter相關的項目。這些項目通常都是位于“Networking options”子項下。我們應該修改的項有: (表示載入Linux 內核)
[y] Packet socket
[y] Kernel/User netlink socket
[y] Netlink device emulation
[y] Socket Filtering
[y] Network packet filtering (replaces ipchains)
[y] ip:multicasting
[y] ip:advanced router
然后,在“IP: Netfilter Configuration ---->”子項中選中:
[y] Connection tracking (required for masq/NAT)
[y] FTP protocol support
[y] IRC protocol support
[y] IP tables support (required for filtering/masq/NAT)
[y] limit match support
[y] MAC address match support
[y] Netfilter MARK match support
[y] Multiple port match support
[y] TOS match support
[y] Connection state match support
[y] Packet filtering
[y] REJECT target support
[y] Full NAT
[y] MASQUERADE target support
[y] REDIRECT target support
[y] Packet mangling
[y] TOS target support
[y] MARK target support
[y] LOG target support
(如何編譯及應用內核請參考Linux相關文檔)
3.3 生成防火墻腳本
在建立腳本前要根據具體的網絡安全及業(yè)務需要制定相應的規(guī)則。我們這里的規(guī)則是: 允許子網用戶訪問MIS網的WEB服務器,允許MIS主網上的192.168.2.2主機訪問子網上192.168.1.10主機的1433端口(Microsoft SQL Server服務),禁止除此之外的所有行為。
建立名為firewall.sh防火墻腳本,內容如下(括號內的為注釋):
echo 1 > /proc/sys/net/ipv4/ip_forward (打開IP包轉發(fā)功能)
/sbin/iptables -F INPUT (清空輸入鏈)
/sbin/iptables -F FORWARD (清空轉發(fā)鏈)
/sbin/iptables -P FORWARD DROP (改變FORWARD的缺省規(guī)則為丟棄)
/sbin/iptables -I FORWARD 杝 192.168.1.0/24 杁 192.168.2.0/24 杍 DROP (丟棄來自于子網的IP包)
/sbin/iptables -I FORWARD 杝 192.168.2.0/24 杁 192.168.1.0/24 杍 DROP (丟棄來自于主網的IP包)
/sbin/iptables -I FORWARD -p tcp 杝 192.168.1.0/24 杁 192.168.2.0/24 梥yn 梔estination-port 80 -j ACCEPT (允許子網訪問外網的WEB服務器)
/sbin/iptables -I FORWARD -p tcp 杝 192.168.2.2 杁 192.168.1.10 梥yn 梔estination-port 1433 -j ACCEPT (允許192.168.2.2訪問子網主機192.168.1.10的Microsoft SQL Server數據庫)
也可禁止一個網中的惡意用戶(ip為x.x.x.x,mac為a:b:c:d:e:f)訪問另一個網。
/sbin/iptables -I FORWARD 杝 x.x.x.x -m mac 梞ac-source a:b:c:d:e:f -j DROP
(最后插入的規(guī)則為FORWARD鏈中第一條規(guī)則)
將firewall.sh的屬性改為可執(zhí)行,并在/etc/rc.local中加入 firewall.sh,使其開機就能執(zhí)行。這樣一個按我們要求定制的包過濾型防火墻就建好了,它即保護了子網信息安全,又允許受限的信息交流。
4 結束語
iptables是一個功能十分強大的工具,利用它可以實現防火墻,也可以用作路由器、透明代理等,我們甚至利用它做了一個小區(qū)寬帶網管理系統(tǒng)。有興趣的讀者不妨進一步探討。
Iptables 詳細語法請參閱Linux 2.4 Packet Filtering HOWTO。