我們 來討論一下如何為你的CentOS 服務器來設置簡單的防火墻。 這里我們以DigitalOcean的CentOS 6 VPS為基礎來討論的,同樣也適用于 阿里云上其他類型的LINUX系統。 (阿里云有個云盾系統,因此在你自己的VPS上不設置防火墻也是可以的)
需要說明的是: 本文只涉及最基礎最常用的防火墻設置,能屏蔽一些常用的攻擊,但并不能徹底保證你的服務器的安全。
系統的隨時更新以及關閉不必要的服務仍然是保證系統安全非常重要的步驟。
如果你需要更全面的了解iptables,閱讀本文后,請google或是閱讀更加深入的資料!
首先簡單介紹一下什么是IPTables:
iptables是Linux內核中內置的防火墻,可以允許管理員通過設置table, chain以及相關的規則來進行數據包過濾和NAT。 一般來講,iptables防火墻已經內置于CentOS 6及其他Linux版本中,而且iptables服務默認都是啟動的。 iptables應用于IPv4, 如果要用IPv6,需要使用ip6tables.
iptables的命令格式:
| 1 | iptables[-ttable]command[chain][rules][-jtarget] |
[-t table]:用來指明使用的表, 有三種選項: filter, nat 和 mangle,如果未指定,則使用filter作為缺省表。 事實上,對于單個服務器的防火墻配置,一般來講,我們只需要對filter表進行配件就OK了。filter表包括 INPUT, OUTPUT,和FORWARD三個chain.
command 表明iptables命名要做什么,比如
-A (–append): 該命令會把一條規則附件到chain的末尾。
-D(–delete)用來刪除某個規則。
-F (–flush) 如果指定了chain, 刪除該chain中的所有規則,如果未指定chain, 則刪除所有chain中的所有規則。
target: 是由規則指定的操作。 包括下面幾種:
ACCEPT: 接收信息包(允許它前往目的地),并且將停止遍歷chain.
DROP: 拒絕,
此外還有REJECT, RETURN, LOG, REDIRECT, MARK, MIRROR, MAQUERADE等。
具體的iptables的語法和概念就不再多說了,請參照iptables man page 官方文檔.
簡單來說,iptables防火墻是由一系列的規則(rule)組成, 一個數據請求進來, 會依次和這些規則進行比較,如果正好符合規則的定義,那這個數據請求要么會被接收ACCEPT,要么被拒絕DRIP。如果不符合任何規則的定義,最后缺省的規則會被應用。
開始操作之前:
注意:一定要把你在DigitalOcean/ Linode/ 阿里云上的服務器做一下快照備份, 否則一旦你 iptables的配置出了問題,極有可能把你自己擋在門外,你自己都無法連接到服務器了!! 出現這種情況可是會欲哭無淚呀,除了重新做系統好像沒有更好的辦法了。( DigitalOcean提供了一個web console的界面,有時候會給你反悔和擦除iptables設置的機會,但阿里云沒有)
決定哪些端口需要開放
首先, SSH 的端口22自然是需要開放的,否則我們就無法登錄服務器了。
一般來講,CentOS的VPS經常作為用LAMP搭建的Web服務器,FTP服務器, Mail服務器等。
對于Web服務來說,需要開放80端口,如果是HTTPS/SSL協議的話,還需用開放443端口
對于Mail服務來說,由于涉及SMTP, POP3, IMAP協議,需要開放的端口如下:
SMTP : 25 Secure SMTP:465 POP3: 110 Secure POP3: 995 IMAP: 143 IMAP over SSL: 993
對于FTP服務來說,需要開放 20, 21兩個端口
第一步: 屏蔽最常見的攻擊
缺省情況下,CentOS的iptables的設置是允許任何數據通過的。
我們首先要清空iptables中的所有的規則:
| 1 | iptables -F |
然后我們加上阻止簡單掃描和攻擊的規則
| 12345 | iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP #NONE 包(所有標識bit都沒有設置)主要是掃描類的數據包iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP #防止sync-flood 攻擊iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP #ALL包(所有的標注bit都被設置了)也是網絡掃描的數據包 |
關于sync-flood, 請參照wikipedia的解釋。
第二步: 為相應的服務開放對應的端口
首先我們應該接受本機localhost的任何請求,否則,數據庫連接等將無法工作
| 1 | iptables -A INPUT -i lo -j ACCEPT |
對于不同的服務需要開放不同的端口
| 123456789 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSHiptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTPiptables -A INPUT -p tcp --dport 443 -j ACCEPT #HTTPSiptables -A INPUT -p tcp --dport 25 -j ACCEPT #SMTPiptables -A INPUT -p tcp --dport 465 -j ACCEPT #Secure SMTPiptables -A INPUT -p tcp --dport 110 -j ACCEPT #POP3iptables -A INPUT -p tcp --dport 995 -j ACCEPT #Secure POP3iptables -A INPUT -p tcp --dport 143 -j ACCEPT #IMAPiptables -A INPUT -p tcp --dport 993 -j ACCEPT #Secure IMAP |
第三步: 加上通用的規則
首先要允許所有從服務器端發起的連接,由此返回的響應數據應該是允許的!比如VPS發起的yum update , 必須要允許外部的update數據進來
| 1 | iptables -I INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT |
最后,設置缺省的策略:屏蔽任何進入的數據請求,允許所有從Server發出的請求
| 123 | iptables -P OUTPUT ACCEPTiptables -P INPUT DROP |
至此,規則設置完畢
第四步: 保存設置
首先通過下面的命令查看一下我們的設置是否正確!
| 1 | iptable -L -n |
確認沒有問題后,執行下面的命令
| 1 | service iptables save |
執行上述命令后,相應的規則會寫入 /etc/sysconfig/iptables這個文件,你可以檢查一下看看。
最后執行
| 1 | service iptables restart |
重新啟動iptables防火墻,以使上述設置生效。
最佳的方法:
為了更方便的修改和維護自己的iptables的設置,我一般是把所有的iptables的設置先寫到一個單獨文件中,測試沒有問題后。然后再保存到iptable的配置文件中。
下面是我自己的iptables文件 ~/script/firewall.sh
| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | </PRe>#!/bin/bash# A simple iptables firewall configurationPATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH#flush/erase original rulesiptables -F #清除所有已制定的ruleiptables -X #清除用戶自定義的chain/tableiptables -Z #將所有的chain的計數和流量統計歸零#Accept localhost connetting, no matter what it isiptables -A INPUT -i lo -j ACCEPT#Accept any response package which is initiated from insideiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT#block most common network attacks(recon packets and syn-flood attack)iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROPiptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROPiptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP#open ports for different servicesiptables -A INPUT -p tcp --dport 22 -j ACCEPT #SSHiptables -A INPUT -p tcp --dport 80 -j ACCEPT #HTTP#iptables -A INPUT -p tcp --dport 443 -j ACCEPT #HTTPS#iptables -A INPUT -p tcp --dport 25 -j ACCEPT #SMTP#iptables -A INPUT -p tcp --dport 465 -j ACCEPT #Secure SMTP#iptables -A INPUT -p tcp --dport 110 -j ACCEPT #POP3#iptables -A INPUT -p tcp --dport 995 -j ACCEPT #Secure POP#ICMP configuration#To prevent ICMP DDOS,we do not allow ICMP type 8(echo-request) or limit this request with 1/second#some ICMP requests are allowed.icmp_type="0 3 4 11 12 14 16 18"for ticmp in $icmp_typedoiptables -A INPUT -p icmp --icmp-type $ticmp -j ACCEPTdone#iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT#default policiesiptables -P OUTPUT ACCEPTiptables -P INPUT DROP#save to /etc/sysconfig/iptables/etc/init.d/iptables save |
你可以根據你的需要進行相應的修改。
新聞熱點
疑難解答