防火牆一般是指由軟體和硬體裝置組合而成、在内部網和外部網之間、專用網與公共網之間的界面上構造的保護屏障,通過設定防火牆規則來保護我們的内網。
防火牆的類型有兩種:
1,網絡層的包過濾防火牆:
工作在網絡層,可以定義特定的規則禁止或允許某些特定的資料包通過,例如利用封裝包的多樣屬性進行過濾:來源ip,目的ip,來源端口号,目的端口号,通信協定等。
2,應用層防火牆
工作在應用層,應用層防火牆可以攔截進出某應用程式(例如qq,迅雷等)的所有封包,并且封鎖其他的封包(通常是直接将封包丢棄)。
什麼是iptables呢?
它是一種基于包過濾的防護牆,已經靜态編譯進了kernel中,需要linux kernel 2.4以上的版本支援。但是,可以通過給kernel打更新檔,使我們的iptables具有應用層防火牆的功能。
下面是包過濾防火牆的相關原理及配置:
包過濾防火牆一般包含有3個表(還有一個raw表):
1,filter table:過濾表(預設使用的就是filter表)
包含三個鍊:
INPUT:處理輸入資料包
FORWARD:處理轉發資料包
OUTPUT:處理輸出資料包
2,NAT table:用于網絡位址轉換
POSTROUTING:處理路由後的資料包
OUTPUT :處理輸出資料包
PREROUTING:處理路由前的資料包
3,mangle table:矯正表,針對政策路由(不做講解)
我們用下圖來說明iptables的工作原理(netfilter的原理):
首先,我們要知道:iptables隻是linux使用者态下的指令行前台程式,用于操作netfilter,而netfilter真正完成核心态下的資料包的過濾處理。我們可以認為iptables完成了這些工作。
TCP/IP是内置在kernel中的,而iptables又工作在網絡層,故包過濾是在kernel空間中實作的。如果目的ip是本機的話,即從kernel空間轉到使用者空間,進行處理。如果通路的不是本機,則不進入使用者空間,直接在kernel空間進行處理。TCP/IP是在記憶體中完成工作,而使用者空間中的工作也是在記憶體中。故記憶體也是分區的,一部分用于使用者空間,另一部分用于核心空間。
<a href="http://blog.51cto.com/attachment/201203/220339201.jpg" target="_blank"></a>
netfilter通過自己的五個鈎子函數,來實作包過濾,而五個鈎子函數分别應用在如圖所示的五個地方,五個鈎子函數為:
1, NF_IP_LOCAL_IN
2, NF_IP_LOCAL_OUT
3, NF_IP_FORWARD
4, NF_IP_PRE_ROUTING
5, NF_IP_POST_ROUTING
1, filter table:
filter表格不會對資料報進行修改,而隻對資料報進行過濾,它是通過鈎子函數NF_IP_LOCAL_IN, NF_IP_FORWARD及NF_IP_LOCAL_OUT來實作過濾。
2,NAT table:
監聽三個Netfilter鈎子函數:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及NF_IP_LOCAL_OUT。 NF_IP_PRE_ROUTING實作對需要轉發的資料報的源位址進行位址轉換而NF_IP_POST_ROUTING則對需要轉發的資料包的目的位址進行位址轉換。對于本地資料報的目的位址的轉換則由NF_IP_LOCAL_OUT來實作
3, mangle table:
在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT中監聽。使用mangle表,可以實作對資料報的修改或給資料報附上一些帶外資料。
而對與iptables的規則,優先級和規則的寫入順序是非常重要的:
處理優先級:mangle>nat>filter
規則:從上到下進行比對,比對到了就不在向下繼續比對
iptables的用法:(規則的順序是非常重要的,下面的例子隻是說明相對應指令的用法)
1, iptables的指令文法:
# iptables [-t table] sub_command [chain] [num] [cretiria] [-j acction]
-t:用于指定要進行操作的表
filter :包過濾(預設表)
nat:nat轉換
mangle:政策路由
sub_command:子指令
-A:在所選擇的鍊末尾添加一條規則
例:iptables –t filter –A INPUT –j ACCEPT
在filter表的INPUT鍊追加一條規則配置所有通路本地的資料包,比對後丢棄
-D:從所選鍊中删除一條規則。有兩種方法:把被删除規則指定為鍊中的序号(第一條序号為1),或者指定為要比對的規則内容;
例:iptables –D INPUT 1 (不寫-t,預設是對filter表操作)
删除filter表的INPUT鍊的第一條規則
iptables –D INPUT –s 192.168.0.1 –j DROP
删除filter表中INPUT鍊内容為” –s 192.168.0.1 –j DROP”的規則
-R:從選中的鍊中替換一條規則。規則序号從1開始;
例:iptables –R INPUT 3 –j ACCEPT
将原來的第三條規則内容替換成”-j ACCEPT”
-I:根據給出的規則序号,向所選鍊中插入一條規則。預設插入成第一條規則
例:iptables –I INPUT –j DROP
在filter表的INPUT鍊插入一條規則,插入成第一條
iptables -I INPUT 3 -j DROP
在filter表的INPUT鍊插入一條規則,插入成第三條
-F:清空所選鍊的所有規則(不包括預設規則)
例:iptables –t flter –F INPUT
清空filter表INPUT鍊中所有規則
iptables –F
清空filter表中所有規則
-N:建立自定義的鍊
例:iptables -N clean_in
在filter表上建立一個新鍊clean_in
-X :删除使用者自定義的空鍊,若不空,先清空,再删
例:iptables –X clean_in
-P:設定鍊的預設規則,即資料包在規則中都沒有比對到,就用預設規則處理(預設情況下,鍊的預設規則都死ACCEPT)
例:iptables –P INPUT DROP
設定filter表INPUT鍊預設規則為DROP(丢棄)
iptables –P INPUT REJECT (直接拒絕)
iptables –P INPUT ACCEPT (接受)
檢視指令:
-L:顯示所選表的所有鍊的所有規則
例:iptables –L
顯示filter表中所有鍊的所有規則
-n :隻顯示IP位址,不反解析成FQDN,一般與-L合用
例:iptables –L –n
-v:顯示詳細資訊
例:iptables -t nat –L -vn
顯示nat表所有鍊的詳細資訊
-x:顯示精确值,不進行機關換算
--line-numbers:顯示的時候顯示規則的行号
例:iptables -L -n --line-numbers
cretiria(比對條件):
通用比對:
-s IP/network 表示某ip包的源位址
-s ! IP/network 取反
-d IP/network 表示目标IP
-d ! IP/network 取反
-i interface (input interface)流入接口
-o interface (output interface)流出接口
擴充比對:
隐式擴充:一般指對-p選項中指定的協定進行擴充
-p (tcp|udp|icmp)指定協定
--sport 指定源端口
可以指定一個端口範圍,用:隔開
例:--sport 1000:3000 比對源端口1000到3000的資料包
--dport 指定目的端口
例:iptables –P INPUT DROP
iptables –A INPUT -d 1.1.1.1 -p tcp --dport 80 –j ACCEPT
這兩條意思為:僅允許任意主機通路本機1.1.1.1的web服務
如果指定的是icmp協定的話,有如下的類型:
-p icmp –icmp-type 8
指定icmp的請求包
-p icmp –icmp-type 0
指定icmp的應答包
例:iptables –A INPUT –s 192.168.1.0/24 –d 1.1.1.1 –p icmp –icmp-type 8 –j DROP
禁止192.168.1.0網絡的主機ping主機1.1.1.1
顯式擴充:一般必須指定-m選項明确指定要加載的擴充
-j TARGET 調轉到指定的目标進行處理
ACCEPT 直接接受
DROP 直接丢棄
REJECT 指接拒絕
state:連接配接狀态
--state state
NEW:表示是建立立的連接配接請求
#iptables –A OUTPUT –o eth1 –m state --state NEW –j DROP
禁止本機發送建立連接配接的請求
ESTABLISHED :表示所有已建立的連接配接
#iptables –P OUTPUT DROP
#iptables –A OUTPUT –s 172.16.100.1 –m state --state ESTABLISHED –j ACCEPT
這兩條的意思為:僅允許本機回應狀态是已建立連接配接的請求
iptables –P INPUT DROP
iptables –A INPUT –d 172.16.100.1 –p tcp --dport 80 –m state --state NEW,ESTABLISHED –j ACCPT
這兩條的意思為:允許目标位址是172.16.100.1,目标端口是80,狀态是建立和已建立連接配接的請求進入
RELATED: 主要用于ftp服務;
INVALIED: 無法識别的狀态
多端口比對:
-m(mport|multiport) 多端口比對
--source-ports [!] port,port,port... 源端口,加“!”取反
--desrination-ports [!] port,port,port... 目标端口
--ports [!] port,port,port... 多個端口,用“,”隔開
--ports:表示源和目的端口
例:iptables -P INPUT DROP
iptables -A INPUT -d 172.16.100.1 -p tcp -m mport --destination-ports 80,22,23 -m state --state NEW,ESTABLISHED -j ACCEPT
隻允許使用tcp協定,目标端口是80,22,23,狀态是建立和已建立的連接配接的請求進入
多位址比對:
-m iprange IP位址範圍的擴充,指定了如何限定某個特定位址範圍内的IP
[!] --src-range ip-ip
[!] --dst-range ip-ip
例:iptables -A INPUT -d 172.16.100.1 -m iprange --src-range 192.16.1.9-192.168.1.200 -p tcp --dport 80 -m state --state NEW -j DROP
不允許192.16.1.9到192.168.1.200範圍内的主機通路172.16.100.1主機的web服務
connlimit:用于限制某個位址并發連接配接請求的個數
[!] --connlimit-above n 放行沒超出範圍的
limit:資料包的發送速率的限制
--limit rate 平均每機關時間内比對多少個資料包
--limit-burst number 預設是5,峰值,突發限制數量的上限
例:
對進來的資料包接受目标位址是172.16.100.1目标端口是80的請求,每秒隻能有1個,最大并發請求量為3個
# iptables -I INPUT 1 -p tcp -d 172.16.100.1 --dport 80 -j ACCEPT
# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
# iptables -R INPUT 1 -d 172.16.100.1 -p tcp --dport 80 -m limit --limit 10/second --limit-burst 30 -j ACCEPT
-m time:用于指定在什麼時間段放行請求:
--timestart value
--timestop value
--days listofdays (format: Mon, Tue, Wed, Thu, Fri, Sat, Sun ; default everyday)
--datestart date
--datestop date ( format: YYYY[:MM[:DD[:hh[:ss]]]] )
2月18日-26日,每天的8:30到14:30之間能通路web服務:
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m time --timestart 08:30:00 --timestop 14:30:00 --datestart 2012:02:18 --datestop 2012:02:26 -j ACCEPT
-m string:做字元串比對(對中文的比對非常有限)
--algo bm|kmp 比對算法,這個是一個應用層的算法
--string pattern
由于在網頁上顯示的内容,是經過編碼的,故要使用某一個字算法把對應的字元串編碼之後再進行比對。這兩個選項都是必須的
允許請求中,如果有通路Web的都不允許通路:
# iptables -A OUTPUT -s 172.16.100.1 -p tcp --sport 80 -m --algo bm --string "web" -j DROP
下面是利用iptables實作網絡位址轉換,需要對NAT表進行操作:
SNAT:源位址轉換,實作代理内網用戶端通路網際網路的
--to-source ipaddr(, ipaddr, ipaddr...)
轉換到的某個源位址上(當有多個網關時,指定多個源位址才有意義)
例:iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m iprange -src-range 192.168.10.1-192.168.10.100 -j SNAT --to-source 1.1.1.1
将192.168.10.1-192.168.10.100網段資料包的源位址轉換成1.1.1.1來通路外網
MASQUERADE: 位址僞裝,目前主機自動選一個能夠通路網際網路的ip位址作為SNAT。是以不用使用--to-source了。若位址是靜态獲得的,一定不要使用這個,因為效率比較低。
例:iptables -t nat -A POSTROUTING -m iprange --src-range 192.168.100.1-192.168.100.100 -j MASQUERADE
DNAT:目标位址轉換,可以實作多個伺服器通過一個公網位址提供服務,并能保證安全性
--to-destination
例:iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.6(:8080)
當有使用者通路1.1.1.1主機的80端口時,把請求裝換成通路内網主機192.168.10.6的8080端口
啟動iptables服務:
#service iptables start|stop|restart
iptables本身定義的規則立即生效,但是重新開機iptables服務就會失效。故要用
#service iptables save 來儲存規則,這樣會永久生效,規則會寫在/etc/sysconfig/iptables
項目:如下圖所示,192.168.1.0/24是“狼窩”,在要求為172.16.x.1寫規則,滿足以下求:
1、filter表所有連結的預設規則為DROP;
2、lo接口上進出的所有資料包均放行;
3、Web和ssh開放給非“狼窩”的主機;
1)ssh僅允許在工作時間(每周一至周五的9:00-18:00)被通路,但172.16.0.0/16網絡中的主機可在任意時段通路;
2)web服務全時段可被通路,但每秒種接收的新請求的個數不能超過100個;
4、發往本機的ping請求,每秒隻響應兩個資料包,且最高每秒隻響應3個;拒絕來自“狼窩”的ping請求;本機可向任意主機發送Ping請求;
5、本機出口僅将已經建立的連接配接放行;
<a href="http://blog.51cto.com/attachment/201203/220311916.jpg" target="_blank"></a>
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
# iptables -i lo -j ACCEPT
# iptables -o lo -j ACCEPT
# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -j clean_in
# iptables -A INPUT -s 192.168.1.0/24 -d 172.16.100.1 -j DROP
# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -j ACCEPT
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m time --timestart 09:00:00 --timestop 18:00:00 --days Mon,Tue,Wed,Thu,Fri -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 172.16.100.1 -p ICMP --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
# iptables -A INPUT -d 172.16.100.1 -p ICMP --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.1 -p ICMP --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.1 -p ICMP --icmp-type 8 -j ACCEPT
# iptables -N clean_in
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.100.1 -j RETURN
本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/816182,如需轉載請自行聯系原作者