我們 來討論一下如何為你的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 [-t table] command [chain] [rules] [-j target]
|
[-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
|
然后我們加上阻止簡單掃描和攻擊的規則
1
2
3
4
5
|
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
|
對於不同的服務需要開放不同的端口
1
2
3
4
5
6
7
8
9
|
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # SSH
iptables -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 POP3
iptables -A INPUT -p tcp --dport 143 -j ACCEPT #IMAP
iptables -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發出的請求
1
2
3
|
iptables -P OUTPUT ACCEPT
iptables -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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
</pre>
#!/bin/bash
# A simple iptables firewall configuration
PATH=/sbin:/bin:/usr/sbin:/usr/bin; export PATH
#flush/erase original rules
iptables -F #清除所有已制定的rule
iptables -X #清除用戶自定義的chain/table
iptables -Z #將所有的chain的計數和流量統計歸零
#Accept localhost connetting, no matter what it is
iptables -A INPUT -i lo -j ACCEPT
#Accept any response package which is initiated from inside
iptables -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 DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
#open ports for different services
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #SSH
iptables -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_type
do
iptables -A INPUT -p icmp --icmp-type $ticmp -j ACCEPT
done
#iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/second -j ACCEPT
#default policies
iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
#save to /etc/sysconfig/iptables
/etc/init.d/iptables save
|
你可以根據你的需要進行相應的修改。