保護你的Web服務(wù)器 iptables防火墻腳本全解讀
原創(chuàng)【51CTO獨家特稿】本文假設(shè)你已經(jīng)對iptables有基本的了解,否則請先閱讀iptables入門一文。
在我們的Web服務(wù)器上,系統(tǒng)的默認策略是INPUT為DROP,OUTPUT;FORWARD鏈為ACCEPT,DROP則設(shè)置得比較寬松,因為我們知道出去的數(shù)據(jù)包比較安全。
準備工作
為了驗證腳本的通用性,我特地查看了服務(wù)器的內(nèi)核及iptables版本:
# uname -a Linux ud50041 2.6.9-34.ELsmp #1 SMP Fri Feb 24 16:54:53 EST 2006 i686 i686 i386 GNU/Linux # iptables -V iptables v1.2.11 # lsb_release -a LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch Distributor ID: RedHatEnterpriseAS Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 3) Release: 4 Codename: NahantUpdate3
大家可以發(fā)現(xiàn),這臺服務(wù)器的系統(tǒng)、內(nèi)核和iptables版本是比較老的。本文中介紹的腳本涉及到recent安全模塊,這對系統(tǒng)內(nèi)核有要求(recent模塊在主機防護腳本中也經(jīng)常用到)。因此,如果大家要采用iptables作為主機防火墻時,建議用CentOS 5.6 x86_64或更高級版本,不然系統(tǒng)會有如下提示錯誤信息:
iptables: Unknown error 18446744073709551615 iptables:Invalid argument
在tail -f /var/log/messages時會有如下出錯提示:
ip_tables: connlimit match: invalid size 32 != 16 ip_tables: connlimit match: invalid size 32 != 24
另外,在生產(chǎn)環(huán)境下進行iptables腳本的調(diào)試之前,強烈建議編寫crontab任務(wù),每5分鐘關(guān)閉一次iptables腳本,防止操作失誤而將自己的SSH客戶端鎖在外面:
*/5 * * * * root /etc/init.d/iptables stop
準備工作就是這些,下面是iptables腳本內(nèi)容。
腳本內(nèi)容
#!/bin/bash iptables -F iptables -F -t nat iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #load connection-tracking modules modprobe iptable_nat modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT iptables -A INPUT -s 122.70.x.x -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 80,22 -j ACCEPT
保存腳本文件后用
# sh iptables.sh
執(zhí)行腳本。運行腳本之后最好檢查一下:
# iptables -nv -L
腳本說明
由于此Web服務(wù)器是置于負載均衡器后面,所以我們要允許數(shù)據(jù)源地址為負載均衡器的數(shù)據(jù)包通過:
iptables -A INPUT -s 122.70.x.x -j ACCEPT
如果配置了Nagios等監(jiān)控系統(tǒng)的話在這里也要加上,如果監(jiān)控和LB都沒做的話,這行可以不用。
另外,我的許多基于LNMP的小網(wǎng)站上面也部署了此腳本,由于Web服務(wù)和MySQL數(shù)據(jù)庫同時安裝在一臺機器上,所以沒有開放3306端口。
在本腳本中,我們配置了一些安全措施,以防止外部的ping和SYN洪水攻擊,并且考慮到外部的瘋狂端口掃描軟件可能會影響服務(wù)器的入口帶寬,所以在這里也做了限制:
iptables -A INPUT -p tcp --syn -m limit --limit 100/s --limit-burst 100 -j ACCEPT
上面的命令每秒鐘最多允許100個新連接。請注意這里的新連接指的是state為New的數(shù)據(jù)包,在后面我們也配置了允許狀態(tài)為ESTABLISHED和RELATED的數(shù)據(jù)通過;另外,100這個閥值則要根據(jù)服務(wù)器的實際情況來調(diào)整,如果是并發(fā)量不大的服務(wù)器這個數(shù)值就要調(diào)小,如果是訪問量非常大且并發(fā)數(shù)不小的服務(wù)器,這個值則還需要調(diào)大。
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s –limit-burst 10 -j ACCEPT
這是為了防止ping洪水攻擊,限制每秒的ping包不超過10個。
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT
上面的命令防止各種端口掃描,將SYN及ACK SYN限制為每秒鐘不超過200個,免得把數(shù)務(wù)器帶寬耗盡了。
后續(xù)加固工作
iptables防火墻運行后,運行nmap工具進行掃描:
# nmap -P0 -sS 211.143.6.x Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2009-03-29 16:21 CST Interesting ports on 211.143.6.X: Not shown: 1668 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 110/tcp open pop3 111/tcp open rpcbind 143/tcp open imap 443/tcp open https 465/tcp open smtps 587/tcp open submission 993/tcp open imaps 995/tcp open pop3s 1014/tcp open unknown
在這里,我們發(fā)現(xiàn)一個1014端被某個進程打開了,用lsof -i:1014查看發(fā)現(xiàn)是rpc.statd打開的,這服務(wù)每次用的端口都不一樣啊!本來想置之不理的,但是如果rpc.statd不能正確處理SIGPID信號,遠程攻擊者可利用這個漏洞關(guān)閉進程,進行拒絕服務(wù)攻擊,所以還是得想辦法解決掉。我們發(fā)現(xiàn)rpc.statd是由服務(wù)nfslock開啟的,進一步查詢得知它是一個可選的進程,它允許NFS客戶端在服務(wù)器上對文件加鎖。這個進程對應(yīng)于nfslock服務(wù),于是我們關(guān)掉了此服務(wù):
service nfslock stop chkconfig nfslock off
最后想說的是,如果沒有硬件防火墻保護的話,請盡量在每一臺有公網(wǎng)IP的機器上部署iptables防火墻吧!
作者介紹:余洪春(撫琴煮酒·微博),《構(gòu)建高可用Linux服務(wù)器》一書作者,一拍網(wǎng)系統(tǒng)架構(gòu)師、資深項目管理工程師,ChinaUnix集群和高可用版版主。
【51CTO.com獨家特稿,合作媒體轉(zhuǎn)載請注明原文作者及出處!】
【編輯推薦】
- iptables實戰(zhàn)系列:通過NAT轉(zhuǎn)發(fā)實現(xiàn)私網(wǎng)對外發(fā)布信息
- 深入淺出Netfilter/iptables防火墻框架(基礎(chǔ)篇)
- 深入淺出Netfilter/iptables防火墻框架(入門篇)
- iptables實戰(zhàn)系列:公共網(wǎng)絡(luò)服務(wù)防火墻
- iptables的狀態(tài)機制