防火牆及netfilter基礎iptables基本用法

iptables

 

firewall:

主機防火牆

網絡防火牆

 

工作於主機或網絡的邊緣,對於進出的報文根據事先定義的規則作檢查,將那些能夠被規則所匹配到的報文作出相應處理的組件。

 

網絡防火牆:

專業的硬件防火牆:

checkpoint,netscreen

主機:

 

iptables: 程序

iptables:規則編寫工具

netfilter: 網絡過濾器, 內核中工作在TCP/IP網絡協議棧上的框架;

 

IDSIntrusionDetecting 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表上啓用的連接追蹤功能

 

filterinput,forward, output

natprerouting,output, postrouting

mangleprerouting,input, forward, output, postrouting

rawprerouting,output

 

iptables:每個鉤子函數上可放置n條規則;對應於每個鉤子上的多條規則就稱爲一個鏈(CHAIN

每個功能有多個鏈,所以,就稱作表;

Machine generated alternative text:raw: PREROUTING mange: PREROUTING nat: PREROUTING raw: OUTPUT mangle: OUTPUT nat OUTPUT filter: OUTPUT mange: POSTROUTING mangle tilter: INPUT INPUT tilter: FO WARD nat: POSTROUTING

 

鏈:鏈上的規則次序即爲檢查次序,因此有一定的法則

(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

鏈:

-Fflush,清空指定表的指定鏈上所有規則;省略鏈名時,清空表中的所有鏈;

例:

[root@localhost~]# iptables -F INPUT

[root@localhost~]# iptables -F OUTPUT

 

-Nnew, 新建一個用戶自定義的鏈;自定義鏈只能作爲默認鏈上的跳轉對象,即在默認鏈通過引用來生效自定義鏈;

例:

Machine generated alternative text:Crcct@LccaLhcst Crcct@LccaLhcst Chain INPUT (policy rpt ab Les rpt ab Les ACCEPT) s cur ce —N —L cd chen —n target prot opt de st ion de st ion de st ion de st ion Chain FORWARD (policy ACCEPT) target prot opt source Chain OUTPUT (policy ACCEPT) target p rot opt source references) opt source Chain cdchen (O target p rot

 

-Xdrop,刪除用戶自定義的空鏈非空自定義鏈內置鏈無法刪除

-Zzero,將規則的計數器置0

-Ppolicy,設置鏈的默認處理機制;當所有都無法匹配或有匹配有無法做出有效處理機制時,默認策略即生效;

filter表的可用策略:ACCEPT,DROP, REJECT

            例:表明filter的表INPUT鏈默認爲DROP

iptables-t filter -P INPUT DROP

 

-Erename,重命名自定義鏈;

 

注意:被引用中的鏈,無法刪除和改名

 

規則:

-Aappend,在鏈尾追加一條規則;

-Iinsert,在指定位置插入一條規則;

-Ddelete,刪除指定的規則;

-Rreplace,替換指定的規則;

 

查看:

-Llist,列出指定鏈上的所有規則;

-n: numeric,以數字格式顯示地址和端口號,即不反解;

-v: verbose,詳細格式,顯示規則的詳細信息,包括規則計數器等;

-vv:

-vvv:

--line-numbers: 顯示規則編號;

 

可以顯示規則的編號

 iptables -L -n --line-numbers

-x: exactly,顯示計數器的精確值;

                                                          

Machine generated alternative text:Cha Ln pkts Chain pkts Chain pkts Chain pkts Crcct@LccaLhcst (policy ACCEPT 1645 bytes target rpt ables —L prot opt -n packets, 163K bytes) In cut scurce de st ion de st ion de st ion de st ion FORWARD (policy ACCEPT o packets, O bytes) bytes target prot opt 172 opt opt In cut s curce OUTPUT (policy ACCEPT packets, 1566B bytes) bytes target prot In In cut cut s cur ce s curce cdchen (O references) bytes target p rot

 

pktsbytes target     prot opt in     out    source               destination

pkts: 被本規則所匹配到的包個數;

bytes:被本規則所匹配到的所包的大小之和;

target: 處理目標(目標可以爲用戶自定義的鏈)

prot: 協議 {tcp,udp, icmp}

opt: 可選項

in: 數據包流入接口

out: 數據包流出接口

source: 源地址

destination: 目標地址;

 

CRETERIA: 匹配條件

檢查IP首部,檢查TCPUDPICMP首部;

基於擴展機制,也可以進行額外的檢查;如做連接追蹤;

 

注意:可同時指定多個條件,默認多條件要同時被滿足;

 

匹配條件:

 

通用匹配:

[!] -s, --src, --source  IP|Network:檢查報文中的源IP地址;

-d, --dst, --destination:檢查報文中的目標IP地址;

-p, --protocol:檢查報文中的協議,即ip首部中的protocols所標識的協議;tcpudpicmp三者之一;

-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

0echo reply

 

練習:

1、放行本機上的sshhttp服務;要求inputoutput策略默認均爲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: 新建立的連接,連接追蹤模板中無相應的條目時,客戶端第一次發出的請求;

ESTABLISHEDNEW狀態之後,邊距追蹤模板中的條目刪除之前所進行的通信過程,都稱爲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的請求報文;

放行所有狀態爲ESTABLISHEDRELATED狀態的入站報文;

 

(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

 

NATNetwork AddressTranslation

 

僅從請求報文判斷,地址轉換:

源地址轉換:SNAT

目標地址轉換:DNAT

端口轉換:PNAT

 

NAT Server: 能根據需要實現所謂的SNATDNATPNAT

並非是用戶空間運行的進程完成轉換功能,靠的是內核中地址轉換規則;

 

SNAT:CIP --> SIP: CIP --> SNAT(PIP) --> SIP

CIP: 本地客戶端地址

DNATRemoteIP--> 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

SNATOUTPUT,POSTROUTING

-jSNAT --to-source

-jMASQUERADE

DNATPREROUTING

PNAT

-jDNAT --to-destination IP[:PORT]

 

iptables(4)

 

TARGET:

ACCEPT

DROP

REJECT

 

SNAT

DNAT

MASQUERADE

 

LOG:日誌

REDIRECT:端口重定向;

RETURN: 返回至調用者;

MARK:防火牆標記

 

 

練習:INPUTOUTPUT默認策略爲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擴展的用法

 

利用iptablesrecent模塊來抵禦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.利用recentstate模塊限制單IP300s內只能與本機建立2個新連接。被限制五分鐘後即可恢復訪問。

 

下面對最後兩句做一個說明:

 

1.第二句是記錄訪問tcp 22端口的新連接,記錄名稱爲SSH

--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目

 

2.第三句是指SSH記錄中的IP300s內發起超過3次連接則拒絕此IP的連接。

--update 是指每次建立連接都更新列表;

--seconds必須與--rcheck或者--update同時使用

--hitcount必須與--rcheck或者--update同時使用

 

3.iptables的記錄:/proc/net/xt_recent/SSH


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章