防火墻的作用:過慮兩個網絡之間的數(shù)據(jù)包 Linux內核的Netfilter 進出數(shù)據(jù)包,以及發(fā)送到本機的數(shù)據(jù)包都要經過內核的處理 INPUT鏈用來過濾進入本機的數(shù)據(jù)包 OUTPUT鏈用來過濾從本機發(fā)送出去的數(shù)據(jù)包 FORWARD鏈用來過濾從本機路由出去的數(shù)據(jù)包 一個數(shù)據(jù)包的頭部包括源地址、源端口、目的地址、目的端口、協(xié)議類型 包過濾正是根據(jù)這些特征來過濾數(shù)據(jù)包 Linux 下通過在三個鏈中設置規(guī)則來過濾 包的處理方式 #iptables -A INPUT -p icmp -j DROP 將進入本機,協(xié)議類型為icmp的數(shù)據(jù)包丟棄。 -A 添加規(guī)則 INPUT 對INPUT鏈進行操作 -p 協(xié)議類型 -j 指定動作,可以是ACCEPT(接收),LOG(日志),REJECT(彈回) #iptables -L -n 顯示三條鏈的過濾規(guī)則 -L 顯示所有鏈的所有規(guī)則 -n 以數(shù)字形式顯示 #iptables -F 清空所有鏈的所有規(guī)則 每個包進入本機時都被INPUT鏈檢查 出去時經過OUTPUT鏈檢查 轉發(fā)時經過FORWARD檢查 TCP/IP是雙向通信的,所以添加規(guī)則時必須注意使INPUT鏈和OUTPUT鏈的規(guī)則對應。 -D rulenum 刪除第幾條規(guī)則 -I rulenum 在第幾條前插入規(guī)則 -P 修改鏈的默認策略,如默認狀態(tài)ACCEPT,默認情況下數(shù)據(jù)包的處理方式 -s 源地址 -m 匹配擴展條件 -d 目的地址 -t 維護的表,默認為filter,另外還有一個nat表 --line-numbers 規(guī)則中顯示編號 #iptables -L -n --line-numbers 這樣方便刪除指定行編號的規(guī)則或在指定編號前插入 拒絕所有連接到本機21端口的所有連接 #iptables -A INPUT -P tcp -d 192.168.0.22 --dport 22 -j DROP --dport 目的端口 --sport 源端口 在實際使用過程中服務器還不夠嚴密,還存在被利用的弱點。如22端口,為防止沒有請求過的包,在本機主動發(fā)送出去,需要檢查包的狀態(tài)。看包是否是人家請求過我,而我回應別人的。Linux的防火墻支持狀態(tài)匹配檢查。 #iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT -m 匹配狀態(tài),上面表示跟本機連接過的包才能從22端口出去 如果正在使用ssh遠程管理服務器,不要將第一條的22端口規(guī)則刪掉,等添加完上面這條規(guī)則,才能把存在弱點的第一條刪除,否則遠程管理會立刻斷掉。 80端口也同樣設置 #iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 防止服務器在80端口主動發(fā)送請求,防止病毒利用。添加完后,刪除OUTPUT中以前添加的那條80端口規(guī)則。 假設自己是ssh客戶機,訪問別人的ssh服務器,先經過OUTPUT鏈出去 #iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT 當包回就,從對方22端口,如果對方有病毒,可能會使用22端口發(fā)送請求,所以只接受已建立連接的數(shù)據(jù)包。 #iptables -A INPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT #service iptables save 保存勞動成果 現(xiàn)在防火墻算配好了,不僅非常嚴密,還非常有效,有效防止別人攻擊你的服務器的各種服務,可防止主動型的病毒或木馬攻擊。 LOG目標 過濾包的檢查機制,可以指定某種要求的包寫入日志中。 #iptables -A INPUT -p tcp --dport 22 -j LOG --log-level 5 --log-prefix “IPTABLES:” -j LOG 記錄日志 --log-level 5 寫入日志時需指定級別,與日志服務器配合使用 --log-prefix “IPTABLES:” 指定寫入日志時,記錄的前綴字符,主要方便用戶分析日志。 添加LOG目標規(guī)則時,保證規(guī)則前同樣的包沒有被丟棄或接受,即要注意添加規(guī)則的次序。 編緝日志配置文件/etc/syslog.conf 添加: kern.=notice /var/log/firewall.log (消息來源內核kern,級別notice),將內核這個級別消息,記錄到firewall.log文件中,等號表示剛好等于這個級別的消息。為什么是notice?因為我們曾經用man syslog知道消息的默認級別notice為5,與LOG目標一致。 注意:日志級別5要跟syslog.conf中的級別一致,級別可通過syslog的manual幫助獲得。 #service syslog restart #tail /var/log/firewall.log 注意將前面在/etc/syslog.conf文件添加過的 *.* @192.168.0.22 那行刪除,還要將/etc/sysconfig/syslog文件中,那行還原為: SYSLOGD_OPTIONS=”-m 0” 不管哪個服務,修改過配置文件,要立刻生效,必須重啟服務。 這樣會將進入本機22端口的包記錄在firewall.log文件,當使用ssh持續(xù)登錄使用時,由于不停記錄包信息,firewall.log文件會持續(xù)增大! 實際配置防火墻時,首先將所有門都關閉,如將三條鏈的默認策略都改為DROP,再根據(jù)服務器需要一個端口一個端口地打開。首先需要分析這臺服務器是干什么用的,假設只是一臺提供http服務的Web服務器。 首先把服務器所有端口關閉,為了方便遠程管理開一個22的端口,端口可以在/etc/services文件中查看。添加規(guī)則時分析一下數(shù)據(jù)包的格式,再確定規(guī)則參數(shù)。 #iptables -A INPUT -p tcp -d 192.168.0.22 --dport 22 -j ACCEPT #iptables -A OUTPUT -p tcp -s 192.168.0.22 --sport 22 -j ACCEPT 注意通信的雙向性,在INPUT添加一條規(guī)則,一般要在OUTPUT添加一條與之對應,所謂有出必有入。 #iptables -P INPUT DROP #iptables -P OUTPUT DROP #iptables -p FORWARD DROP 上面首先打開22端口,防止正在使用的遠程管理斷掉,再改變三條鏈的默認策略。 #iptables -A INPUT -p tcp --dport 80 -j ACCEPT #iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT 打開一個80端口,本機地址可省略 #service iptables save 保存勞動成果(保存規(guī)則) 將剛才添加的規(guī)則保存到/etc/sysconfig/iptables文件 或使用#iptables-save > /etc/sysconfig/iptables 系統(tǒng)啟動時會加載這個文件中的規(guī)則。 現(xiàn)在服務器擋住所有服務,只開了兩個端口80,22,對一臺網絡服務器來說,絕不能缺少DNS服務,任何聯(lián)網的主機都需要做DNS請求,目前這臺服務器還無法發(fā)送DNS請求。增加一條DNS通道,首先作為一臺客戶機出現(xiàn): #iptables -A OUTPUT -p udp --dpott 53 -j ACCEPT 首先經過OUTPUT鏈 #iptables -A INPUT -p udp --sport 53 -j ACCEPT 請求后得到回復數(shù)據(jù)雹,允許進入 測試#host fedora.cyrich.com 如出現(xiàn)無法解析,或很慢,則#more /etc/resolv.conf查看域名解析配置文件,看是否本機為DNS服務器,如果是還需添加一條規(guī)則,在規(guī)則時,應該分析這個數(shù)據(jù)包如何進出哪條鏈,以及這人數(shù)據(jù)包的格式,如上面#host fedora.cyrich.com因為本身作為DNS服務器,所以會發(fā)送一個包到自己, 192.168.0.22:*――>102.168.0.22:53 (允許) 但當時入INPUT鏈時,沒有一條跟它匹配,所以會拒絕。所以如果同時作為DNS服務器和客戶機,還需添加下面規(guī)則: #iptables -A INPUT -p udp --dport 53 -j ACCEPT #iptables -A OUTPUT -p udp --sport 53 -j ACCEPT 當同時作為某種服務的服務端和客戶端時,需在規(guī)則中添加兩條規(guī)則,即源端口和目標端口。 當前的規(guī)則設置忽略了本機的內部服務,在本機上有很多端口守護在127.0.0.1上,當本機的客戶端訪問回環(huán)設備時會拒絕。 127.0.0.1上的服務如不打開,會影響本機內部服務的正常運行,打開了也不會造成服務器什么危害,所以還是最好打開: #iptables -A INPUT -s 127.0.0.1 -j ACCEPT #iptables -A INPUT -d 127.0.0.1 -j ACCEPT #service iptables save (保存勞動成果) 經過FORWARD鏈的數(shù)據(jù)包不是發(fā)送給本機,而是發(fā)送給別人的,當作為路由器使用時才需配置FORWARD鏈。現(xiàn)配置一臺路由器,如允許局域網用戶瀏覽網頁配置方法與INPUT.OUTPUT一樣。 #iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT 允許局域網發(fā)送數(shù)據(jù)包 #iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT 允許局域網接收數(shù)據(jù)包 這樣相當于把局域網和互聯(lián)網打通了,任何包都可通過,在實際使用中可以加上端口,做些限制,過濾某些數(shù)據(jù)包,也可以使用LOG目標加進日志。其實光打開FORWARD鏈還不行,還需要打開內核的轉發(fā)文件。 #echo 1 >/proc/sys/net/ipv4/ip_forward (默認為0) 0表示關閉轉發(fā),1為啟用,要永久啟用,可修改配置文件/etc/sysctl.conf: net.ipv4.ip_forward =1 如需訪問互聯(lián)網,這樣的配置還不行,因為私有地址是無法直接訪問互聯(lián)網的,這里我們做NAT網絡地址轉換,這時網需兩個地址,一個局域網的,一個互聯(lián)網的,當收到訪問互聯(lián)網的包時,將源地址替換為互聯(lián)網地址。 #iptables -t nat -L -n 查看nat表內容 Netfilter的NAT表: 三條鏈用來做包過濾 用來翻譯地址的也有三條鏈,常用的有PREROUTING,POSTROUTING SNAT(源地址翻譯) 數(shù)據(jù)包進入內核前,首先進入PREROUTING這個點,然后進入內核進行處理,就是ROUTING那個點,如果數(shù)據(jù)包不是發(fā)送給本機,而內核啟用了轉發(fā)功能,則內核將把數(shù)據(jù)包從FORWARD,再到POSTROUTING。如果FORWARD允許數(shù)據(jù)包通過,這個包可以在POSTROUTING這個點上做源地址替換,而且只能在這個點上做,這是內核的一種機制,所以數(shù)據(jù)包的源地址是在經過POSTROUTING這個點后改變的。 DNAT(目標地址翻譯) 數(shù)據(jù)包進入時,首先進入PREROUTING。然后內核ROUTING會根據(jù)包的目標地址決定是從INPUT鏈走還是FORWARD鏈走。所以數(shù)據(jù)包的目標地址非常重要。在PREROUTING上可以做目標地址替換。 SNAT應用 網關有兩塊網卡分別連接兩臺主機或兩個網絡。 #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.0.254 將源地址為10.0.0.0/24的包的源地址替換為192.168.0.254,如果這是一臺ADSL撥號網關,可以將整個局域網帶進互聯(lián)網 #iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE 有人會想數(shù)據(jù)包怎么回來?其實將數(shù)據(jù)包翻譯成192.168.0.254源地址時,192.168.0.1回應一個數(shù)據(jù)包到服務器會被服務器認出來,那服務器會自動將翻譯地址還原,然后退還給10.0.0.241。所以做網關時,只要加SNAT,然后配合前面的過濾規(guī)則就可配一個安全且強大的防火墻,同時具有路由器的功能。 DNAT應用 DNAT應用一般用來做DMZ,保護局域網內部 如192.168.0.1作為一臺Web服務器,主機10.0.0.241訪問10.0.0.254網關,網關將請求發(fā)送到192.168.0.1,這樣就起到保護Web服務器的作用 #iptables -t nat -A PREROUTING -d 10.0.0.254 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1 將訪問網關80端口的數(shù)據(jù)包目標地址翻譯或192.168.0.1,這樣本來發(fā)送給本機的數(shù)據(jù)包就會從FORWARD鏈轉發(fā)出去。 Web服務器在內部,它收到請求后回應數(shù)據(jù)包給網關,然后返回到10.0.0.241。這樣就把內部主機保護起來,外面的人只能看見那臺網關服務器,所以NAT應用非常廣,而且非常強大,更多幫助和介紹可參考www.netfilter.org 為軟件打補丁,首先用gpg導入公鑰文件,再校驗patch文件的正確性。 #bzcat 9.3.0-patch | patch -p0 一般需查文件里面的目錄,然后再將軟件目錄改名。 |