一般而言,防火牆的兩個網絡接口應分屬兩個不同的網絡,根據係統管理員定義的訪問規則在兩個接口之間轉發數據包,或者拒絕、丟棄數據包。實際上,防火牆不單單是訪問控製的功能,而且還充當了路由器的角色。當然,這並非有什麼不妥當的地方,但是當你企圖把你配置好的linux防火牆放入運行網絡,來保護現有係統安全的時候,你不得不重新考慮和更改你的網絡架構。另外一個可能的麻煩是,當防火牆發生意外時,如果沒有防火牆的硬件備份的話,那麼你將麵臨巨大的心理壓力,因為防火牆的故障,整個網絡癱瘓了。假如你把防火牆配置成透明模式(可稱為偽網橋),就無需更改網絡架構,即使是防火牆不能工作了,要做的僅僅是拔出網線,把網線直接插在路由器的內部接口就可以讓網絡正常工作,然後你就有時間慢慢恢複發生故障的防火牆。
好了,既然透明防火牆有那麼多方便,我們趕快動手來配置吧!準備一台pc機,兩塊網卡(建議用3com網卡),網線若幹,redhat linux 9安裝盤一套。打開機箱,把兩塊網卡插入計算機的pci插槽,用網線把計算機分別與網關和交換機相連;蓋上計算機的蓋子,插上電源,開機。在光驅裏放上Linux 9安裝光盤,由光盤引導計算機,從而安裝Linux 係統。選擇定製安裝,不要保守,多花一點時間體驗一下圖形界麵的安裝樂趣,取消防火牆(no firewall),在安裝快結束時選擇以文本方式登錄係統,完成安裝。
透明防火牆功能配置:
1、 設置網絡地址。修改文件 /etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/sysconfig/network-scripts/ifcfg-eth1,使其具有相同的ip地址,相同的子網掩碼。用vi 來編輯如下,保存文件,運行命令 service network restart 使修改生效。
DEVICE=eth0 BOOTPROTO=none BROADCAST=192.168.1.255 IPADDR=192.168.1.254 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes USERCTL=no PEERDNS=no TYPE=Ethernet DEVICE=eth1 BOOTPROTO=none BROADCAST=192.168.1.255 IPADDR=192.168.1.254 NETMASK=255.255.255.0 NETWORK=192.168.1.0 ONBOOT=yes USERCTL=no PEERDNS=no TYPE=Ethernet |
這裏需要注意兩個地方,第一個是要區分清楚那一個網卡是eth0,那一個是 eth1.這個問題十分關鍵,如果搞混了就會導致防火牆不能連通網絡。至於怎樣區分eth0和 eth1,我將在文章的末尾作簡單的描述。在這裏假定與路由器相連的網卡是eth0。
2、 設置默認路由。在文件 /etc/sysconfig/network-scripts/ifcfg-eth0 中加入一行 gateway=192.168.1.1 保存後運行命令 service network restart ,修改生效。找一個開放ICMP協議的公網IP,用命令ping 202.108.36.196 (www.163.com 的主機)檢測跟外網的連通狀況,如果正常,表明Linux防火牆主機跟外網配置正確。再用命令ping 192.168.1.18 檢測防火牆主機與內網主機的連通狀況,如果正常則進行下一步操作。
3、 啟用網絡轉發和proxy_arp 。這是透明防火牆的核心部分,我把它們寫進文件/etc/rc.d/rc.local。用vi /etc/rc.d/rc.local 插入如下內容。在做這一步的時候,我曾經花費較多的時間,因為我做參考的那本書裏的這一步沒有參數 “–w” ,後來單獨運行 sysctl net.ipv4.conf.eth0.proxy_arp=1 才發現red hat Linux 9 沒有參數“-w”不能運行。
#Ip forward /sbin/sysctl -w net.ipv4.conf.all.forwarding=1 #Enable proxy-arp /sbin/sysctl -w net.ipv4.conf.eth0.proxy_arp=1 /sbin/sysctl -w net.ipv4.conf.eth1.proxy_arp=1 |
4、 指定路由。由於兩塊網卡(eth0,eth1)使用同樣的ip ,如果不專門指定轉發路徑,一定會導致路由混亂,從而使防火牆以內的計算機沒法訪問 Internet 。還是用命令 vi 修改文件 /etc/rc.d/rc.local ,插入如下幾行。保存文件,重新啟動計算機。
#Define route /sbin/ip route del 192.168.1.0/24 dev eth0 /sbin/ip route add 192.168.1.1 dev eth0 /sbin/ip route add 192.168.1.0/24 dev eth1 |
Linux防火牆,如果不出意外,就可以從192.168.1.18 這台主機訪問Internet,當然內網的任何機器都是可以訪問Internet 的。在這裏對定義的路由(Define route)作些說明:/sbin/ip route del 192.168.1.0/24 dev eth0 表明所有到子網192.168.1.0/24的數據包都不從網卡eth0轉發而從 eth1轉發,即命令 /sbin/ip route add 192.168.1.0/24 dev eth1;/sbin/ip route add 192.168.1.1 dev eth0 表明所有到192.168.1.1的數據包都由eth0轉發,這其實可以理解為兩個網卡數據轉發的分工—到192.168.1.1 的數據包由eth0負責,其餘的由eth1負責。到這一步,恭喜你!已經成功了一大半,如果安裝Linux的時候,選擇的防火牆規則為中等級別,那麼這個防火牆已經配置成功了。相信大家跟我一樣,且肯就此罷休。
定製防火牆策略 都是2.4.20的內核版本,當然要用netfilter/iptables。由於安裝Linux係統的時候,選擇了“無防火牆”這個選項,那麼在/etc/sysconfig 下將沒有iptables這個文件存在。還是讓我們隨心所欲的來定製防火牆訪問策略吧。
在目錄 /etc/rc.d 下創建腳本文件 myfirewall.sh,用命令 touch /etc/rc.d/myfirewall.sh並給文件執行權限 chmod 711 myfirewall。然後用 vi 編輯這個文件。我寫的這個shell文件如下:
vi /etc/rc.d/myfirewall.sh #!/bin/bash #Define string IPT=/sbin/iptables #Refresh rules $IPT -F FORWARD $IPT -F INPUT $IPT -F OUTPUT #Default policy $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT #Enable loopback $IPT -A INPUT -i lo -p all -j ACCEPT #Enable icmp $IPT -A INPUT -p icmp –j ACCEPT #Interface forward $IPT -A FORWARD -s 192.168.1.0/24 -j ACCEPT $IPT -A FORWARD -d 192.168.1.0/24 -j ACCEPT #Enable ssh $IPT -A INPUT -p tcp --dport 22 -j ACCEPT #Add other access rule //可根據實際情況添加或減少規則 $IPT -A INPUT -p tcp --dport 20 -j ACCEPT $IPT -A INPUT -p tcp --dport 21 -j ACCEPT $IPT -A INPUT -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -p tcp --dport 53 -j ACCEPT $$IPT -A INPUT -p udp --dport 53 -j ACCEPT $IPT -A INPUT -p tcp --dport 23 -j ACCEPT $IPT -A INPUT -p tcp --dport 110 -j ACCEPT $IPT -A INPUT -p tcp --dport 25 -j ACCEPT $IPT -A INPUT -p tcp --dport 443 -j ACCEPT |
規則隻開放了較少的允許訪問的策略(可以ping ,收發郵件,瀏覽網頁,ssh,https,telnet,ftp,其它的訪問則全部丟棄)。$IPT –A OUTPUT ACCEPT 沒有設置成DROP的原因是由於大部分網絡服務所使用的協議是tcp協議,眾所周知,tcp協議是麵向連接的,如果設置 $IPT –A OUTPUT DROP, 那麼任何協議為tcp的連接就要寫兩條了。況且防火牆對外的訪問總是允許的,因此這樣做是為了簡化規則。
修改完成後保存,然後在當前目錄運行命令 ./myfirewall.sh,在上述腳本沒有書寫錯誤的情況下,規則生效,但它僅僅在內存裏,用命令 service iptables save 將自動生成文件 /etc/sysconfig/iptables,前麵設定的訪問策略就被保存到硬盤,係統重啟時,係統將自動地從文件 /etc/sysconfig/iptables 獲得定製的訪問策略。
到這裏,一個透明的linux 防火牆就架設好了。更改計算機的BIOS設置,使它可以在沒有鍵盤的情況下啟動係統。啟用ftp,以便可以在需要時可以向防火牆主機拷貝文件。把鍵盤和顯示器拿掉,剩下的操作隻是摁一下電源開關。
防火牆的管理 可能有時候我們需要更改防火牆的某些規則,或者做些別的管理,既然我們是係統管理員,再插上鍵盤和接上顯示器坐在防火牆麵前可能會被人恥笑,因此這些管理工作當然通過網絡來進行。Ssh和webmin是我的偏好,ssh的協議端口是22,webmin的默認協議端口是10000。其中ssh是linux係統的默認服務 ,隻要安裝客戶端就可以(windows下的程序securecrt 是個不錯的選擇,據說ssh連接速度沒有vnc 快)對防火牆進行所有的管理(和直接操作防火牆主機一樣);webmin是基於web的圖形界麵管理方式,非常的方便和直觀,盡管它不能象ssh那樣對係統進行完全的管理,但是對於我們的工作需求還是可以滿足,建議在防火牆係統安裝webmin服務器程序。Ssh與webmin兩者結合使用,可以幫助我們較快較深入地掌握Linux。
Ssh客戶端安裝較為簡單,而webmin不需要安裝客戶端。這裏介紹webmin 服務器的安裝:把webmin-1.110. tar.gz 下載到另外一台windows的硬盤裏,然後用ftp把它複製到防火牆主機的ftp目錄(如果你是linux高手,並不需要如此,隻須以ssh方式登錄防火牆,用get/wget指令取得該文件),解開文件webmin-1.110.tar.gz tar –zxvf webmin-1.110.gz.tzr cd webmin-1.110 安裝webmin ./setup.sh ,一路回車,創建一個webmin管理賬戶,安裝完畢;在任何一台運行瀏覽器的地址欄輸入防火牆的ip加上端口號10000就可以管理防火牆(http://192.168.1.254:10000)。以這種方式管理linux 網絡的防火牆十分直觀,並且選項十分詳盡,就算不懂iptable語法的人也能容易的配置防火牆的訪問規則。這裏有一個技巧,假如你更改了某條訪問規則導致網絡不能向外訪問,不要慌,到防火牆跟前重啟一下係統即可。萬一更改規則發生不測並且規則已經寫入硬盤,那麼請你直接刪除文件 /etc/sysconfig/iptables,然後再運行腳本 sh /etc/rc.d/myfirewall 再次重寫文件/etc/sysconfig/iptables service iptables save 。有的係統管理員傾向於直接編輯/etc/sysconfig/iptables 文件,但是這需要更多的耐心和勇氣。如果你是新手,建議你跟我一樣,先寫腳本,再生成iptables。
特別關注: 最好把除路由器而外的整個網絡放在防火牆的保護之中。如果有同一網段的主機放在防火牆的前麵,將導致嚴重的網絡故障。實踐表明,這台windows主機的ip地址丟失了(網絡屬性的ip值還在,但用命令 ipconfig /all 則是 0.0.0.0),重啟windows後提示ip地址衝突,更換同一網段內的任何一個未用的ip地址還是提示衝突。搞的我的兩台郵件服務器和兩台web服務器停火,我還以為是中了邪門的病毒,直到後來我把tcp/ip協議卸載再安裝才解決問題。經分析,是防火牆的路由導致這樣的故障。強烈建議把所有的主機放在防火牆的保護之下,以減少網絡的複雜程度。另外,我們應該養成這樣一種習慣—在係統正常的情況下,如果更改了配置,請一定要用筆記錄所作的更改,以便在改出問題時我們能夠快速準確的恢複,這種習慣更可運用到所有的IT管理工作,它是我的不傳之密。
感謝齊一楠為解決問題提供的無私的幫助! 附:區分eth0與eth1的小技巧。把防火牆的一塊網卡跟交換機相連,另外一塊不做任何連接,即另外一塊網卡的網絡連接是斷開的;使用命令 ifconfig eth0 down 關閉網絡接口eth0;用網絡中的另一台計算機 ping 192.168.1.254 ,如果ping 通了則表明連接交換機的網絡接口為eth1,另一塊為eth0,還可以把網線交換一下另一網絡接口,確認判斷的正確性