環境介紹:兩台Linux系統(一台用于防火牆[兩張網卡,一張連接配接外網,一張連接配接内網],一台XP客戶機測試用
在2.0核心中,網絡防火牆的操作工具名稱是ipfwadm
在2.2核心中,網絡防火牆的操作工具名稱是ipchains(IP規則鍊)
在2.4之後的核心中,網絡防火牆的操作工具名稱是iptables(IP表)
netfilter與iptables
在Linux網絡防火牆的管理與配置中需要明确以下兩個概念
Linux的包過濾防火牆功能是由Linux的核心實作的,而不是由運作在Linux系統中的某個伺服器程式實作的,在Linux的核心中是使用netfilter架構實作防火牆功能的
iptables實質上是Linux系統中為使用者提供的netfilter管理工具,系統管理者可以使用iptables管理工具實作對Linux核心中網絡防火牆的管理工作。管理工作主要包括防火牆政策的設定
iptables中的規則表與規則鍊
規則鍊
iptables的作用在于為netfilter的處理提供相關的規則,iptables預設具有5條規則鍊:PREROUTING(預先路由)、FORWARD(轉發)、POSTROUTING、INPUT、OUTPUT
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503463585hHw.png"></a>
規則表
iptables的 規則鍊組織在3個不同的規則表中:filter、nat、mangle。其中filter針對過濾系統,nat針對位址轉換系統,mangle針對政策路由和特殊應用。規則鍊配置設定如下:
filter:INPUT、FORWARD和OUTPUT
nat:PREROUTING、POSTROUTING、OUTPUT
mangle:PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING
主機的安全性主要集中在filter表中的INPUT、OUTPUT規則鍊中,是以這兩個關鍵字在添加規則的時候會用到。在核心編譯了netfilter系統以後,系統會自動建立這5個規則鍊和3個規則表
iptables的基本配置管理
iptables的軟體包組成
在Linux的網絡防火牆管理中,netfilter功能是由Linux核心實作的,而iptables管理工具需要安裝名為iptables的軟體包,該軟體包在RHEL4系統中是預設安裝的,可以使用rpm指令查詢iptables軟體包的資訊
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503463600yDl.png"></a>
iptables是主要的管理指令,對網絡防火牆功能的管理都是通過iptables指令實作的
iptables-save和iptables-restore是一對輔助的管理工具,iptables-save可以将目前系統中的防火牆設定進行儲存,而iptables-restore指令可以将使用iptables-save指令儲存的防火牆政策配置恢複到目前系統中
iptables服務的啟動與停止
iptables服務啟動腳本
iptables軟體包安裝後,在系統中以iptables服務程式運作, 服務的啟動腳本儲存在/etc/rc.d/init.d/目錄中,腳本檔案名是iptables
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346362qnLZ.png"></a>
iptables服務在系統運作級别3和5預設啟動
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346364PqQK.png"></a>
iptables配置檔案與政策設定檔案
/etc/sysconfig/目錄中iptables-config檔案是iptables服務的配置檔案,用于設定在iptables服務啟動時加載服務相關的核心子產品,管理者通常不需要對iptables-config檔案進行設定
/etc/sysconfig/目錄中的iptables檔案是RHEL4系統中iptables服務使用的防火牆政策設定檔案,在iptables服務啟動時将調用iptables-restore指令将該檔案中的政策設定内容應用到防火牆中
/etc/sysconfig/iptables檔案通常是由iptables-save指令或其它的防火牆配置工具生成的一般也不需要管理者手動進行設定
示:service iptables start/stop/restart/status
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503463674h4I.png"></a>
iptables指令是對Linux中網絡防火牆配置管理的核心指令,具有以下特點:
iptables指令提供了豐富的功能,可以對Linux核心中的netfilter防火牆進行各種政策的設定
iptables指令的設定在系統中即時生效的
使用iptables指令手動進行的防火牆政策設定如果不進行儲存将在下次啟動時丢失
使用iptables-save指令儲存設定
iptables-save指令提供了對Linux系統中配置儲存功能,在使用iptables指令對防火牆進行設定後可以使用iptables-save指令将配置儲存到檔案中
iptables-save指令預設隻将設定資訊顯示到标準輸出(螢幕)中,是以如果需要将iptables-save指令的輸出儲存,需要将指令輸出結果重定向到指定的檔案中
示: iptables-save &gt; ipt.v1.0(此為你儲存的檔案名)
在對防火牆進行調試時,可以使用iptables-save指令将不同的設定儲存為不同的版本,以便對各版本進行對比和排錯
示:iptables-save &gt; ipt.v1.1(此為儲存的檔案名)
使用iptables-restore恢複位置
在對Linux中的防火牆進行測試的過程中,經常需要将不同版本的配置恢複到系統中,這時需要使用iptables-restore指令:
iptables-restore指令将标準輸入或輸入重定向檔案中的設定内容恢複到Linux系統的防火牆中
示:iptables-restore &lt; ipt.v1.0
使用iptables腳本儲存防火牆設定
當管理者已經對Linux防火牆設定完畢,并且需要永久儲存防火牆的設定時,需要使用iptables啟動腳本将設定内容儲存到/etc/sysconfig/iptables檔案中,在進行儲存之前最好先将/etc/sysconfig/iptables檔案原有内容進行備份,以便出現錯誤時進行恢複
示:cp /etc/sysconfig/iptables iptables.bak
在RHEL4系統中,iptables腳本提供了save指令用于将目前的防火牆設定儲存到/etc/sysconfig/iptables檔案中,以便以後系統每次啟動時都讀取新的防火牆設定内容
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346370wu5y.png"></a>
使用防火牆的配置工具
在RHEL4系統中為使用者提供了字元界面中運作的防火牆配置工具,雖然該配置工具的功能有限,但是其操作簡單,對于Linux防火牆配置的初學者來說是很好的輔助工具
在字元界面下輸入system-config-securitylevel-tui指令将運作配置程式,再在界面下選擇Customize按鈕将進入防火牆的設定頁面
示:system-config-securitylevel-tui
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346375mrF9.png"></a>
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346381i9oz.png"></a>
iptables指令的使用
iptables的操作對象
在netfilter/iptables網絡架構中,操作對象由以下幾個級别組成
規則表(table)由規則鍊的集合組成,不同的規則表用于實作不同類型的功能
規則鍊(chain)由規則的集合組成,儲存在規則表中,在規則表中不同的規則鍊代表了不同的資料包流向
規則(rule)是最基本的設定項,用于對防火牆的政策進行設定,流經某個資料鍊的資料将按照先後的順序經過規則的過濾
從以上幾個由大到小的對象可以看出,netfilter/iptables網絡架構是相當複雜并且嚴謹的,使用iptables指令對不同的規則表、規則鍊、規則的設定,可以實作網絡防火牆的各種功能
系統預設的規則表:filter、nat、mangle
檢視防火牆的基本狀态
示:iptables [- t table] –L
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346388DPaq.png"></a>
使用iptables指令進行表配置查詢時,需要使用-L指令選項
iptables –L指令預設顯示filter規則表的内容,如果需要顯示其它的規則表需要使用-t選項指定規則表的名稱
示:iptables -t nat -L
清空表中的規則
示:iptables -F
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346392iCck.png"></a>
删除表中的自定義規則鍊
iptables –X指令用于删除指定的規則鍊,如果不指定規則鍊名稱作為參數,将删除表中所有的自定義規則鍊
示:iptables -X
iptables –X指令通常與iptables –F指令一同使用,用于在重新設定防火牆規則之前對防火牆進行初始化
清除流量統計
示:iptables -Z
添加規則
iptables –A指令用于為指定的規則鍊末尾添加規則,在添加規則的指令中使用-A選項指定需要添加規則的鍊;使用-i選項指定資料包流入的網絡接口,使用-j選項設定對資料包的處理,-j ACCEPT表示允許通過,-j DROP表示丢棄資料包(丢棄并不回報錯誤資訊給用戶端),-j REJECT(拒絕并回報錯誤資訊給用戶端)
示:iptables -A INPUT -i lo -j ACCEPT
在INPUT規則鍊中添加規則,允許來自lo網絡接口中的所有資料包
示:iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
INPUT規則鍊中添加規則,允許eth0網絡接口來自192.168.1.0/24子網的所有資料包
删除規則
iptables –D指令用于删除指定規則鍊中的規則
示:iptables -D INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT
将INPUT規則鍊中最後添加的關于eth0網絡接口的規則删除
設定内置規則鍊的預設政策
iptables 規則表的内建規則鍊具有“預設政策”的屬性,預設值是ACCEPT,即預設政策将接受不符合任何規則的資料包,iptables –P指令可以設定指定規則鍊的預設政策
示:iptables -P INPUT DROP
更改INPUT規則鍊的預設政策為DROP(丢棄)
設定Linux作為網關伺服器
在Linux中實作IP僞裝功能(NAT)主要由iptables指令實作,操作步驟:
設定Linux核心支援IP資料包的轉發
加載實作NAT功能主要的核心子產品
對iptables中的規則表進行初始化
設定規則鍊的預設政策
添加IP僞裝規則
由于設定IP僞裝的操作步驟比較複雜,是以我這裡通過編寫shell腳本為完成(以便修改、調試、和執行),使用腳本進行防火牆的配置也是Linux中防火牆的常用配置方法
我這裡把此腳本命名為:iptables_nat
示:iptables_nat
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346399Jxdw.png"></a>
此腳本最後一行指令實作了IP僞裝的功能
示:iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUERADE
有另一指令與上面的指令所達到的目的是一樣的:
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to +外網口的公網IP位址(如我這裡的202.69.133.134)
以上iptables指令在nat規則表的POSTROUTING規則鍊中添加了規則,規則中-s 172.16.0.0/16表示資料包的源位址為172.16.0.0/16子網;-o eth1表示資料包的流出網絡接口是eth1(一般為外網口),eth1網絡接口具有公網IP;-j MASQUERADE表示對資料包進行的處理,即将符合條件的資料包進行IP僞裝。整個規則的作用是将來自172.16.0.0/16子網并由eth1網絡接口流出的資料進行IP僞裝,将資料包的源位址轉換為eth1網絡接口的公網IP位址
iptables_na腳本建立後需要使用chmod指令設定腳本對使用者具有執行權限(或直接使用bash指令執行)
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346405YVzX.png"></a>
此方法使用./iptables_nat來執行腳本
若直接使用bash指令執行則
示:bash iptables_nat
檢視nat規則表:
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503464079SAA.png"></a>
添加規則允許80端口通過:
示:iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptablles -A OUTPUT -o eth1 -p tcp --dport 80 -j ACCEPT
在客戶機通路:
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346417hbLh.png"></a>
緩存代理squid
Squid 伺服器主要具有如下功能
提供對HTTP和FTP協定的代理服務
緩存代理的内容,提高用戶端通路網站的速度,節約網絡出口流量
對用戶端位址進行通路控制,限制允許通路squid伺服器客戶機
對目标位址進行通路控制,限制用戶端允許通路的網站
根據時間進行通路控制,限定用戶端可以使用代理服務的時間
Squid伺服器的安裝
Squid伺服器在RHEL4系統中已經預設安裝,作用rpm指令可以查詢squid軟體包的安裝狀态,如果需要手動(或重新)安裝squid伺服器,可以在RHEL4的第2張安裝CD光牒中找到該軟體包
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346422aAr3.png"></a>
squid服務程式在RHEL4中預設不自動啟動,如作為伺服器使用,需要用chkconfig指令設定squid服務在運作級别3和5中自動啟動
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346425JDmd.png"></a>
确認主機具有完整的域名
Squid伺服器在初始化或運作時需要所在主機具有完整的域名,否則squid伺服器無法成功啟動。Linux主機的完整域名需要在hosts檔案中或在DNS伺服器中進行解析(若有DNS伺服器則,如主機名為hostSer時,區域名為yunjing.com,則完全合格域名為hostSer.yunjing.com),我這裡沒有DNS伺服器是以通過更改hosts檔案來完成
示:vi /etc/hosts
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346427XEzR.png"></a>
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503464307Cwm.png"></a>
squid伺服器的初始化
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_125034643491sw.png"></a>
第一次使用squid伺服器之前需要先作用squid –z指令對squid伺服器進行初始化
squid伺服器初始化工作的主要作用是在squid伺服器的工作目錄/var/spool/squid/中建立需要的子目錄(從上圖可看出在沒初始化前/var/spool/squid/目錄是為空)
隻有在第一次啟動squid伺服器之前才需要進行伺服器的初始化工作,如果不手動執行squid –z指令,squid服務腳本在第一次啟動服務時也會自動完成相應的初始化工作,再啟動squid服務程式
squid服務的啟動與停止
squid伺服器的啟動腳本位于/etc/init.d目錄中,腳本檔案的名稱是squid,該腳本負責squid伺服器的啟動和停止等任務管理
示:service squid start/stop/restart
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346437Tt3q.png"></a>
squid服務啟動後,使用netstat指令可以看到squid服務程式在3128端口進行代理服務的監聽,這與通常的代理伺服器使用的8080端口是不同的
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346439BlDv.png"></a>
squid服務的配置檔案
squid伺服器在/etc/目錄下有獨立的配置目錄,目錄名稱為squid,該目錄中儲存了squid伺服器相關的配置檔案
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_125034644118hJ.png"></a>
/etc/squid/目錄中的squid.conf是squid伺服器的主配置檔案,squid.conf.default檔案是squid.conf檔案的原始配置副本
服務端口
Squid伺服器的服務端口使用http_port配置項設定,其預設設定值是3128,為了使用者使用友善,可以将服務端口更改為通用的8080,或在多個端口提供服務
示:vi /etc/squid/squid.conf
http_port 3128
//改為
http_port 8080
//或
http_port 3128 8080
http_port配置項支援在多個端口提供代理服務
注:将http_port 3128 前的“#”注釋符去掉使此行生效
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346447qEDM.png"></a>
緩沖記憶體數量
Squid伺服器的性能和squid伺服器使用的緩沖記憶體數量有很大關系,一般來講,使用記憶體越多,squid伺服器的性能會越好,在squid.conf配置檔案中使用cache_mem進行代理伺服器緩沖記憶體的設定,cache_mem預設設定隻有8MB,遠遠不能滿足實際應用中代理伺服器的要求,是以需要将該設定值重新設定。通常來講squid伺服器中cache_mem的值設定為伺服器實體記憶體的三分之一到四分之一比較合适(最好為16的倍數)
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346455PggF.png"></a>
工作目錄
Squid伺服器緩存的内容隻有很少的一部分是儲存在緩沖記憶體中的,而代理服務中使用的所有檔案都會儲存在squid的工作目錄中,在squid.conf配置檔案中使用cache_dir設定squid伺服器的工作目錄路徑和屬性
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346464E8dg.png"></a>
cache_dir設定項的預設值為/var/spool/squid,“100 64 256”分别表示目錄中最大的容量是64MB(這裡與我們前面設定的cache_mem值一樣都是64MB),目錄中的一級子目錄的數量為16個,二級子目錄為256個
squid工作目錄的容量和子目錄的數量也會在一定程式上影響squid伺服器代理服務的性能,在實際應用中可根據實際情況适當擴大工作目錄的總容量
通路控制設定
Squid伺服器中提供了強大的通路控制功能,在squid.conf配置檔案中,通路控制功能是由http_access和acl配置項功能共同實作的
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503464688FAe.png"></a>
http_access用于設定允許或拒絕指定名稱的通路控制清單(ACL)對象通路squid伺服器
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346472rcQB.png"></a>
Acl配置項用于設定通路控制清單的内容,通過acl設定項的設定,管理者可以為特定的目标指定通路控制名稱
例:
将源位址為0.0.0.0/0.0.0.0的對象指令為all
将源位址分為127.0.0.1/255.255.255.255的對象命名為localhost
将目标位址為127.0.0.0/8的對象命名為to_localhost
通過acl和http_access的設定,既可以對使用squid伺服器的客戶機進行控制,也可以對客戶機可以通路的目标位址進行控制
在squid.conf配置檔案中預設隻允許本機(localhost)使用squid伺服器,這種政策也展現了squid伺服器預設設定的嚴謹,為了讓同一區域網路中的所有客戶機能夠通過squid的代理服務通路外部網頁,需要在squid.conf檔案中進行通路控制政策的修改
我這裡目前區域網路的位址是172.16.0.0/16, 在squid.conf配置檔案中需要添加進行如下配置
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346480DGf7.png"></a>
上圖中的clients是我為這張ACL表命的名稱
在squid.conf檔案中的http_access deny all設定行之前添加相關内容
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346487B5kB.png"></a>
以上設定将在squid伺服器的通路控制政策中,在拒絕所有對象之前添加了允許名為clients的通路控制對象進行通路
重新開機squid服務
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346491ShCk.png"></a>
注:每次修改squid.conf檔案之後都必須重新啟動 squid服務程式
配置透明代理伺服器
建構透明代理伺服器需要對squid代理服務和iptables防火牆分别設定,配合使用才能實作透明代理功能
配置squid.conf檔案
Squid伺服器的預設配置中不支援提供透明代理服務的相關功能,是以需要在 squid.conf檔案末尾添加如下行
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346496LH0W.png"></a>
在squid.conf檔案中進行配置修改後,需要執行squid腳本使配置生效
示:service squid reload
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346500NXV9.png"></a>
修改防火牆配置腳本
在進行nat配置(IP僞裝)時曾建立有iptables_nat腳本,我們在此腳本末行加入如下iptables指令
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346504ziUd.png"></a>
在以上的iptables指令中,在nat規則表的PREROUTING規則鍊中添加規則,在規則中,-s 172.16.0.0/16表示資料包來自172.16.0.0/16;-p tcp 表示資料包的協定為TCP,--dport 80表示資料包通路的目的端口為80,即标準的www服務;-j REDIRECT表示将符合條件的資料包進行重定向;--dport 3128表示将符合條件的資料包重定向到3128端口,3128端口是squid伺服器提供網頁代理伺服器的端口。整個規則的作用是将來自172.16.0.0/16子網,且通路 www服務的資料包重定向到伺服器主機的3128端口,由squid代理伺服器進行處理
執行iptables_nat腳本後,Linux主機将具有透明代理功能,如果來自内部網絡中的資料包是通路www服務的,那麼它将重定向到squid伺服器提供代理服務;如果資料包通路的是非www服務,則将進行IP僞裝處理
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_12503465090psL.png"></a>
從以上iptables指令的結果中可以看到nat表的PREROUTING規則鍊中已經存在實作透明代理的規則
為使其永久生效将其儲存至/etc/sysconfig/iptables檔案中
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346512JGgW.png"></a>
使用透明代理的客戶機需要将以上配置的Linux伺服器設定為預設網關,如果能夠正确通路外部網站,則說明透明代理配置成功
<a href="http://tom110.blog.51cto.com/attachment/200908/15/892790_1250346521tEiK.png"></a>
本文轉自 tomsjack 51CTO部落格,原文連結:http://blog.51cto.com/tom110/192313