首先在配置iptables之前,建議先去了解一下iptables的基礎知識。本文主要是講解如何配置一個filter表的防火墻。
1.查看iptables的設置情況
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (0 references)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255
ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0
ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:25
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
可以看出我在安裝Linux時選擇了有防火墻,并且開放了22,80,25端口。如果在安裝Linux時沒有選擇啟用防火墻的話,是這樣的
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
什么規則都沒有
2.清除原有規則
無論在安裝Linux時是否啟用了防火墻,在配置屬于自己的防火墻之前,請先清除原有規則。
a.清除預設表filter中的所有規則鏈的規則
[root@localhost ~]# iptables -F
b.清除預設表filter中使用者自定鏈中的規則
[root@localhost ~]# iptables -X
用iptables -L -n命令再看一下,這時顯示的結果和沒有啟用防火墻是一樣的。(提前說一句,這些配置就像用命令配置IP一樣,重啟就會失去作用,所以必須保存一下。)
c.將配置寫到/etc/sysconfig/iptables文件里
[root@localhost ~]# /etc/rc.d/init.d/iptables save
d.重啟防火墻,新的配置才能起作用
[root@localhost ~]# service iptables restart
現在iptables已經是空的了,那我們就開始配置屬于自己的防火墻吧。
3.設定預設規則
[root@localhost ~]# iptables -p INPUT DROP
[root@localhost ~]# iptables -p OUTPUT ACCEPT
[root@localhost ~]# iptables -p FORWARD DROP
上面三行命令的意思是:
當超出了iptables里filter表里的兩個鏈規則(INPUT,FORWARD)時,不在這兩個規則里的數據包如何處理呢,那就是DROP(放棄)。這樣配置是很安全的,我們要控制流入的數據包。
而對于OUTPUT鏈,也就是流出的數據包,我們不用做限制,也就是說,不在這個規則里的數據包怎么辦呢,那就是通過。
可以看出,INPUT、FORWARD兩個鏈采用的是允許什么包通過的規則,而OUTPUT鏈采用的是不允許什么包通過的規則。
這樣設置還是挺合理的,當然你也可以三個鏈都DROP,但這樣做我認為是沒有必要的,而且要寫的規則就會增加。但如果你只想要有限的幾個規則的話,比如只做web服務器,那還是推薦三個鏈都DROP。
注:如果不是本機操作,而是遠程SSH的話,在寫規則之前最好先將防火墻停掉,否則寫完上面三行規則后,你就會斷線,連接不上服務器了。停止防火墻:service iptables stop
4.添加規則
a.首先添加INPUT鏈,INPUT鏈的默認規則是DROP,所以我們就寫允許通過(ACCETP)的鏈。
為了能采用SSH遠程登陸,開啟22端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
如果你把OUTPUT設置成DROP的話,就要寫上下面這句
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
很多人就是忘了寫這一句規則,導致始終無法SSH。其他的端口也一樣要加上這句,比如做web服務器,OUTPUT設置成DROP的話,同樣也要添加一條鏈:
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
如果有做EMAIL服務的話,開啟25、110端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
如果有做FTP服務的話,開啟21、20端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
如果要想讓主機正常上網,需要開啟DNS回顯,端口是53
[root@localhost ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT
如果有做DNS服務器的話,開啟53端口
[root@localhost ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
允許icmp包通過,也就是允許ping
[root@localhost ~]# iptables -A INPUT -p icmp -j ACCEPT (INPUT設置成DROP的話)
[root@localhost ~]# iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設置成DROP的話)
允許loopback!(不然會導致DNS無法正常關閉等問題)
[root@localhost ~]# iptables -A INPUT -i lo -p all -j ACCEPT (INPUT設置成DROP的話)
[root@localhost ~]# iptables -A OUTPUT -o lo -p all -j ACCEPT (OUTPUT設置成DROP的話)
如果你還開了其他服務的話,需要開啟哪個端口,照著寫就行了。上面寫的都是INPUT鏈,凡是不在上面這些規則里的,都DROP(不允許通過)。
b.其次寫OUTPUT鏈,OUTPUT鏈默認規則是ACCEPT,所以只需要寫DROP(放棄)的鏈
減少不安全的端口連接
[root@localhost ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
有些特洛伊木馬會掃描端口31337到31340(即黑客語言中的 elite 端口)上的服務。既然合法服務都不使用這些非標準端口來通信,阻塞這些端口能夠有效地減少你的網絡上可能被感染的機器和它們的遠程主服務器進行獨立通信的機會。
還有其他端口也一樣,像31335、27444、27665、20034 NetBus、9704、137-139(smb)、2049(NFS)端口也應該被禁止,我在這寫的也不全,有興趣的朋友可以去查一下相關資料。
出于更安全的考慮你也可以把OUTPUT鏈設置成DROP,那你添加的規則就多一些,就像上邊添加
允許SSH登陸一樣,照著寫就行了。
下面來寫一下更加細致的規則,就是允許或限制到某臺機器
只允許IP為192.168.0.3的機器SSH連接
[root@localhost ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允許或限制一段IP地址可以用192.168.0.0/24,表示192.168.0.1-255的所有IP,24表示子網掩碼數,但一定要記得把/etc/sysconfig/iptables里的這一行刪了
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因為它表示所有地址都可以登陸。
或采用命令的方式刪除
[root@localhost ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
除了某個IP的話,就需要在IP前加一個!,比如!192.168.0.3就表示除了IP是192.168.0.3的機器,其他的規則連接也一樣這么設置。
c.接下來寫FORWARD鏈,FORWARD鏈的默認規則是DROP,所以我們就寫ACCEPT(允許通過)的鏈
開啟轉發功能,(在做NAT時,FORWARD默認規則是DROP時,必須做)
[root@localhost ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丟棄壞的tcp包
[root@localhost ~]# iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
處理IP碎片數量,防止攻擊,允許每秒100個
[root@localhost ~]# iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
設置ICMP包過濾,允許每秒1個包,限制觸發條件是10個包
[root@localhost ~]# iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
前面之所以允許ICMP包通過,就是因為在這里有限制。
最后別忘記保存,凡是采用命令方式寫的規則,只在當時生效,重啟后就失去了作用,所以一定要保存,將規則寫入/etc/sysconfig/iptables文件里。
[root@localhost ~]# /etc/rc.d/init.d/iptables save
這樣,一個基本的iptables防火墻就配置完成了。
億恩科技地址(ADD):鄭州市黃河路129號天一大廈608室 郵編(ZIP):450008 傳真(FAX):0371-60123888
聯系:億恩小凡
QQ:89317007
電話:0371-63322206 本文出自:億恩科技【www.artduck.net】
服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]
|