防火墻其實就是一個加固主機或網(wǎng)絡安全的一個設備或者軟件而已,通過防火墻可以隔離風險區(qū)域與安全區(qū)域的連接,同時不會妨礙風險區(qū)域的訪問。世界上沒有絕對的網(wǎng)絡安全,世界上70%的網(wǎng)絡安全事件,都是發(fā)生在防火墻內(nèi)部。嚴謹?shù)牟僮髁晳T,程序化的操作準則,才是最好的防火墻。
1、從特點上分類
第一種,軟件防火墻,軟件防火墻需要運行在特定的計算機上,而且需要計算機的操作系統(tǒng)的支持。
第二種,硬件防火墻,硬件防火墻其實就是一個普通pc機的架構(gòu),然后上面跑有專門的操作系統(tǒng)。
第三種,芯片級的防火墻,這種防火墻基于專門的硬件平臺,沒有操作系統(tǒng),專有的ASIC芯片使它們比其他類的防火墻速度更快,處理能力極強,性能更高,但是價格卻極其昂貴。
2、從技術(shù)上分類
第一種,包過濾型防火墻,這類的防火墻主要是工作在網(wǎng)絡層,根據(jù)事先設定好的規(guī)則進行檢查,檢查結(jié)果根據(jù)事先設定好的處理機制進行處理。
第二種,應用層防火墻,它是工作在TCP/IP模型中的最高層應用層,相比較來說速度要慢一點。
第三種,狀態(tài)監(jiān)視器,狀態(tài)監(jiān)視做為防火墻其安全性為最佳,但配置比較復雜,且網(wǎng)絡速度較慢。
1、單宿主堡壘主機
是單臺服務器有防火墻,只為單臺服務器防護。
2、雙宿主堡壘主機
雙宿主堡壘主機是一臺裝有兩塊網(wǎng)卡的堡壘主機,一般這臺堡壘主機應用在網(wǎng)關(guān),防護局域網(wǎng)跟廣域網(wǎng)之間通信等安全。
3、三宿主堡壘主機
三宿主堡壘主機是一臺裝有三塊網(wǎng)卡的堡壘主機,那么他將外網(wǎng),內(nèi)網(wǎng),DMZ 三個區(qū)域隔離開來,同時保護內(nèi)網(wǎng)已經(jīng)DMZ區(qū)域的安全等。
4、背靠背型
內(nèi)網(wǎng)、外網(wǎng)、DMZ區(qū)域都用單獨的防火墻分隔開
如下圖:
iptables/netfilter(官方網(wǎng)站,http://www.netfilter.org)
可以通過iptables系統(tǒng)服務命令對iptables進行關(guān)閉開啟和停止操作,看似iptables像是Linux上的一個服務,其實不是。
linux系統(tǒng)上的服務比如說httpd服務在啟動起來的時候,是不是在后臺啟動一個相應的服務進程且在網(wǎng)卡上監(jiān)聽一個端口,而iptables卻不然,那么iptables到底是什么呢?其實iptables只是一個工具而已.我們的linux系統(tǒng)有用戶空間,和內(nèi)核空間,而iptables有兩個組件,一是netfilter, netfilter組件只是用來過濾防火墻規(guī)則,及作出相應的處理機制的,它是集成在內(nèi)核中的一部分,也就是說它是工作在內(nèi)核空間的,那么大家都知道用戶是不可能直接跟內(nèi)核空間打交道的,那么netfilter只是工作在內(nèi)核空間對規(guī)則進行處理的,那么規(guī)則從何而來呢? 是從iptables的第二個組件iptables而來的,我們上面說了iptables只是一個工作在用戶空間的一個工具而已,那么用戶就使用這個工具的一個命令來跟工作在內(nèi)核空間中的netfiter組件打交道的.其實iptables防火墻就是這樣的。
[root@WebServer ~]# /etc/init.d/iptables restart # 重啟iptables服務
[root@WebServer ~]# service iptables restart
[root@WebServer ~]# chkconfig iptables on # 設置開機自動啟動
iptables常用的表有三個,分別為 filter表 nat表 mangle表, 和五個鏈 INPUT鏈 OUTPUT鏈 FORWARE鏈 POSTROUTING鏈 PREROUTING鏈,下面來介紹下它們的各個功能:
1、iptables中的表
使用iptables -t 指定使用哪個表,不指定,默認使用filter表
2、iptables中的鏈
3、表和鏈的關(guān)聯(lián)
filter表
nat表
mangle表
4、數(shù)據(jù)包過濾流程
一張圖足以說明一切
iptables的狀態(tài)跟蹤連接有4種,分別是,NEW,ESTABLISHED,RELATED,INVALID,除了從本機出去的數(shù)據(jù)包有NAT表的OUTPUT鏈處理外,其他所有的狀態(tài)跟蹤都在NAT表中的PREROUTING鏈中處理,下面來說下4種狀態(tài)是什么,
NEW:新發(fā)出請求;連接追蹤模板中不存在此連接的相關(guān)信息條目,因此,將其識別為第一次發(fā)出的請求;ESTABLISHED:NEW狀態(tài)之后,連接追蹤模板中為其建立的條目失效之前期間內(nèi)所進行的通信狀態(tài);RELATED:相關(guān)聯(lián)的連接;如ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān)系;INVALID:無效的連接;UNTRACKED:未進行追蹤的連接;
1、規(guī)則管理
使用示例:
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 在INPUT鏈添加一條規(guī)則
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 在OUTPUT鏈添加一條規(guī)則
iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # 將INPUT鏈上的第二條規(guī)則替換
iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT # 將OUTPUT鏈第一條規(guī)則替換
2、鏈管理
使用示例:
iptables -t nat -F PREROUTING
iptables -t nat -F 清空nat表的所有鏈
3、默認規(guī)則管理
使用示例:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT # 設置這三條鏈上默認所有的數(shù)據(jù)包都drop掉
4、查看
5、條件匹配
條件匹配也可以使用 ! 取反
隱含擴展匹配
顯示擴展匹配
6、處理動作
使用示例:
iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
# 允許192.168.100.0/24網(wǎng)段的機器發(fā)送數(shù)據(jù)包從eth0網(wǎng)卡進入。如果數(shù)據(jù)包是tcp協(xié)議,而且目的端口是3128(因為REDIRECT已經(jīng)把80改為3128了,nat表的PREROUTING是在filter表的INPUT前面的),數(shù)據(jù)包的狀態(tài)必須是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,換句話說就是,允許客戶端機器向服務器發(fā)出鏈接申請。ESTABLISHED表示通過握手已經(jīng)建立起鏈接),通過。
iptables -A OUTPUT -o eth0 -d 192.168.100.0/24 -p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
# 數(shù)據(jù)包還得通過服務器,轉(zhuǎn)到內(nèi)網(wǎng)網(wǎng)卡上。請注意,這里,是squid幫你去訪問了你想要訪問的網(wǎng)站。所以在內(nèi)網(wǎng)中,你的機器是客戶端角色,而squid是服務器角色。這與剛才對外訪問的過程是不同的。所以在這里,源端口是3128,而不是32768:61000。
保存恢復規(guī)則:
iptables-save >
/PATH/TO/SOME_RULES_FILE
iptables-save >
/PATH/TO/SOME_RULES_FILE
可以將iptables的規(guī)則寫到某個文本文件中,在/etc/rc.d/rc.local中使用恢復規(guī)則。
當然,也可以直接寫iptables腳本,開機自動加載
幾個iptables腳本實例:
(1)利用iptables做nat,開放ftp數(shù)據(jù)傳輸,劃分DMZ區(qū)
#vim iptables.sh
#!/bin/bash
#
#定義變量
mynet=10.10.10.0
/24
myip=10.10.10.100
IPT=
/sbin/iptables
#加載ftp模塊
modprobe ip_conntrack-
ftp
modprobe ip_nat_ftp
#開啟路由轉(zhuǎn)發(fā)功能
echo
'1'
/proc/sys/net/ipv4/ip_forward
#清空所有表中的規(guī)則
$IPT -F
$IPT -t nat –F
$IPT -t mangle –F
#刪除所有自定義鏈
$IPT -X
$IPT -t nat -X
$IPT -t mangle –X
#設置默認策略
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD ACCEPT
#允許狀態(tài)為ESTABLISHED,RELATED的訪問本機,及狀態(tài)為NEW的從本機出去
$IPT -A INOUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允許本地環(huán)回口訪問
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
#允許管理員主機訪問本地ssh服務
$IPT -A INPUT -s $myip -m state --state NEW -p tcp --dport 22 -j ACCEPT
$IPT -A OUTPUT -d $myip -p tcp --sport 22 -j ACCEPT
#允許局域網(wǎng)的ping請求
$IPT -A INPUT -s $mynet -p icmp --icmp-
type
8 -j ACCEPT
$IPT -A OUTPUT -d $mynet -p icmp --icmp-
type
0 -j ACCEPT
#為局域網(wǎng)做SNAT
$IPT -t nat -A POSTROUTING -s $mynet -j SNAT --to-
source
222.95.1.97
#為局域網(wǎng)內(nèi)部的web服務器做DNAT
$IPT -t nat -A PREROUTING -d 222.95.1.97 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.1
(2)Web服務器常用iptables配置
iptables -F
iptables -X
iptables -F -t mangle
iptables -t mangle -X
iptables -F -t nat
iptables -t nat -X
# 首先,把三個表清空,把自建的規(guī)則清空。
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
# 設定INPUT、OUTPUT的默認策略為DROP,F(xiàn)ORWARD為ACCEPT。
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 先把“回環(huán)”打開,以免有不必要的麻煩。
iptables -A INPUT -i eth -p icmp --icmp-
type
8 -j ACCEPT
iptables -A OUTPUT -o eth -p icmp --icmp-
type
0 -j ACCEPT
# 在所有網(wǎng)卡上打開ping功能,便于維護和檢測。
iptables -A INPUT -i eth0 -s 192.168.100.250 -d 192.168.100.1 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.250 -s 192.168.100.1 -p tcp --sport 22 -j ACCEPT
# 打開22端口,允許遠程管理。(設定了很多的附加條件:管理機器IP必須是250,并且必須從eth0網(wǎng)卡進入)
iptables -A INPUT -i eth0 -s 192.168.100.0
/24
-p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.100.0
/24
-p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.168.0
/24
-p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.168.0
/24
-p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
這幾條語句比較麻煩,逐一介紹:
#iptables -A INPUT -i eth0 -s 192.168.100.0/24 -p tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
允許192.168.100.0
/24
網(wǎng)段的機器發(fā)送數(shù)據(jù)包從eth0網(wǎng)卡進入。如果數(shù)據(jù)包是tcp協(xié)議,而且目的端口是3128(因為REDIRECT已經(jīng)把80改為3128了。nat表的PREROUTING是在filter表的INPUT前面的),再而且,數(shù)據(jù)包的狀態(tài)必須是NEW或者ESTABLISHED的(NEW代表tcp三段式握手的“第一握”,換句話說就是,允許客戶端機器向服務器發(fā)出鏈接申請。ESTABLISHED表示通過握手已經(jīng)建立起鏈接),通過。
#iptables -A OUTPUT -o eth2 -p tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
我們先來看這一句?,F(xiàn)在你的數(shù)據(jù)包已經(jīng)進入到linux服務器防火墻上來了。squid需要代替你去訪問,所以這時,服務器就成了客戶端的角色,所以它要使用32768到61000的私有端口進行訪問。(大家會奇怪應該是1024到65535吧。其實CentOS版的linux所定義的私有端口是32768到61000的,你可以通過
cat
/proc/sys/net/ipv4/ip_local_port_range
,查看一下。)再次聲明:這里是squid以客戶端的身份去訪問其他的服務器,所以這里的源端口是32768:61000,而不是3128!
#iptables -A INPUT -i eth2 -p tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
當然了,數(shù)據(jù)有去就有回。
#iptables -A OUTPUT -o eth0 -d 192.168.100.0
/24
-p tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
數(shù)據(jù)包還得通過服務器,轉(zhuǎn)到內(nèi)網(wǎng)網(wǎng)卡上。請注意,這里,是squid幫你去訪問了你想要訪問的網(wǎng)站。所以在內(nèi)網(wǎng)中,你的機器是客戶端角色,而squid是服務器角色。這與剛才對外訪問的過程是不同的。所以在這里,源端口是3128,而不是32768:61000。
iptables -A OUTPUT -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --sport 53 -j ACCEPT
?!‘斎唬珼NS是不可缺少的。
iptables -A INPUT -i eth -p tcp --dport 80 -j LOG --log-prefix
'iptables_80_alert'
--log-level info
iptables -A INPUT -i eth -p tcp --dport 21 -j LOG --log-prefix
'iptables_21_alert'
--log-level info
iptables -A INPUT -i eth -p tcp --dport 22 -j LOG --log-prefix
'iptables_22_alert'
--log-level info
iptables -A INPUT -i eth -p tcp --dport 25 -j LOG --log-prefix
'iptables_25_alert'
--log-level info
iptables -A INPUT -i eth -p icmp --icmp-
type
8 -j LOG --log-prefix
'iptables_icmp8_alert'
--log-level info
?!∮涗浫罩?/span>
(3)iptables 禁ping腳本
#!/bin/bash
iptables -F
iptables -F -t nat
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A INPUT -p icmp --icmp-
type
0 -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-
type
8 -j ACCEPT
(4)iptables 做web防火墻腳本
#!/bin/bash
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -nv -L
測試掃描端口
nmap -sT 192.168.18.254
(5)iptables 做vsftp防火墻腳本
#!/bin/bash
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD ACCEPT
#load connection-tracking modules
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -nv -L
(6)iptables 做mail防火墻腳本
#!/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 -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 122.70.121.XXX -j ACCEPT
iptables -A INPUT -s 122.70.121.XXX -j ACCEPT
iptables -A INPUT -s 122.70.121.XXX -j ACCEPT
iptables -N synflood
iptables -A synflood -m limit --limit 10
/s
--limit-burst 100 -j RETURN
iptables -A synflood -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state NEW -j synflood
iptables -A INPUT -p icmp --icmp-
type
echo
-request -m limit --limit 1
/s
--limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-
type
echo
-request -j DROP
iptables -A INPUT -p tcp -m multiport --dport 80,22,8080,3306,5666,110,143,25,443 -j ACCEPT
測試:
端口掃描
nmap -P0 -sS 214.26.73.x
(7)iptables 做nat路由器腳本
#!/bin/bash
echo
'1'
>
/proc/sys/net/ipv4/ip_forward
arp -f
/root/mac
.txt
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F INPUT
iptables -F FORWARD
iptables -F POSTROUTING -t nat
iptables -p FORWARD DROP
#客戶機綁定mac地址才能上網(wǎng),這樣防止惡意增加IP在公司內(nèi)部上網(wǎng),引起不安全隱患
cat
/root/mac
.txt |
while
read
LINE
do
ipaddress=`
echo
$LINE |
awk
'{print $1}'
`
macaddress=`
echo
$LINE |
awk
'{print $2}'
`
iptables -A FORWARD -s $ipaddress -m mac --mac-
source
$macaddress -j ACCEPT
done
#網(wǎng)關(guān)上有幾塊網(wǎng)卡,eth0接的是外網(wǎng)IP地址,eth1、eth2等對應該局域網(wǎng)IP,因是租用了電信的光纖,不存在著ADSL上網(wǎng)情況
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0
/24
-j SNAT --to 59.195.233.234
#iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
cat
/root/mac
.txt
192.168.1.50 00:16:D3:F6:BD:F5
192.168.1.57 00:16:36:B4:6C:5D
讓下次開機自動加載腳本
[root@localhost ~]
# echo '/bin/bash /root/shell/iptables.sh' >> /etc/rc.local
本文出自 “汪立明” 博客
原文鏈接:http://afterdawn.blog.51cto.com/7503144/1877782
完
聯(lián)系客服