為Linux設置IPTables防火牆


我們 來討論一下如何為你的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

你可以根據你的需要進行相應的修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM