一.防火牆是什麼? web
防火牆分爲網絡防火牆和應用層防火牆 算法
網絡防火牆就是一個位於計算機和它所鏈接的網絡之間的防火牆。 服務器
2.應用層防火牆 網絡
應用層防火牆是在 TCP/IP 堆棧的"應用層"上運做,應用層防火牆能夠攔截進出某應用程序的全部封包,而且封鎖其餘的封包(一般是直接將封包丟棄)。 架構
總之應用層防火牆的算法會更復雜,過慮更爲嚴格,因此在部署防火牆的時候,要把應用層防火牆部署到網絡防火牆的裏邊。 app
二.iptables的錶鏈結構 tcp
1.iptables介紹 工具
平時說iptables是防火牆,其實iptables是iptables/netfilter組合中的一個,只有iptables/netfilter才應該叫作防火牆,它是基於軟件方式工做的網絡防火牆。iptables工做於用戶空間,是防火牆的規則編寫工具,使用iptables編寫規則而且發送到netfilter;防火牆的規則剛放到netfilter中,它是一個可以讓規則生效的網絡架構,工做於內核空間。 post
iptables是由四表五鏈組成的。 spa
四表的優先級: raw表 > mangle表 > nat表 > filter表
RAW表只使用在PREROUTING鏈和OUTPUT鏈上,由於優先級最高,從而能夠對收到的數據包在鏈接跟蹤前進行處理。 raw內含有兩個鏈:PREROUTING和OUTPUT
mangle表通常是對數據包進行修改用的, mangle表中含五個鏈:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat表內含三個鏈:PREROUTING、POSTROUTING、OUTPUT
filter表內含三個鏈:INPUT、FORWARD、OUTPUT
五鏈
PREROUTING, INPUT, OUTPUT, FORWARD, POSTROUTING
三.規則的屬性定義:
1.網絡層協議
主要集中在ip協議報文上
2.傳輸層協議屬性:
主要集中在
tcp
udp
icmp icmp其並非真正意義傳輸層的,而是工做在網絡層和傳輸層之間的一種特殊的協議
3.ip報文的屬性:
IP報文的屬性爲: 源地址.目標地址
4.iptables規則匹配
iptables如何查看錶和鏈
大寫字母選項:能夠實現某種功能,好比添加刪除清空規則鏈;
小寫字母選項:用來匹配及其餘;
-L :list 列表
-n :數字格式顯示ip和端口;
--line-numbers:顯示行號;
-x : 顯示精確值,不要作單位換算;
-t : 指定表
-t{fillter|nat|mangle|raw}
-v : 顯示詳細信息 -v -vvv -vvvv ..能夠顯示更詳細的信息
5.其餘子命令:
管理鏈:
-F :清空鏈
清空nat表中的input鏈,格式以下:
#iptables-t nat -F INPUT
#清空fllter表全部鏈:
#iptables-F
-P : 設定默認策略,爲指定鏈設置默認策略,格式以下:
#設置fllter表input鏈的默認規則爲丟棄
iptables-t fllter -P INPUT DROP
-N : 新建一條自定義鏈(內置鏈不能刪除,若是太多,能夠自定義鏈)
#自定義連只能被調用才能夠發揮做用
iptables-N fillter_web
-X : 刪除自定義空鏈,若是鏈內有規則,則沒法刪除
-Z :計算器清零
iptables-Z
-E :重命名自定義鏈
iptables管理規則:
-A :append附加規則,將新增的規則添加到鏈的尾部
-I[n] :插入爲第n條規則
-D : 刪除第n條規則
-R[n] : 替換第N條
表和鏈的對應關係:
fillter :INPUT FORWORD OUTPUT
nat : PREROUTING POSTROUTING OUTPUT
使用-t指定表來查看指定表內的規則:
#iptables-t nat -L -n
raw : prerouting output
iptables-t raw -L -n
mangle: prerouting input forword output postrouting
iptables-t mangle -L -n
#查看規則
[root@test3~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot optsource destination
Chain OUTPUT (policy ACCEPT)
target prot optsource destination
經過以上能夠觀察到,每個鏈都有默認策略:policy ACCEPT
一般只須要修改fllter表的默認策略便可,由此若是有報文請求來訪問本機的某個服務,那麼則會通過input鏈,所以進來的報文都是須要作過濾的,那麼出去的報文則不須要過濾,在有些特定的場所下也須要作過濾
因此寫規則的時候必須放將規則寫在正確鏈上,意義很是重大
規則和默認策略都有2個計數器,經過-v選項能夠觀察規則的匹配狀況
#iptables -t nat -L -n -v
編寫規則語法:
iptables [-t 表] 大寫選項子命令 [規則號] 鏈名 匹配標準 -j 目標(規則)
目標:
DROP : 丟棄
REJECT : 拒絕
ACCEPT : 接受
RETURN : 返回主鏈繼續匹配
REDIRECT: 端口重定向
MASQUERADE :地址假裝
DNAT : 目標地址轉換
SNAT :源地址轉換
MARK :打標籤
LOG
自定義鏈
匹配標準
iptables的匹配標準大體分爲兩類:
1.通用匹配
-s | --src | --source [!] IP/NETWORK
-d ------------------------
-i :指定數據報文流入接口 input prerouting forward
-o :指定數據報文流出接口 output postrouting forward
-p :明確說明只放行哪一種協議的報文匹配規則
以當前主機爲例:
凡是來自於某個ip段的網絡訪問本機
[root@test3xtables-1.4.7]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT
[root@test3 xtables-1.4.7]# iptables -L -n -v
ChainINPUT (policy ACCEPT 10 packets, 1029 bytes)
pkts bytestarget prot opt in out source destination
22 1660 ACCEPT all -- * * 10.0.10.0/24 10.0.10.0/24
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 16 packets, 1536 bytes)
pkts bytes target prot opt in out source destination
pkts 被本機報文所匹配的個數
bytes 報文全部大小記起來之和
opt 額外的選項,--表示沒有
target 處理機制
prot 放行哪一種協議
source 源地址
destination 目標地址
對於嚴謹的規則,通常默認規則都是拒絕未知,容許已知
以下所示:
只放行信任IP地址段,其餘所有禁止
iptables-P INPUT DORP
iptables-A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT
iptables-P OUTPUT DORP
iptables-A OUTPUT -d 10.0.10.0/24 -s 10.0.10.0/24-j ACCEPT
保存規則
[root@test3~]# /etc/init.d/iptables save
iptables:Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
保存規則至其餘文件
[root@test3~]# iptables-save > /tmp/iptables
加載iptables文件規則
[root@test3~]# iptables-resotre < /tmp/iptables
1.2.規則的替換
首先來查看規則
[root@test3 ~]# iptables -L -n --line-number
ChainINPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.0/24
ChainFORWARD (policy DROP)
num target prot opt source destination
ChainOUTPUT (policy ACCEPT)
num target prot opt source destination
替換規則:將規則1替換爲 eth0只可以經過某個網段進來
[root@test3~]# iptables -R INPUT 1 -s 10.0.10.0/24-d 10.0.10.62 -i eth0 -j ACCEPT
[root@test3~]# iptables -L -n --line-number
ChainINPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.62
2.擴展匹配
#全部的擴展匹配表示要使用-m來指定擴展的名稱來引用,而每一個擴展模塊通常都會有本身特有的專用選項,在這些選項中,有些是必備的:
2.1隱含擴展
以下所示:
#端口之間必須是連續的
-p tcp--sport|--dport 21-80
#取反,非21-80的端口
-p tcp--sport|--dport !21-80
#檢測報文中的標誌位
--tcp-flagsSYN,ACK,RST,FIN, SYN
ALL #表示爲全部標誌位
NONE #表示沒有任何一個標誌位
#--tcp-flags ALL NONE #表示全部標誌位都檢測,可是其中多有都爲0
#--tcp-flage ALL SYN,FIN #表示SYN,FIN都爲1(即握手又斷開)
#生成環境下tcp-flags 用的很是多,意義很是重要
例:放行本機對web的訪問
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -ptcp --dport 80 -j ACCEPT
[root@test3~]# iptables -L -n
ChainINPUT (policy DROP)
target prot opt source destination
ACCEPT all -- 10.0.10.0/24 10.0.10.62
ACCEPT tcp -- 0.0.0.0/0 10.0.10.62 tcp dpt:80
放行出去的報文,源端口爲80
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -j ACCEPT
查看匹配規則
[root@test3 ~]# iptables -L -n --line-number
ChainINPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.62
2 ACCEPT tcp -- 0.0.0.0/0 10.0.10.62 tcp dpt:80
ChainFORWARD (policy DROP)
num target prot opt source destination
ChainOUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 10.0.10.0/24 10.0.10.0/24
2 ACCEPT tcp -- 10.0.10.62 0.0.0.0/0 tcp spt:80
考慮要點:
(1)規則爲放行出去的響應報文
(2)考慮源IP地址爲本機,目標爲訪問的時候拆開報文才能夠獲知,而寫規則的時候是面向全部主機,因此這裏不用寫
(3)源端口:80 ,由於用戶訪問的時候必定會訪問其80端口,無可非議的
(4)目標端口:請求到來的時候事先沒法判定對方的端口是多少,因此不用寫
2.2協議匹配
一般對協議作匹配則使用 -p 參數 來指定協議便可
匹配UDP:UDP只有端口的匹配,沒有任何可用擴展,格式以下
-p udp--sport | --dport
匹配ICMP格式以下
-picmp --icmp-[number]
icmp常見類型:請求爲8(echo-request),響應爲0(echo-reply)
例:默認規則input output 都爲DROP,使其本機能ping(響應的報文)的報文出去
經過此機器去ping網關10.0.10.1 , 可結果卻提示not permitted,使其能通10.0.10.0/24網段中的全部主機
[root@test3~]#iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p icmp --icmp-type8 -j ACCEPT
可看到沒法響應:0表示響應進來的報文規則,並無放行本身做爲服務端的的角色規則
[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type0 -j ACCEPT
#ping 10.0.10.x
容許類型爲0(響應報文)出去
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -picmp --icmp-type 0 -j ACCEPT
例2:本機DNS服務器,要爲本地客戶端作遞歸查詢;iptables的input output默認爲drop 本機地址是10.0.10.62
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --dprot 53 -j ACCEPT
[root@test3~]# iptables -A OUTPUT -S 10.0.10.62 -p udp --sprot 53 -j ACCEPT
客戶端請求能夠進來,響應也能夠出去,可是本身做爲客戶端請求別人是沒有辦法出去的,因此:
[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p udp --dport 53 -j ACCEPT
[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --sprot 53 -j ACCEPT
若是爲tcp 則將以上udp改成tcp便可