您好,登錄后才能下訂單哦!
iptables
firewall:
主機防火墻
網絡防火墻
工作于主機或網絡的邊緣,對于進出的報文根據事先定義的規則作檢查,將那些能夠被規則所匹配到的報文作出相應處理的組件。
網絡防火墻:
專業的硬件防火墻:
checkpoint,netscreen
主機:
iptables: 程序
iptables:規則編寫工具
netfilter: 網絡過濾器, 內核中工作在TCP/IP網絡協議棧上的框架;
IDS:IntrusionDetecting System
NIDS
HIDS
IPS:Intrusion Protec System
HoneyPot: 蜜罐
kali,(backtrack)
OpenBSD:
ipfw
ipchains
iptables/netfilter
kernel,framework
hooksfunction:
prerouting: 進入本機后路由功能發生之前
input:到達本機內部
output: 由本機發出
forward: 由本機轉發
postrouting:路由功能發生之后,即將離開本機之前
路由發生的時刻:
報文進入本機后:
判斷目標地址
報文離開本機之前:
判斷經由哪個接口發出;
報文流向經由的位置:
到本內部:prerouting, input
由本機發出:output, postrouting
由本機轉發:prerouting, forward, postrouing
規則的功能:
過濾:firewall,
地址轉換:NAT Server
NetworkAddress Translation
mangle:修改報文首部中的某些信息
raw:關閉nat表上啟用的連接追蹤功能
filter:input,forward, output
nat:prerouting,output, postrouting
mangle:prerouting,input, forward, output, postrouting
raw:prerouting,output
iptables:每個鉤子函數上可放置n條規則;對應于每個鉤子上的多條規則就稱為一個鏈(CHAIN)
每個功能有多個鏈,所以,就稱作表;
鏈:鏈上的規則次序即為檢查次序,因此有一定的法則
(1) 同類規則,匹配范圍小的放上面;
(2) 不同類規則,匹配報文幾率較大的放上面;
(3) 應該設置默認策略;
iptables/netfilter
netfilter:framework in kernel
tcp/ip協議棧
iptables有四表五鏈
filter:input, forward, output
添加規則時的考量點:
(1) 要實現的功能:判斷添加在哪個表上;
(2) 報文流向及經由路徑:判斷添加在哪個鏈上;
功能的優先級:
由高而低:
raw--> mangle --> nat --> filter
規則的組成部分:
報文的匹配條件, 匹配之后如何處理
匹配條件:基本匹配條件、擴展匹配條件
如何處理:內建處理機制、自定義處理機制(自定義的鏈)
注意:報文不可能經由自定義鏈,只有在被內置鏈上的引用才能生效(即做為自定義目標)
iptables:規則管理工具
自動實現規則的語法檢查
規則和鏈有計數器:
pkts: 由規則或鏈匹配到的報文的個數;
bytes:由規則或鏈匹配到的所有報文大小之和;
鏈:應該有默認策略;
iptables命令生成規則,送往netfilter;
規則通過內核接口直接送至內核,因此,會立即生效。但不會永久有效;
如果期望有永久有效,需要保存至配置文件中,此文件還開機時加載和由用戶手工加載;
iptables[-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
-tTABLE:
默認為filter, 共有filter, nat, mangle, raw四個可用;
SUBCOMMAND:
鏈:
-F:flush,清空指定表的指定鏈上所有規則;省略鏈名時,清空表中的所有鏈;
例:
[root@localhost~]# iptables -F INPUT
[root@localhost~]# iptables -F OUTPUT
-N:new, 新建一個用戶自定義的鏈;自定義鏈只能作為默認鏈上的跳轉對象,即在默認鏈通過引用來生效自定義鏈;
例:
-X:drop,刪除用戶自定義的空鏈;非空自定義鏈和內置鏈無法刪除;
-Z:zero,將規則的計數器置0;
-P:policy,設置鏈的默認處理機制;當所有都無法匹配或有匹配有無法做出有效處理機制時,默認策略即生效;
filter表的可用策略:ACCEPT,DROP, REJECT
例:表明filter的表INPUT鏈默認為DROP
iptables-t filter -P INPUT DROP
-E:rename,重命名自定義鏈;
注意:被引用中的鏈,無法刪除和改名
規則:
-A:append,在鏈尾追加一條規則;
-I:insert,在指定位置插入一條規則;
-D:delete,刪除指定的規則;
-R:replace,替換指定的規則;
查看:
-L:list,列出指定鏈上的所有規則;
-n: numeric,以數字格式顯示地址和端口號,即不反解;
-v: verbose,詳細格式,顯示規則的詳細信息,包括規則計數器等;
-vv:
-vvv:
--line-numbers: 顯示規則編號;
可以顯示規則的編號
iptables -L -n --line-numbers
-x: exactly,顯示計數器的精確值;
pktsbytes target prot opt in out source destination
pkts: 被本規則所匹配到的包個數;
bytes:被本規則所匹配到的所包的大小之和;
target: 處理目標(目標可以為用戶自定義的鏈)
prot: 協議 {tcp,udp, icmp}
opt: 可選項
in: 數據包流入接口
out: 數據包流出接口
source: 源地址
destination: 目標地址;
CRETERIA: 匹配條件
檢查IP首部,檢查TCP、UDP或ICMP首部;
基于擴展機制,也可以進行額外的檢查;如做連接追蹤;
注意:可同時指定多個條件,默認多條件要同時被滿足;
匹配條件:
通用匹配:
[!] -s, --src, --source IP|Network:檢查報文中的源IP地址;
-d, --dst, --destination:檢查報文中的目標IP地址;
-p, --protocol:檢查報文中的協議,即ip首部中的protocols所標識的協議;tcp、udp或icmp三者之一;
-i, --in-interface:數據報文的流入接口;通常只用于PREROUTING, INPUT, FORWARD鏈上的規則;
-o, --out-interface:檢查報文的流出接口;通常只用于FORWARD, OUTPUT, POSTROUTING鏈上的規則;
例:替換第一條規則,檢查為tcp協議首部
iptables -t filter -R INPUT 1 -s 172.16.250.145 -d 172.16.249.139 -ptcp -j ACCEPT
添加一條icmp協議的
iptables -t filter -R INPUT 1 -s 172.16.250.145 -d 172.16.249.139 -picmp -j ACCEPT
例:將INPUT的默認策略改為DROP
iptables -t filter -P INPUTDROP
例將原先的第二條規則替換為以eth0端口進入的以icmp協議
[root@localhost ~]# iptables -R INPUT 2 -s 172.16.250.145 -d172.16.249.139 -p icmp -i eth0 -j ACCEPT
[root@localhost ~]# iptables -L -n -v --line-numbers
Chain INPUT (policy DROP 7 packets, 796 bytes)
num pkts bytes target prot opt in out source destination
1 1546 113K ACCEPT tcp -- * * 172.16.250.145 172.16.249.139
2 0 0 ACCEPT icmp -- eth0 * 172.16.250.145 172.16.249.139
擴展匹配:使用iptables的模塊實現擴展性檢查機制
隱式擴展:如果在通用匹配上使用-p選項指明了協議的話,則使用-m選項指明對其協議的擴展就變得可有可無了;
tcp:
--dportPORT[-PORT]
--sport
--tcp-flagsLIST1 LIST2
LIST1: 要檢查的標志位;
LIST2:在LIST1中出現過的,且必須為1標記位;而余下的則必須為0;
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用于匹配tcp會話三次握手的第一次;
例:目標的80端口被禁止
iptables -I INPUT 1 -s 172.16.250.145 -d172.16.249.139 -p tcp -m tcp --dport 80 -j DROP(-m tcp可以不寫)
udp:
--sport
--dport
icmp:
--icmp-types
8:echo request
0:echo reply
練習:
1、放行本機上的ssh和http服務;要求input和output策略默認均為DROP;
2、開放本機對ping的響應,和ping請求;
顯式擴展:必須指明使用的擴展機制;
-m 模塊名稱
每個模塊會引入新的匹配機制;
想知道有哪些模塊可用:
rpm-ql iptables
小寫字母,以.so結尾;
multiport擴展:
以離散定義多端口匹配;最多指定15個端口;
專用選項:
--source-ports,--sports PORT[,PORT,...]
--destination-ports,--dports PORT[,PORT,...]
--portsPORT[,PORT,...]
例子:
iptables-I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables-I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT
iprange擴展:
指定連續的ip地址范圍;在匹配非整個網絡地址時使用;
專用選項:
[!]--src-range IP[-IP]
[!]--dst-range IP[-IP]
示例:
iptables-A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range172.16.100.1-172.16.100.100 -j ACCEPT
iptables-A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range172.16.100.1-172.16.100.100 -j ACCEPT
string擴展:
檢查報文中出現的字符串,與給定的字符串作匹配;
字符串匹配檢查算法:
kmp,bm
專用選項:
--algo{kmp|bm}
--string"STRING"
--hex-string "HEX_STRING":HEX_STRING為編碼成16進制格式的字串;
示例:
iptables-I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string"sex" --algo kmp -j REJECT
time擴展:
基于時間區間做訪問控制
專用選項:
--datestartYYYY[-MM][-DD][hh[:mm[:ss]]]
--dattestop
--timestart
--timestop
--weekdaysDAY1[,DAY2,...]
示例:
#iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit擴展:
基于連接數作限制;對每個IP能夠發起的并發連接數作限制;
專用選項:
--connlimit-above[n]
#iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit--connlimit-above 5 -j REJECT
limit擴展:
基于發包速率作限制;
專用選項:令牌桶算法
--limit n[/second|/minit|/hour|/day]
--limit-burstn
iptables-R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute--limit-burst 5 -j ACCEPT
iptables/netfilter(3)
顯式擴展(續)
connection template:連接追蹤模板,用于記錄各連接及相關狀態;基于IP實現,與是否為TCP協議無關;通過倒計時的方式刪除條目;
記錄連接的狀態:
NEW: 新建立的連接,連接追蹤模板中無相應的條目時,客戶端第一次發出的請求;
ESTABLISHED:NEW狀態之后,邊距追蹤模板中的條目刪除之前所進行的通信過程,都稱為ESTABLISHED;
RELATED:相關聯的連接,如ftp協議的命令連接與數據連接即為相關聯的連接;
INVALIED: 無法識別的狀態;
state擴展:啟用連接追蹤模板記錄連接,并根據連接匹配連接狀態的擴展;
啟用連接追蹤功能之前:簡單包過濾防火墻;
啟用連接追蹤功能:帶狀態檢測的包過濾防火墻;
專用選項:
--stateSTATE
調整連接追蹤功能所能容納的連接的最大數目:
/proc/sys/net/nf_conntrack_max
當前追蹤的所有連接:
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的時長屬性:
/proc/sys/net/netfilter/
如何放行被動模式下的ftp服務:
(1) 裝載模塊:
#modprobe nf_conntrack_ftp
(2) 放行請求報文
放行入站請求端口為21的請求報文;
放行所有狀態為ESTABLISHED和RELATED狀態的入站報文;
(3) 放行出站響應報文
放行所有狀態為ESTABLISHED的出站報文;
如何保存及重載規則:
保存:
(1)service iptables save
/etc/sysconfig/iptables文件;
(2)iptables-save > /PATH/TO/SOMEFILE
重載:
(1)service iptables reload
(2)iptables-restore < /PATH/FROM/SOMEFILE
NAT:Network AddressTranslation
僅從請求報文判斷,地址轉換:
源地址轉換:SNAT
目標地址轉換:DNAT
端口轉換:PNAT
NAT Server: 能根據需要實現所謂的SNAT、DNAT或PNAT;
并非是用戶空間運行的進程完成轉換功能,靠的是內核中地址轉換規則;
SNAT:CIP --> SIP: CIP --> SNAT(PIP) --> SIP
CIP: 本地客戶端地址
DNAT:RemoteIP--> PIP: RemoteIP --> DNAT(SIP) --> SIP
RemoteIP:遠程客戶端地址;
PNAT:端口轉換
私有的客戶端訪問互聯網的方法:
(1)SNAT
(2)Proxy
SNAT:主要用于實現讓內網客戶端訪問外部主機時使用;
注意:要定義在POSTROUTING鏈;也可以在OUTPUT上使用;
定義方法:
iptables -t nat -A POSTROUTING -s 內網網絡或主機地址 -j SNAT --to-source NAT服務器上的某外網地址
另一個TARGET:
MASQUERADE:地址偽裝;
能自行判斷該轉為哪個源地址;
iptables -t nat -A POSTROUTING -s 內網網絡或主機地址 -j MASQUERADE
DNAT:主要用于發布內部服務器,讓內網中的服務器在外網中可以被訪問到;
注意:要定義在PREROUTING鏈;
iptables -t nat -A PREROUTING -d NAT服務器的某外網地址 -p 某協議 --dport 某端口 -jDNAT --to-destination 內網某服務器地址[:PORT]
FULLNAT: 全地址轉換
在請求報文到時:既修改源地址,又修改目標地址
回顧:
state擴展,nat
state擴展:
tcp finite state machine: 有限狀態機
closed, listen, syn_sent, syn_rcvd,established, fin_wait_1, fin_wait_2, close_wait, last_ack, time_wait
state: 無論tcp,udp, icmp協議,都能夠基于connection track template完成連接追蹤;
NEW,ESTABLISHED, RELATED, INVALID
內核模塊:nf_conntrack, nf_conntrack_ftp
專用選項:--state
nat: 網絡地址轉換;用到的表為nat;
SNAT:源地址轉換;
DNAT:目標地址轉換;
FULLNAT:源地址和目標都進行轉換;
nat表相對應鏈:PREROUTING,OUTPUT, POSTROUTING
SNAT:OUTPUT,POSTROUTING
-jSNAT --to-source
-jMASQUERADE
DNAT:PREROUTING
PNAT:
-jDNAT --to-destination IP[:PORT]
iptables(4):
TARGET:
ACCEPT
DROP
REJECT
SNAT
DNAT
MASQUERADE
LOG:日志
REDIRECT:端口重定向;
RETURN: 返回至調用者;
MARK:防火墻標記
練習:INPUT和OUTPUT默認策略為DROP;
iptables -P INPUT DROP
iptables -P OUTPUT DROP
1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;
#iptables -A INPUT -d 172.16.18.1 -p tcp --dport 80 -m time ! --weekdays Mon limit --limit10/minute --limit-burst 5
! string --string "admin" --algo kmp -j ACCEPT
#iptables -AOUTPUT -s 172.16.18.1 -p tcp --dport 80 -m time ! --weekdays Mon limit --limit 10/minute --limit-burst 5
! string --string "admin" --algo kmp -j ACCEPT
2、在工作時間,即周一到周五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.18.1 -ptcp --dport 21 -m time--timestart 08:30 --timestop 18:30
--weekdays Mon,Tue,Wed,Thu,Fri connlimit--connlimit-above 5 -j REJECT
#iptables -A OUTPUT -s 172.16.18.1 -d 172.16.0.0/16 -p tcp --dport 21 -m time --timestart 08:30 --timestop18:30
--weekdays Mon,Tue,Wed,Thu,Fri connlimit--connlimit-above 5 -j REJECT
3、開放本機的ssh服務給172.16.x.1-172.16.x.100中的主機,x為你的座位號,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機;
iptables -A INPUT -s 172.16.18.1-172.16.18.100 -m connlimit --connlimit-above 5 -state RELATED -j REJECT
iptables -A OUTPUT -d 172.16.18.1-172.16.18.100 -m connlimit --connlimit-above 5 -state RELATED -j REJECT
4、拒絕TCP標志位全部為1及全部為0的報文訪問本機;
iptables -A INPUT -d172.16.18.1 -p tcp --tcp-flags allnone -j REJECT
5、允許本機ping別的主機;但不開放別的主機ping本機;
iptables -A INPUT -d 172.16.18.1 -p tcp --dport 22 -j REJECT
iptables -A OUTPUT -s 172.16.18.1 -p tcp --dport 22 -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.7 -j RETURN
#iptables -A INPUT -d 172.16.100.7 -j clean_in
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT
運行從lo端口進入以及出去
#iptables -A INPUT -i eth0 -m multiport-p tcp --dports 53,113,135,137,139,445 -j DROP
#iptables -A INPUT -i eth0 -m multiport-p udp --dports 53,113,135,137,139,445 -j DROP
#iptables -A INPUT -i eth0 -p udp --dport1026 -j DROP
#iptables -A INPUT -i eth0 -m multiport-p tcp --dports 1433,4899 -j DROP
#iptables -A INPUT -p icmp -m limit--limit 10/second -j ACCEPT
課外任務:研究recent擴展的用法
利用iptables的recent模塊來抵御DOS***:
ssh: 遠程連接,
iptables-I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables-I INPUT -p tcp --dport 22 -m state--state NEW -m recent --set --name SSH
iptables-I INPUT -p tcp --dport 22 -m state--state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG--log-prefix "SSH Attack: "
iptables-I INPUT -p tcp --dport 22 -m state--state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模塊將單IP的并發設置為3;會誤殺使用NAT上網的用戶,可以根據實際情況增大該值;
2.利用recent和state模塊限制單IP在300s內只能與本機建立2個新連接。被限制五分鐘后即可恢復訪問。
下面對最后兩句做一個說明:
1.第二句是記錄訪問tcp 22端口的新連接,記錄名稱為SSH
--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目
2.第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接。
--update 是指每次建立連接都更新列表;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用
3.iptables的記錄:/proc/net/xt_recent/SSH
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。