Linux 2.2內核用ipchains代替了2.0內核中的ipfwadm,在Redhat 6.0/6.1的版本中,ipfwadm不能再用了。本文旨在介紹如何設置一個基本的防火墻系統和IP偽裝,允許內部用戶用IP偽裝上網,ipchains較之以前的ipfwadm語法變動很大,如你想了解更多的命令和語法,可以參考一篇網友翻譯的中文ipchains howto () . 也可運行ipchains --help獲得幫助。另外,本文的設置主要針對專線用戶基本的防火墻和IP偽裝設置,也可供撥號用戶參考。
思路:
一般而言,實現Linux防火墻功能有兩種策略,一種是首先全面禁止所有的輸入/輸出/轉發包,然后根據需要逐步打開所要求的各項服務,這種方式最安全,但必須全面考慮到自己所要使用的各項服務功能,不能有任何遺漏,如果你對要實現的某種服務和功能不能清楚地知道應該打開哪些服務和端口,那會比較麻煩;第二種方式是首先默認打開所有的輸入/輸出包,(對轉發包,不必打開,因為內部網段用保留地址,不能直接與互聯網交換數據,我們是通過用IP偽裝的方式透明地進行交換數據的),然后禁止某些危險包,IP欺騙包,廣播包,ICMP服務類型攻擊等,對于應用層服務象http,sendmail,pop3,ftp等,若不打算提供某些服務,就不要啟動它,或者根本就不要安裝,這種方式雖然沒有第一種方式更安全,但是比較方便,容易配置,用戶不必過多地了解該如何打開一種服務(如FTP)所需要執行的ipchains命令細節就能配置一個比較安全的防火墻系統。
本文就采用第二種方式配置一個基本的防火墻系統,我的內部網段使用192.168.11.0,eth0為外部網段網卡接口,eth1為內部網段網卡接口。
實現:
1. 安裝完系統后,在/etc/rc.d/目錄下創建一個script叫ipchains.rules(執行#chmod u+x ipchains.rules確保為可執行文件)然后加一行/etc/rc.d/ipchains.rules到/etc/rc.d/rc.local中,以確保每次機器重新啟動后即運行所設定的各項防火墻規則。
下面為該文件內容:
--------------------------
#!/bin/sh
echo "Starting ipchains firewall rules..."
# refresh all firewall rules
/sbin/ipchains -F forward
/sbin/ipchains -F input
/sbin/ipchains -F output
# setup default firewall rules
/sbin/ipchains -P forward DENY
/sbin/ipchains -P input ACCEPT
/sbin/ipchains -P output ACCEPT
external_interface=a.b.c.d
# setup Loopback interface
/sbin/ipchains -A input -j ACCEPT -i lo
/sbin/ipchains -A output -j ACCEPT -i lo
# disabling IP spoofing
/sbin/ipchains -A input -j DENY -i eth0 -s 192.168.0.0/16
/sbin/ipchains -A input -j DENY -i eth0 -d 192.168.0.0/16
/sbin/ipchains -A output -j DENY -i eth0 -s 192.168.0.0/16
/sbin/ipchains -A output -j DENY -i eth0 -d 192.168.0.0/16
/sbin/ipchains -A input -j DENY -i eth0 -s $external_interface/32
/sbin/ipchains -A output -j DENY -i eth0 -d $external_interface/32
#refuse packets claiming to be to or from the loopback interface
/sbin/ipchains -A input -j DENY -i eth0 -s 127.0.0.0/8
/sbin/ipchains -A input -j DENY -i eth0 -d 127.0.0.0/8
/sbin/ipchains -A output -j DENY -i eth0 -s 127.0.0.0/8
/sbin/ipchains -A output -j DENY -i eth0 -d 127.0.0.0/8
#refuse broadcast address source packets
/sbin/ipchains -A input -j DENY -i eth0 -s 255.255.255.255
/sbin/ipchains -A input -j DENY -i eth0 -d 0.0.0.0
#refuse multicast/anycast/broadcast address
/sbin/ipchains -A input -j DENY -i eth0 -s 240.0.0.0/3
#forwarding all internal traffic
/sbin/ipchains -A forward -j ACCEPT -i eth1 -s 192.168.11.0/24 -d 192.168.11
.0/24
#setup IP Masquerading rules
echo "1" > /proc/sys/net/ipv4/ip_forward
注:你也可以通過設置/etc/sysconfig/network文件啟動IP轉發,改那一行
FORWARD_IPV4=true即可,這樣就不必設置上面的echo行了。
# add modules for ftp, cuseeme, irc, real audio, etc...
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_quake
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_user
/sbin/modprobe ip_masq_raudio
#starting IP masquerading
/sbin/ipchains -A forward -j MASQ -i eth0 -s 192.168.11.0/24
注:如果你僅僅希望讓部分用戶進行IP偽裝,你也可以個別設置,如
/sbin/ipchains -A forward -j MASQ -i eth0 -s 192.168.11.3/32
/sbin/ipchains -A forward -j MASQ -i eth0 -s 192.168.11.23/32
---------------------------------
其它防火墻安全事項:
上面的設置啟動了一個基本的防火墻系統,禁止IP欺騙,廣播包,但對于一個完整的防火墻系統,仍然要注意下面幾點:
1. 設置/etc/inetd.conf,禁止所有不需要的服務,象所有的R命令,finger,talk等,一般而言,僅保留ftp,telnet服務便于內部維護用途,同時設置/etc/hosts.allow和/etc/hosts.deny,僅允許內部某些管理用戶可以telnet/ftp到該防火墻,當然,更安全的辦法是禁止所有的inetd服務,對ftp,telnet,安裝SSH,用SSH/scp代替telnet和ftp。
2. 啟用影子口令(shadow password),簡單的兩個命令是pwconv(啟用影子口令)和pwunconv(恢復原狀態),Redhat 6的版本默認安裝時已經啟動了shadow password,這樣使得遠程用戶獲得根密碼更為困難,因為影子口令使用/etc/shadow 存儲口令文件,該文件僅僅被root可讀。
3.運行ntsysv檢查,看是否啟動了不需要的后臺程序,記?。簝H僅啟動那些你希望提供的服務后臺程序,最大限度地確保安全。
4.創建盡可能少的用戶帳號,不斷升級有安全漏洞的軟件包。