iptables基本知識
防火牆可分為
網絡防火牆
主機防火牆
大緻定義:工作在網絡或主機邊緣,對于進出的封包,根據事先定義好的規則做檢查,将那些能夠比對到的封包做出相應處理的元件。元件既可以是硬體也可以是軟體。
Iptables是應用程式
Iptables:編寫規則的工具(檢查文法送往netfilter)
Netfilter:網絡過濾器,核心中工作在TCP/IP網絡協定棧上的架構。工作在核心中的架構,真正起到防範功能作用的
PS:要防火的關鍵是規則,而不是這些元件,元件根據規則來進行工作
路由發生時刻:
1、 封包進入本機,判斷目标位址
2、 封包離開本機,判斷經由那個接口發出
Hooks function 鈎子函數,即5個鍊
Prerouting:進入本機後,路由發生前
Input:到達本機内部
Output:由本機發出
Forwar:由本機轉發
postrouting:路由功能發生之後,離開本機之前
封包流向經由的位置
1、 到本機内部:prerouting、input
2、 由本機發出:output、postrouting
3、 由本機轉發:prerouting、forward、postrouting
規則的功能(表)
過濾 filter
位址轉換 NAT
mangle 修改封包中的某些資訊(除位址之外)
raw 關閉NAT表上啟用的連接配接追蹤功能
每個表發生在不同的鍊上
filter:input、output、forward
NAT:prerouting、output、postrouting
mangle:prerouting、input、forward、output、postrouting
RAW:prerouting、output
Iptables:每個鈎子上可放置N條規則,對應每個鈎子上的多條規則稱之為鍊(chain)
每個功能由多個鍊組成,稱之為表
鍊:鍊上的規則次序即為檢查次序,是以有一定規律
同類規則,比對小的放上面
不同規則,比對封包幾率較大的放上面
應該設定預設規則
Iptables的四表五鍊添加規則時的考量點
實作的功能,判斷在那個表上
封包的流向及經由路由,判斷在哪個鍊上
功能優先級,從高到低
raw --> mangle --> NAT --> filter
規則的組成部分:封包的比對條件,比對如何處理
比對條件:基本比對、擴充比對
如何處理:内建機制處理、自定義處理機制(自定義的鍊)
Iptables是規則管理工具,能夠自動檢查規則文法
規則和鍊有計數器:
pkts:由規則或鍊比對到的資料封包個數
bytes:由規則或鍊比對到的資料封包大小總和
通過iptables指令生成規則送往netfilter
規則通過核心接口送往核心,是以會立即生效,但不會永久生效
期望永久生效,需要儲存在配置檔案中,此檔案需開機自動加載或手動加載
文法格式:
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
TARGET:
-j jump跳轉目标,内置:
ACCEPT 允許資料報通過
DROP 直接丢棄
REJECT 拒絕并發包通知對方
-t TABLE:
預設是filter,四表:filter nat mangle raw
SUBCOMMAND:
鍊:
-F flush,清空指定表上指定鍊的規則,省略鍊名時,則清空指定表上所有規則
-N new,建立一個使用者自定義鍊,自定義鍊隻能作為預設鍊的引用
-X drop,删除使用者自定義的鍊(内容為空),内置鍊不可删除
-Z zero,清空計數器,每個鍊上的每條規則都有計數器,記錄比對到的封包數量、大小
-P policy,設定預設規則,當所有規則都無法比對或比對到無法做出有效處理機制,則按預設規則處理
-E rename,自定義鍊重命名,已經被引用的自定義鍊無法被重命名
規則:
-A append,鍊尾追加規則
-I insert,在指定位置插入一條規則
-D delete,删除指定規則
-R replace,替換指定規則
檢視:
-L list,列對外連結上所有規則
-n numeric,以數字格式顯示位址和端口号,即不反解
-v verbose,詳細格式,顯示規則的詳細情況,包括計數器等
-vv 更加詳細
-vvv 比vv還要詳細
--line-numbers 顯示規則編号
-x exactly 顯示計數器的精确值
pkts bytes target prot opt in out source destination
pkts 比對到的封包數量
bytes 比對到的所有的資料報大小之和
target 處理目标,(目标可以是自定義的鍊)
port 協定{tcp udp icmp}
opt 可選項
in 資料報流入接口
out 資料報流出接口
source 源位址
destination 目的位址
CRETERIA比對條件
檢查IP首部,檢查tcp、udp或ICMP首部
基于擴充機制,也可以基于額外的機制,如連接配接追蹤
注意:可以同時制定多個條件,意味着同時比對多個條件才行
比對條件:
通用比對
擴充比對
隐式擴充
顯示擴充
通用比對:
-s 檢查封包中的源IP位址; ! 取反
-d 檢查封包中的目标IP位址
-p 檢查封包中的協定,TCP UDP ICMP
-i 資料封包流入接口,通常用在prerouting input forward鍊上
-o 資料封包流出接口,通常用在forward output postrouting鍊上
擴充比對:使用iptables的子產品實作擴充檢查機制
隐式擴充:如果在通用比對上使用-p 指定協定的話,那麼-m選項指明擴充則變得可有可無
TCP
--dport 目标端口
--sport 源端口
--tcp-flags LIST1 LIST2 ;LIST1是要檢查的标志位,LIST2是LIST1中出現過的,其标志位為1,其他的全都為0
如:--tcp-flags syn,ack,fin,rst syn 意思就是檢查syn,ack,fin,rst幾個标志位,其中syn要為1,ack,fin,rst全都為0。即第一次建立連接配接,有一個專門選項—syn
--syn 三次握手低第一次,即建立連接配接
UDP
--dport
--sport
ICMP
--icmp-type
8 echo request 請求
0 echo reply 響應
如:
iptables -A INPUT -s 192.168.202.0/24 -d 172.20.1.10 -p tcp --dport 80 -j ACCEPT
顯示擴充 必須指明使用的擴充機制
-m 子產品名稱,-m必須寫
檢視有哪些子產品可用rpm -ql iptables ,消息.so結尾的都是擴充子產品
multiport擴充:以離散端口比對多端口,最多可同時制定15個端口
專用選項:
--sports --source-ports PORT[,PORT…]
--dports --destination-ports PORT[,PORT…]
-ports PORT[,PORT…]
iptables -A INPUT -d 172.20.1.10 -p tcp -m multiport --dports 80,22,443 -j ACCEPT
iprange擴充:指定連續的IP範圍,用于比對非整個網絡
--src-range IP[-IP]
--dst-range IP[-IP]
iptables -A INPUT -d 172.20.1.10 -p tcp –dport 23 -m multiport --src-range 192.168.1.50-192.168.1.100 -j REJECT
string擴充:檢查封包中出現的字元串,與給定的字元串做比對
字元串比對檢查算法:kmp bm
--algo {kmp|bm} 指定算法
--string “STRING” 搜尋指定字元串
--hex-string “HEX_STRING” 編碼成16進制的字元
iptables -I OUTPUT -s 172.20.1.10 -p tcp --dport 80 -m string –string “sex” --algo kmp -j REJECT
time擴充:基于時間區間做通路控制
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]]
--datestop YYYY[-MM][-DD][hh[:mm[:ss]]]
--timestart
--timestop
--weekdays DAY1,[DAY2,…]
iptables -I INPUT -d 172.20.1.10 -p tcp –dport 80 -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fir -j REJECT
connlimit擴充:基于連接配接數做限制,對每個IP能夠發起的并發連接配接數做限制(單個IP)
專用選項:
--connlimit-above [N]
如:(限制連接配接1.10 的22端口4個連接配接,如果到5個或超過5個連接配接則被拒絕)
iptables -I INPUT -d 172.20.1.10 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
limit擴充:基于發包速率做限制
--limit N[/second|/minute|/hour|/day] 每個時刻最多幾個包
--limit-burst N 限制某一時刻突發量最多有幾個包(像一個令牌桶)
如:每分鐘允許10個ping包,突發5個包被允許,超出的按别的規則或預設政策
iptables -I INPUT -d 172.20.1.10 -p icmp --icmp-type 8 -m limit 10/minute –limit-burst 5 -j ACCEPT
實作的效果是:前四個包正常,從第五個開始,我們每6秒鐘收到一個正常的回應
stat擴充:啟用連接配接追蹤模闆記錄連接配接,并根據連接配接比對連接配接狀态的擴充
啟用連接配接追蹤功能之前,隻能稱之為簡單的包過濾防火牆,開啟了連接配接追蹤之後則成為帶狀态監測的包過濾防火牆
connection template 連接配接追蹤模闆,用于記錄各連接配接及相關狀态,基于IP實作,與協定無關,通過倒計時的方式删除條目
記錄連接配接的狀态:
NEW:建立連接配接,連接配接追蹤模闆中無相對應的條目時,用戶端第一次送出請求
ESTABLISHED:NEW狀态之後,距追蹤模闆中的條目删除之前所進行的通信都是established狀态
RELATED:相關的連接配接。入FTP協定中指令連接配接與資料連接配接就是相關聯的連接配接
INVALIED:無法識别的狀态
--stat {NEW|ESTABLISHED|RELATED|INVALIED}
iptables -I INPUT -d 172.20.1.10 -p tcp -m multiport --dports 21,22,80,443 -m stat --stat NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 172.20.1.10 -m stat --stat RELATED,ESTABLISHED -j ACCEPT
啟用stat子產品連接配接追蹤,占用的是系統核心的記憶體,可以存放最大條目數:
/proc/sys/net/nf_conntrack_max
調整連接配接追蹤模闆中存放的最大條目數
echo “N” > /proc/sys/net/nf_conntrack_max或sysctl -w net.nf_conntrack_max=”N”
永久生效則需要寫入/etc/sysctl.conf
檢視目前追蹤的所有連接配接
cat /proc/net/nf_conntrack
lsmod指令可以顯示已經加載到核心中的所有子產品資訊,如果不想啟用連接配接追蹤,則需要解除安裝子產品(modprobe)
不同協定或連接配接類型預設的追蹤時長
/porc/sys/net/netfilter/*
放行被動模式下的FTP服務
1、裝載核心子產品
modprobe nf_conntrack_ftp (ftp的追蹤子產品)
2、放行請求封包
放行入站請求端口為21的請求封包
放行所有狀态為ESTABLISHED和RELATED的入站封包
3、放行出站封包
放行所有狀态為ESTABLISHED的出站封包
一旦啟用連接配接追蹤功能nf_conntrack子產品則會自動裝載;不過nf_conntrack_ftp子產品需手動裝載
儲存iptables規則
1、service iptables save
/etc/sysconfig/iptables(預設儲存位置)
2、iptables-save > /PATH/TO/SOMEFILE
載入規則
1、service iptables reload
2、iptables-relstore < /PATH/TO/SOMEFILE