Iptables web
Firewall:隔離工具,packets filter firewall(包過濾防火牆);工做於主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對於可以被規則匹配到的報文進行某預約義的處理機制的一套組件; 算法
硬件防火牆:在硬件級別實現部分過濾功能的防火牆,另一部分功能基於軟件實現; shell
軟件防火牆:應用軟件處理邏輯運行於通用硬件平臺之上的防火牆; 安全
主機防火牆:服務範圍爲當前主機; 服務器
網絡防火牆:服務範圍爲防火牆背後的局域網; 網絡
Iptables/netfilter: 防火牆是在內核中實現的; 併發
Netfilter:防火牆框架,framework;位於內核空間; app
Iptables:命令行工具程序,位於用戶空間,僅僅是規則管理工具;說白了就是在netfilter的門上放檢測機制的; 框架
Netfilter: ssh
Hooks function:鉤子函數;
Prerouting:路由以前
Input:
Forward:
Output:
Postrouting:路由以後;
Iptables:
CHAINS鏈
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
報文流向:
到本機某進程的報文先進入PEROUTINGàINPUT
由本機轉發的報文先進入PEROUTINGàFORWARDàPOSTROUTING
由本機某進程發出的報文:OUTINGàPOSTROUTING
Tables:
Filter:過濾;
Nat:network address translate,網絡地址轉換;
Mangle:拆解報文,作出修改,並從新封裝,一般用來作防火牆標記;
Raw:關閉nat表上啓用的鏈接追蹤機制;
優先級次序(由高而低):
Rawàmangleànatàfilter
功能和鉤子的對應關係:
Raw:只適用於PREROUTING和OUTPUT;
Mangle:PREROUTINGàINPUTàFORWARDàOUTPUTàPOSTROUTING,都適用;
Nat:只適用於PREROUTING,INPUT,OUTPUT,POSTROUTING;
Filter:只適用於INPUT,FORWARD,OUTPUT;
Iptables規則的組成部分:
匹配條件:
網絡層首部:source ip,destination ip;
傳輸層首部:source port,destination port;
擴展檢查機制:
處理動做:target
ACCEPT容許, DROP丟棄, REJECT拒絕,
A請求b同步; b贊成並請求a也同步;創建鏈接;三次握手;
四次斷開:
A請求與b的連接斷開,b贊成斷開;可是b不會同時請求說把我發給你的請求也斷開,爲何這麼作呢?由於咱們的TCP協議容許半連接,也就是,a能發,b能收,可是沒有b發a收這一段;所以在斷開的時候能夠只斷開一半;這一就是爲何斷開須要4次;
對於iptables來說,真正能生效的是規則;規則是在用戶空間編寫的而後送往內核中的,那麼送往內核的何處了呢?咱們的規則是在何時生效的?很顯然內核若是能接受數據那必定是運行中的內核,而不是磁盤上的內核文件,那運行中的內核在哪呢?在內存中仍是磁盤上?很顯然是在內存中,iptables所編寫的規則是送往內存中的內核上的,那麼這些規則在服務器重啓以後將會消失不見,因此爲了能讓咱們下一次重啓計算機後依然有規則可用,要將規則保存在配置文件中;
安裝:
Netfilter:位於內核中的tcp/ip協議棧報文處理框架;
Iptables:
Centos5/6:iptables命令編寫規則;
Iptables –t filter –F
Service iptables save
Centos7:firewalld;firewall-cmd,firewall-config
Systemctl stop firewalld
Systemctl disable firewalld 第二個視頻15:00左右再聽一遍
程序包:iptables;iptstatus(非必要,狀態追蹤器)
Iptables命令:
規則:根據制定的匹配條件來嘗試匹配每一個流經此處的報文,一旦匹配成功,則規則後面指定的處理動做進行處理;
匹配條件:源地址,目標地址,傳輸層協議
擴展匹配條件:須要藉助於擴展模塊進行制定的匹配條件
處理動做:
基本動做:ACCEPT,DROP
擴展動做:須要藉助於擴展模塊進行,但無需顯式制定,僅需指明動做;
添加規則時須要考量的問題:
Iptables命令的使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options] 擴展條件,可省略;
target = -j targetname [per-target-options] 指明處理動做;
規則管理格式:
Iptables [-t table] COMMAND chain criteria [-m matchname [per-match-options]] [-j targetname [per-target-options]]
-t 指定將規則寫在哪張表上;
COMMAND 子命令
-m 指定擴展條件;
-j 指明處理動做;
-t talbe:指明要管理的表,默認爲filter;
COMMANDS:
鏈管理:
-P iptables [-t table] -P chain target,定義鏈的默認策略;其target通常可以使用ACCEPT或DROP;
-N iptables [-t table] -N chain 新建一條自定義鏈,可是自定義鏈默認是不會被引用的;僅在默認鏈上經過某規則進行調用方可生效;所以,每一個自定義鏈都有其引用計數;
pkts:表示由此規則所匹配到的報文的個數;
bytes:表示由此規則所匹配到的包的大小之和;
target:表示該規則的目標;
prot:protocol,表示該規則所匹配的協議;
opt:選項
in:表示從哪一個網卡接口流進來;
out:表示報文由哪一個網卡接口流出;
source:源地址;
destination:目標地址;
(policy ACCEPT 870 packets, 131K bytes):若是報文沒有被規則匹配到,則默認由默認策略所匹配(policy ACCEPT)被默認策略所匹配的包有870個,這870個包的大小之和有131個字節;
示例:CentOS 7
Yum install httpd vsftpd telnet-server samba –y
Iptables –t filter –P INPUT DROP 更改默認策略爲DROP
此時,input規則鏈的默認規則就是DROP,因爲咱們沒有寫任何規則,也就意味着咱們沒有放行任何人的請求,因此這時候,全部的請求都會被阻斷;
如何自定義鏈:
Iptables –t filter –N in_web
這時候就多了一個鏈in_web,表示放開全部跟web相關的報文,最好見名知意;這時候就沒有默認規則了,而是(0 references)0此引用,表示沒有被引用;
-X iptables [-t table] -X [chain],表示刪除自定義鏈規則,若是沒有加制定的自定義鏈,則表示將全部自定義鏈刪除;而且只能刪除自定義的空的應用計數爲0的鏈;
-F iptables [-t table] -F [chain [rulenum]] [options...],清空制定的鏈或刪除指定鏈上的規則;CentOS6和7的語法可能不一樣;
-E iptables [-t table] -E old-chain-name new-chain-name,重命名自定義的引用計數爲0的鏈;
-Z iptables [-t table] -Z [chain [rulenum]] [options...] 至零計數器;
規則:
-A:append,iptables [-t table] -A chain rule-specification,表示追加規則到指定的鏈;
-I:insert,iptables [-t table] -I chain [rulenum] rule-specification,插入規則,到指定的鏈中的指定位置,默認爲鏈首;
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum;刪除指定的鏈上的指定規則;方式有兩種,刪除時指明匹配條件也能夠指明規則號碼進行匹配;
-R:replace;iptables [-t table] -R chain rulenum rule-specification;表示將指定的鏈的指定的規則替換爲爲新的規則;
查看:
-L:list;iptables [-t table] -L [chain [rulenum]] [options...];表示列出規則;
-n:表示數字格式顯示,若是不寫,iptables則試圖把每個地址反解爲主機名;
-v:verbose;詳細顯示格式信息;
--line-numbers:顯示鏈上的規則編號;
-x: exactly,顯示計數器的精確值;
計數器:
每條規則以及鏈的默認策略分別有各自的兩個計數器:
Iptables(2)
匹配條件:
基本匹配條件:
擴展匹配條件:
隱式擴展:
顯式擴展:
注意:多重條件之間隱含邏輯爲"與"操做;必需要同時知足;
基本匹配條件:
PARAMETERS
[!] -s, --source address[/mask][,...] 檢查報文中的源ip地址是否符合此處制定的地址或地址範圍;"!"號表示取反;一次有多個地址或地址塊能夠用逗號隔開;可是不要加空格,會報語法錯誤;
實例:
上圖中,input鏈的默認規則是drop的,可是容許10.10.3.0/24網段的主機訪問該主機的全部服務;
這時候,該規則的計數器開始有了數據;
實例2:
iptables -t filter -I INPUT -s 10.10.3.36 -j REJECT
上圖的規則意思爲拒絕10.10.3.0/24網段的10.10.3.36主機訪問本機的任何服務;
不一樣類別的規則,應該把訪問比較頻繁的服務對應的規則放前面;對於同一類別的服務,要把匹配範圍較小的放前面,匹配範圍較大的放後面;
條件替換
將以前的REJECT修改成DROP;數字1表明第一條規則;
若是動做是DROP:請求主機會等待訪問主機的迴應;若是動做是REJECT,則訪問主機會直接拒絕請求主機的請求,並給予迴應;
查看規則號碼
刪除規則
指明規則號
指明匹配條件
[!] -d, --destination address[/mask][,...] 檢查報文中的目標ip地址是否符合此處指定的地址或地址範圍;
[!] -p, --protocol protocol 檢查報文中傳輸層的協議類型支持tcp,udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or the special keyword "all"
實例:
iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.36 -p tcp -j ACCEPT
不但指定了源地址和目標地址並且還指定了只容許tcp協議經過,這時候,能夠訪問該主機的web服務,可是其餘的服務則沒法提供,例如ping;
[!] -i, --in-interface name 檢查報文進入本機時的接口是否符合本處指定的接口;僅適用於INPUT , FORWARD and PREROUTING;
[!] -o, --out-interface name 檢查報文即將離開本機時經由的接口是否符合本處指定的接口;僅適用於FORWARD , OUTPUT and POSTROUTING;
-m, --match match 顯式指明要使用的擴展模塊;
-j, --jump target 指明要處理的動做,也能夠是用戶自定義的鏈,若是要使用的內建的鏈,有兩種情形,能夠是簡單target也但是時擴展target;
擴展匹配條件
隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展,此處主要指使用-p{tcp/udp/icmp}給定協議後可直接對給定的協議所進行的擴展;
-m tcp;-m udp;-m icmp
檢查tcp udp icmp首部;
在CentOS7上須要man iptables-extensions來獲取;
-p tcp:可直接使用tcp協議對應的擴展選項;
[!] --source-port,--sport port[:port] 匹配報文中的傳輸層的源端口;可給出多個連續的端口;
[!] --destination-port,--dport port[:port] 匹配報文中的傳輸層的目標端口;可給出多個連續的端口;
實例:
只開放本機的ssh服務給本地網絡
上圖中的-m tcp 是能夠省略的;
上圖中,將input和output的默認策略都改成DROP就不會擔憂將本身擋在外面了;
[!] --tcp-flags mask comp 標誌位的檢查機制
Mask 掩碼
Comp 比較值
標誌位:SYN ACK FIN RST URG PSH;
Mask:要檢查的標誌位列表,以逗號分隔;例如:--tcp-fags SYN,ACK,FIN,RST
Comp:mask給定的衆標誌位中,其值必須爲1的標誌位列表;餘下的必須爲0;
--tcp-flags SYN,ACK,FIN,RST,SYN;
簡寫格式:[!] –syn,就至關於--tcp-flags SYN,RST,ACK,FIN SYN
-p udp:可直接使用udp協議對用的擴展選項;
[!] --source-port,--sport port[:port] 匹配報文中的傳輸層的源端口;可給出多個連續的端口;
[!] --destination-port,--dport port[:port] 匹配報文中的傳輸層的目標端口;可給出多個連續的端口
-p icmp:可直接使用icmp協議對應的擴展選項;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配對ping請求的響應報文;
--icmp-type 8/0:匹配ping請求報文
開放本機的ping請求報文;容許別人ping本機;
iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.79 -p icmp --icmp-type 8/0 -j ACCEPT
開放10.10.3.0/24網段的地址能夠對10.10.3.79進行ping;可是如今ping報文能進來,可是出不去;
上圖中能夠看見,只有10.10.3.44這臺主機進來的ping報文,沒有出去的,因此也是ping不通的;
開放本機的ping響應報文;
iptables -A OUTPUT -d 10.10.3.0/24 -s 10.10.3.79 -p icmp --icmp-type 0/0 -j ACCEPT
上圖所示當開放了本機的ping響應報文後,經過抓包看見本機已經響應了10.10.3.44的ping報文;
這時候別人ping本機能夠ping通,可是本機向外ping不通;是由於咱們僅容許響應報文出棧,沒有容許請求報文出棧;
要求本機能ping任何網絡
iptables -A OUTPUT -s 10.10.3.79 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT
如今報文能出去,可是進不來;
iptables -A INPUT -d 10.10.3.79 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT
如今本機向外ping的報文就能出去了;
顯式擴展:必須使用-m選項給出matchname的擴展,並且有些擴展都還存在專用選項;
以離散或連續的方式定義的多端口匹配條件;Up to 15 ports can be specified最多隻容許給出15個端口;A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp.指明端口匹配的條件是port:port,被記爲兩個端口;
[!] --source-ports,--sports port[,port|,port:port]...指定多個源端口
Port,port 表示連續
Port:port 表示離散
[!] --destination-ports,--dports port[,port|,port:port]...指定多個目標端口
[!] --ports port[,port|,port:port]... 匹配此處指定的源或目標端口
實例:
開放本機的22 23 80端口
上圖中一條規則,開放3條服務;
2.Iprange
以連續的ip地址範圍指明多地址匹配條件;
[!] --src-range from[-to] 匹配源地址
From to就表示從哪一個地址開始到哪一個地址結束之間的連續的地址範圍;
[!] --dst-range from[-to] 匹配目標地址
3. string
對報文中的應用層數據作字符串匹配檢測;
[!] --string pattern
[!] --hex-string pattern 爲了在匹配時性能更好,效率更高,能夠將字符串作16進制編碼進行匹配;
--algo {bm|kmp} 字符串匹配檢查算法;bm和kmp算法性能不相上下;
--from offset
--to offset
From和to能夠指定檢查報文的某段;而不用檢查整個報文,不指定則檢查整個請求報文;
Iptables –I OUTPUT –s 192.168.0.102 –d 0.0.0.0/0 –p tcp --dport 80 –m string --string "test"--algo bm -j REJECT
表示當主機192.168.0.102去訪問web頁面時,返回的報文中若是包含test字樣的報文則不被放行;
4.Time
根據報文到達的時間與指定的時間範圍進行匹配度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 開始時間
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 結束時間
--timestart hh:mm[:ss] 天天的幾點幾分幾秒開始
--timestop hh:mm[:ss] 天天的幾點幾分幾秒結束
[!] --monthdays day[,day...] 每個月哪幾天的時間段
[!] --weekdays day[,day...] 每週哪幾天的時間段
拒絕該主機的telnet服務在非工做時間訪問;
Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 23 –m time –timestart 16:00:01 --timestop 09:59:59 –weekdays Wed –j REJECT
拒絕其餘主機在星期3的下午4點到次日9點59分使用telnet鏈接192.168.0.102主機;
5.connlimit
根據每客戶端IP作併發鏈接數限制,即限制單IP可同時發起的鏈接請求;
--connlimit-upto n 鏈接數上限;
--connlimit-above n 鏈接數下限
Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 22 –m connlimit –connlimit-above 2 - j REJECT
外部同一臺主機最多能起的ssh鏈接數是兩個,超過兩個則被阻斷;
6.limit
基於收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
Iptables –A INPUT –d 192.168.0.102 –p icmp –icmp-type 8 –m limit –limit-burst 3 –limit 20/minute –j ACCEPT
指定ping請求是8,-m作速率限制,峯值速率爲3個,速率爲每分鐘20個,只要在這個範圍內則容許;前三個沒有時間限制,後面的每3秒一個;
Iptables –A OUTPUT –s 192.168.0.102 –p icmp –icmp-type 0 –j ACCEPT
放行icmp報文的出向;
7.state
[!] --state state
狀態檢測:鏈接追蹤機制(conntrack)
咱們的iptables或者netfilter可以在內核當中的某段內存上用一個哈希表記錄下來每個鏈接的源ip,目標ip,源端口,目標端口,何時與本機創建了鏈接?已經持續了多長時間,這個哈希表中會記錄得清清楚楚,那麼記錄下來之後,再有一個新的請求到達時,咱們跟該表相比較,若是這個源地址和源端口都存在了,咱們就認爲這個鏈接此前是來過的;
每個新的請求到達時,咱們都將其記錄在該表上,那也就意味着每個鏈接請求到達時,咱們就先檢查該表,看看有沒有跟這個請求的源端口,源ip,目標端口,目標ip相匹配的,若是有,就代表其此前訪問過,若是沒有,就將其加入該表中;
一個可以檢查鏈接到達時是否此前訪問過的功能就叫作鏈接追蹤;很顯然,鏈接追蹤須要一段內存空間來存儲,這段內存空間是有固定大小的,能存多少條也是肯定的,在該表中的每個條目都有一個計時器,一旦時間到了,將被自動刪除;若是該表的空間滿了,也沒有超時,則新的請求進來則沒法對其追蹤,則該新請求會被拒絕;因此當咱們啓用鏈接追蹤功能之後,若是本機的併發訪問數量很是大的話,會致使某些請求會被拒絕服務;
咱們鏈接追蹤到的內容放在/proc/net/nf_conntrack文件當中,那麼到底能存多少個追蹤條目呢?取決於這個文件/proc/sys/net/nf_conntrack_max;具體能有多大,取決於服務器的內存大小,該大小是能夠調整的;
鏈接追蹤機制有這麼幾個狀態:
New:一個新鏈接
ESTABLISHED:已創建的連接
RELATED:相關聯的鏈接
INVALID:沒法識別的鏈接
UNTRACKED:未被追蹤的鏈接
要想完成鏈接追蹤功能,咱們得使用一個內核模塊,nf_conntrack;在CentOS6和7上可能名稱不同;
若是咱們可以用lsmod |grep nf_conntrack能看到該模塊,則表示鏈接追蹤功能有效了,
Nf_conntrack模塊只能追蹤正常狀態的鏈接,不能追蹤那些相關聯狀態的鏈接,要想追蹤那些ftp的數據鏈接和命令鏈接,咱們還須要另一個模塊nf_conntrack_ftp,是專門用於實現追蹤related狀態的,該模塊默認是不會被裝載的,要想追蹤related狀態,須要手動裝入;
相關內核模塊:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
不一樣的協議的連接追蹤時長:
/proc/sys/net/netfilter/
好比咱們作了防火牆,屏蔽了除80之外的全部端口,那很顯然,該80端口能夠接收請求進來,也能夠響應出去,可是有多是咱們的服務器被被別人種下一個木馬,這個木馬掃描了宿主機發現只有80端口是開放的,因此該木馬經過80端口偷偷的出去鏈接它的控制端,這會從80端口真正的發起一個鏈接出去,但這必定是非正常狀態,在咱們服務器正常工做狀態下決不容許這種狀況發生的,爲了使咱們的服務器更加安全,咱們能夠這樣設置規則,咱們的80端口只容許進來爲new的鏈接請求,出去的只能是ESTABLISHED;只要有別人請求進來,服務器給予響應,響應時它就是ESTABLISHED,可是隻有第一次請求才爲NEW,第二次請求也是ESTABLISHED,所以,入棧時咱們容許爲NEW,ESTABLISHED,可是出去的只容許爲ESTABLSHED,像這種反彈式木馬就沒辦法作到悄悄地經過80端口去鏈接它的控制端;這樣防火牆將變得更加安全;
咱們也能夠這麼認爲,若是咱們的默認策略通通爲DROP時,那麼任何一個能進來的,咱們都應該讓它出去,任何一個能進來時,當它出去爲ESTABLISHED都放行有危險嗎?沒有危險,通常來說,狀態爲ESTABLISHED,必定是對某個請求的響應,假設在這種狀態之下,咱們能夠僅容許OUTPUT時爲ESTABLISHED狀態,無論是什麼鏈接,凡是ESTABLISHED狀態的通通放行,這時候一條規則就能放行全部服務了,實現了規則優化的目的,固然有了鏈接追蹤之後,咱們還能夠放行被動模式的ftp服務了,我只開放21號端口,別人請求響應都正常,可是,當數據鏈接來的時候,被動模式下,客戶端會請求服務器的隨機端口,防火牆不可能開放這些端口,可是我能判斷出這個鏈接是RELATED,因此這個時候就檢查狀態,若是它請求的是個人隨機端口,可是狀態爲RELATED,咱們就放行,而不用開放這一端口,基於狀態鏈接就能達到數據鏈接的目的,而不用開放端口;
實例:默認input和output都是DROP;
本機的ssh/web/ftp服務,咱們容許別人來訪問,可是咱們毫不容許別人經過22,23,80端口主動鏈接別人;
iptables –A INPUT –d 192.168.0.102 –p tcp –m multiport --dport 22,23,80 –m state --state NEW,ESTABLISHED –j ACCEPT
iptables –A OUTPUT –m state --state ESTABLISHED –j ACCEPT
假如我容許別人ping本機,
iptables –A INPUT –d 192.168.0.102 –p icmp --icmp-type 8 –m state --state NEW,ESTABLISHED –j ACCEPT
我對全部協議都檢查狀態,你只要是ESTABLISHED的都放行;這時候咱們就能夠集中精力好好研究放行入棧的請求了;
那麼如和開放本機的ftp服務呢?
iptables –I INPUT –m state --state ESTABLISHED –j ACCEPT
iptables –R INPUT 2 –d 192.168.0.102 –p tcp –m multiport –dports 21:23,80 –m state --state NEW –j ACCEPT
iptables –R INPUT 1 –m state --state RELATED,ESTABLISHED –j ACCEPT
systemctl start vsftpd.service 啓動vsftpd.service服務
另外一臺主機上:lftp 192.168.0.102
發現訪問不了;
lsmod |grep ftp 追蹤ftp的模塊沒有被裝載;
modprobe nf_conntrack_ftp 裝載模塊;
斷開lftp鏈接,再次請求,則成功;
如何開放被動模式的ftp服務:
裝載追蹤ftp協議的模塊
modprobe nf_conntrack_ftp
放行入棧命令鏈接
iptables –A INPUT –d SERVER-IP –p tcp --dport 21 –m state --state NEW,ESTABLISHED –j ACCEPT
放行入棧數據鏈接
iptables –A INPUT –d SERVER-IP –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT
放行出棧鏈接
iptables –A OUTPUT –s SERVER-IP –m state --state ESTABLISHED –j ACCEPT
處理動做:
-j targetname [per-target-options]
簡單target
ACCEPT DROP
擴展target
REJECT
--reject-with type 指明拒絕理由
icmp-net-unreachable 網絡不可達
icmp-host-unreachable 主機不可達
icmp-port-unreachable 端口不可達
icmp-proto-unreachable 協議不可達
icmp-net-prohibited 網絡被禁止
icmp-host-prohibited 主機被禁止
icmp-admin-prohibited 管理被禁止
默認爲:icmp-port-unreachable
LOG
turn on kernel logging of matching packets.打開內核中匹配報文的日誌記錄功能;
--log-level level 指明日誌級別
emerg, alert, crit, error, warning,notice, info or debug.
--log-prefix prefix 日誌信息的前導信息;
iptables –I INPUT 2 –d 192.168.0.102 –p tcp --dport 22 –j LOG --log-prefix "openssh from kernel" 加到第2條,只記錄NEW狀態的信息;
而後在/var/log/messages中就能夠找到其log信息;
保存和載入規則
iptables-save
在CentOS7中,要以輸出重定向的方式保存規則;
iptables-save > /etc/sysconfig/iptables CentOS7中,該文件默認不存在,文件名能夠自定義,能作到見名知意;
在CentOS6中,該文件默認是存在的,保存方式爲service iptables save;
iptables-restore
在CentOS7中,能夠將保存的各類不一樣應用場景的iptables規則文件以輸入重定向的方式將其重載回iptables,可是以前的就會被覆蓋
iptables-restore < /etc/sysconfig/iptables
-n, --noflush 不清除原有規則
-t, --test 僅分析生成規則集,但不予提交;
CentOS 6:
保存規則:service iptables save
保存規則與/etc/sysconfig/iptables,保存操做會清除文件中原有的內容;
重載規則:service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
腳本配置文件:/etc/sysconfig/iptables-config
能夠用於指明要裝在的模塊,好比說nt_conntrock_ftp;
CentOS 7開機自動生效規則:
規則優化思路:
iptables/netfilter
主機防火牆主要工做在呢他filter的input和output鏈上,由於他們主要做用在於主機內部的某一進程進行通訊,一個外來的報文要想到達本機,得先經由input鏈,可是在到達input鏈以前要先到達prerouting,可是prerouting跟過濾功能沒有重疊關係,所以在到達本機的外來報文的過濾功能只能在input上實現,本地主機與外部通訊,則經由output和postrouting,可是在postrouting上沒法實現過濾功能;
forword的主要做用在於,全部經由本機的一個接口進來的報文,在本地路由功能發生決策之後,發現目標地址不是本機,咱們須要幫忙轉發至其餘網絡當中去,這種應用場景咱們稱之爲轉發功能;而轉發時的報文勢必要經由forword鏈,可是除了這個鏈,它會經由3條鏈,分別是剛剛進入本機的preroutingà到達本機路由決策之後,發現目標非本地,若是打開本機的核心轉發功能則
實驗環境:
192.168.22.2 192.168.22.1 10.1.0.6 10.1.0.67
(1)打開firewall的核心轉發功能;而且分別在內網和外網上配置http服務,而且能互相訪問;echo 1 > /proc/sys/net/ipv4/ip_forward
(2)iptables –A FORWARD –j DROP
(3)放開由內而外的服務
iptables –I FORWARD –s 192.168.22.0/24 –p tcp --dport 80 –j ACCEPT
這只是放行了請求報文出去,因此任然內網不能訪問外網;
iptables –I FORWARD –d 192.168.22.0/24 –p tcp --sport 80 –j ACCEPT
放行進來的報文,這時候內網就能訪問外網了;
使用狀態追蹤;
iptables –D FORWARD 2 刪除剛纔放行進來報文的規則;
添加凡是響應報文咱們都放行;
iptables –I FORWARD –m state --state ESTABLISHED –j ACCEPT
開放內網主機ssh鏈接外網主機
iptables –R FORWARD 2 –s 192.168.22.0/24 –p tcp –m multiport --dport 80,22,23,21 –m state --state NEW –j ACCEPT
這時候80和ssh是正常的,可是要想讓ftp服務正常服務,必須打開related服務;
裝載模塊:modprobe nf_conntrack_ftp;
iptables –R FORWARD 1 –m state --state ESTABLISHED,RELATED –j ACCEPT
如今由內而外請求ftp就能夠正常進行了;lftp 10.1.0.67
iptables/netfilter網絡防火牆:
添加規則與forward鏈,注意幾個問題:
(1)請求和響應報文均會經由FORWARD鏈,要注意規則的方向性;
(2)若是能夠啓用conntrack機制,注意網關主機所可以追蹤的鏈接數的最大數量要符合要求;
NAT :地址轉換
當內網想訪問外網的時候,源IP是1的ip,目標ip是internet的任意主機ip4,這時候源ip和目標ip不在同一個網段,則內網報文發給網關ip2;ip2經由本機路由表查詢發現該報文須要經由ip3發出去,因而該報文在路由完之後就扔給ip3的消息隊列了,ip3拿到這個報文向外發送的時候,得先改地址,再發送,因此這個報文立刻被外網網卡發出去以前將地址作修改,怎麼改呢?當報文送達到ip3的時候,源ip是ip3,目標ip是ip4.
外網迴應的時候,響應報文發送時,源ip是ip4,目標地址是ip3,當ip3收到報文以後就去查NAT表,查到此前是由某一個ip1訪問了ip4的,所以該報文送達到本機的網卡以後,在路由發生以前要將目標地址修改成ip1,源ip修改成ip2,
源地址轉換:SNAT POSTROUTING
靜態轉換:外網地址是固定的;
動態轉換:外網地址是不固定的,須要臨時探測外網地址是什麼而後轉換;
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.只能放在nat表上,僅支持POSTROUTING或INPUT;
--to-source [ipaddr[-ipaddr]]
實例:
iptables –t nat –A POSTROUTING –s 192.168.22.0/24 –j SNAT --to-source 10.1.0.6
將內網地址出去的時候轉換爲公網地址10.1.0.6出去;
用192.168.22.0/24段的地址ping10.1.0.67,在67上tcpdump會發現是10.1.0.6在ping;
在10.1.0.6上的內網網卡上抓包會發現是192.168.22.0/24位的地址在ping;
也能夠查看日誌/var/log/httpd/access_log
MASQUERADE 地址假裝
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
MASQUERADE能夠實現動態轉換之目的,它知道當內網中的主機發出訪問請求時,經過哪一塊網卡出去,並且會自動找到那個網卡上已生效的ip地址,將其做爲源地址,所以能夠不用使用--to-source 而去自行判斷用哪一個;這時候就有問題了,每一次請求到達時咱們得看看到底哪一個地址可用。所以在訪問量較大時會很影響性能;
--to-ports port[-port]
目標地址轉換:DNAT PREROUTING
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]]
實例
iptables –t nat –A PREROUTING –d 10.1.0.6 –p tcp --dport 80 –j DNAT --to-destination 192.168.22.2:80
後面冒號的80能夠不用寫,表示,目標地址是80,轉換時也是80;
iptables –t NAT –A PREROUTING –d 10.1.0.6 –p tcp --dport 22022 –j DNAT --to-destination 192.168.22.3:22
當外網主機訪問10.1.0.6:22022的ssh服務時,則被轉換爲192.168.22.3:22的ssh服務,達到隱藏內網ssh端口之目的;
REDIRECT 端口映射
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.僅在當前主機完成端口映射;
--to-ports port[-port]
在192.168.22.2這臺主機上起http服務,並將默認80端口修改成8080,而後就在192.168.22.2這臺主機上起iptables規則,經過REDIRECT完成端口轉換;
iptables –t nat –A PREROUTING –d 192.168.22.2 –p tcp --dport 80 –j REDIRECT --to-port 8080
測試:curl http://192.168.22.2:80
自定義鏈的使用:
iptables –A FORWARD –m state --state ESTABLISHED –j ACCEPT
iptables –N web_in
iptables –A web_in –d 192.168.22.0/24 –p tcp --dport 80 –m state --state NEW –j ACCEPT
iptables –A FORWARD –j REJECT
這時候請求http服務是不能夠的;
調用web_in
iptables –I FORWARD 2 –d 192.168.22.0/24 –p tcp --dport 80 –j web_in
再次請求就能夠了;
RETURN 返回
iptables –A web_in –j RETURN 若是全部規則都不匹配時返回web_in;
注意:自定義鏈一旦被引用和有規則時,是不容許被刪除的;