iptables 面試

iptables




Firewalls:隔離工具,工作於主機或者網絡的邊緣,對於經由的報文根據預先定義的防火規則(識別條件)進行檢測,能夠被規則匹配到的報文實行某種預定義的處理機制的一套組件


硬件防火牆:一部分硬件實現的爲硬件防火牆,另一部分功能基於軟件


軟件防火牆:軟件處理邏輯,運行與通用硬件是實現的防火牆




主機防火牆:工作在主機邊緣的,爲當前主機提供防火功能,在內核中的tcp/ip協議棧前的閘門


網絡防火牆:工作在網絡邊緣的,爲防火牆背後的網絡工作的防火牆



iptables/netfilter:純軟件實現的,網絡或主機防火牆


netfilter實現防火,過濾工具,防火牆框架;



iptables:規則編寫工具


默認法則:在中間規則處理完後還是沒有處理,將遵循默認法則


hook function:

prerouting:路由發生之前;特殊門(鉤子)

input:進

forward:轉發

output:出

postrouting:路由發生之後


iptables

chain:

PREROUTING:一個鉤子有多個規則

INPUT

FORWARD

OUTPUT

POSTROUTING


規則在鉤子上組成鏈,鏈組成網


一個鉤子可以有多個鏈,形成網,就是iptables


tables:根據功能劃分


1.filter:過濾,防火牆


2.nat:網絡地址轉化,用於修改報文(請求|相應)的原地址或目標地址,甚至是端口


3.mange:拆解報文,對目標IP地址和源IP地址意外的信息做出修改,並重新封裝


4.raw:關閉nat表上啓用的鏈接追蹤機制


優先級:raw-->mange-->nat-->filter



功能<-->鉤子:


raw:PRETOUTING,OUTPUT


mangle:PREROUTING INPUT FORWARD OUTPUT POSTROUTING


nat: PREROUTING INPUT OUTPUT POSTROOUTING


filter:INPUT FORWARD OUTPUT


報文流向


到本機某進程的報文:PRETOUTING--INPUT

有本機轉發        :PREROUTING--FORWARD--POSTROUTING

有本機某進程發出的:OUTPUT--POSTROUTING



規則的組成部分


匹配條件:

網絡層首部屬性值

傳輸層首部屬性值

附加的條件





處理動作:





TCP/IP協議棧:


數據連接層:物理設備到物理設備之間的通信 MAC地址

網絡層:源主機到目標主機之間的通信 IP地址

傳輸層:進程到進程之間的通信 端口




netfilter:位於內核中的tcp/ip協議棧的報文處理框架

iptables:用戶空間的命令行程序



centos5,6:iptables命令編寫

centos7:firewalld

systemctl disable firewalld先關閉這個才能用iptables



iptables命令



添加規則之前需要考量的問題


1.報文的流經路徑,判斷添加規則到那個鏈上

2.確認要實現的功能,判斷添加規則到那個表上

3.要制定的匹配條件,以用於匹配目標報文


規則:根據指定的匹配條件嘗試匹配每個流經此處的報文,一旦匹配成功,就有後邊的指明的動作進行處理


匹配條件:(小寫的模塊)

基本匹配條件:簡單匹配簡單減產報文首部tcp ip udp 等報文的某屬性進行匹配的機制


擴展匹配條件:需要藉助於擴展模塊進行的匹配條件指定

處理動作:(大寫的模塊)


基本動作:ACCEPT接受, DROP拒絕 ..

擴展動作:需要藉助擴展模塊進行的動作



iptables/netfilter:包過濾型防火牆;帶狀態檢測的包過濾防火牆,鏈接追蹤,報文的來源於請求等都能檢測



c7  systemctl status firewalld 保證他關閉,否則會自動生成好多規則,影響我們


規則的編寫格式


iptables -t table command chain -m matchname per-match-options -j targetname per-target-options



-t table:默認filter ,其他raw nat mangle


command:

對鏈操作的:

-P:定義默認策略,一般兩種選擇,放行或丟棄 accept和drop 辣椒水老虎凳都不行的那個比喻


-N:新建一條自定義的規則鏈;除了5個內定的以外的,只有被內建的鏈來調用才能用,沒辦法自己生效,被-j targetname調用,用完後還會返回內建鏈




如何使用自定義鏈:

iptables -N icmp_rules


iptables -I forward -p -icmp -j icmp_rules


自定義鏈是被默認鏈調用生效,只要在-j後面做options就好



執行完成後,沒有繼續額規則,就返回主鏈,手動返回上級連用return ,當一條請求沒有被調用的自定義鏈匹配的時候,使用return,讓他回到主鏈再做匹配




-X:刪除自定義的空鏈;鏈內不能有規則,不能被調用,否則無法被刪除


-F:跟chain |規則|清空指定的鏈;後邊比價參數清空所有鏈


iptables -t nat -F

iptables -F chain


-E:重命名自定義引用計數0的鏈

iptables -E oldname newname


規則:


-A:追加,在制定鏈的尾部,追加一條規則,爲什麼是尾部,因爲規則是自上而下的,次序非常重要,上邊的拒絕,下邊的再怎麼放行都沒用

-I:-I chain rulenum 插入到制定規則號碼的位置,不指定號碼插入鏈首


-D:刪除指定規則;後邊跟規則的編號就行


-R:將指定的規則替換爲新的規則,不能修改部分條件,必須是整條規則完全替換


查看:

   -L:list ,列出表中的鏈上的規則,會把端口IP地址反解

    -n:以數值形勢表示,不反解

    -v:顯示纖細格式信息

    -x:顯示計數器的精確結果

    計數器:

規則,以及默認策略有專有的計數器


記錄當前規則所匹配到的


1.報文個數

2.字節總數

數值過大還會自動的單位換算,但是會導致精度丟失,



重置規則計數器:

-Z:什麼都不跟表示把所有的置0




chain: 

 1.內建鏈

 2.自定義鏈


匹配條件的定義方式24193


多重條件之間是且的關係,都要滿足


1.基本匹配條件:


[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍;

[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍;

[!] -p, --protocol protocol:

protocol:{tcp|udp|icmp}

[!] -i, --in-interface name:數據報文的流入接口;INPUT, FORWARD  and  PREROUTING 

[!] -o, --out-interface name:數據報文的流出接口; FORWARD, OUTPUT and POSTROUTING

接口就是網卡(?)

2.擴展匹配條件


                      隱式擴展:不用-m選項指出matchname即可使用此match的專用選項進行匹配;

-p tcp:隱含了-m tcp;

[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口;

[!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;

[!] --tcp-flags mask comp

SYN,ACK,FIN,RST,URG,PSH;

mask:要檢查的標誌位列表,以逗號分隔;

comp:必須爲1的標誌位,餘下的出現在mask列表中的標誌位則必須爲0;不,明白的話想想三次握手,那個爲1表示發送了那個

--tcp-flags  SYN,ACK,FIN,RST  SYN 

[!] --syn:

相當於--tcp-flags  SYN,ACK,FIN,RST  SYN 

-p udp:隱含了-m udp:

[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口;port[:port]:值得是端口範圍

[!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;

-p icmp:隱含了-m icmp:

[!] --icmp-type {type[/code]|typename}

8:echo-request回顯請求

0:echo-reply回顯應答


檢查網絡是不是通常,ping命令就是icmp報文




                      顯式擴展:必須使用-m選項指出matchname,有的match可能存在專用的選項;

獲取幫助:

CentOS 7:man iptables-extensions

CentOS 6:man iptables

1、multiport擴展

以離散或連續的方式定義多端口匹配條件;

[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;

[!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;

[!] --ports port[,port|,port:port]...:指定多個端口;

 

2、iprange擴展

以連續的ip地址範圍指明連續的多地址匹配條件;

[!] --src-range from[-to]:源IP地址;--src-range 172.16.100.67-172.16.100.70

[!] --dst-range from[-to]:目標IP地址;

3、string擴展

對報文中的應用層數據做字符串匹配檢測;

[!] --string "pattern":要檢測字符串模式;

[!] --hex-string pattern:要檢測的字符串模式,16進制編碼;

--algo {bm|kmp}

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...]

~]# iptables -I INPUT -d 172.16.100.67 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Tue,Thu,Sat -j ACCEPT

5、connlimit擴展

根據每客戶端IP做併發連接數匹配;

--connlimit-upto n:連接數數量小於等於n,此時應該允許;

--connlimit-above n:連接數數量大於n,此時應該拒絕;

~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT

6、limit擴展

基於收發報文的速率進行匹配;

--limit rate[/second|/minute|/hour|/day]:平均速率

--limit-burst number:峯值速率

7、state擴展

狀態檢測;連接追蹤機制(conntrack);

[!] --state STATE

INVALID:無法識別的狀態; 

ESTABLISHED:已建立的連接;

NEW:新連接; 

RELATED:相關聯的連接;

UNTRACKED:未追蹤的連接;

 

nf_conntrack內核模塊;

追蹤到的連接:/proc/net/nf_conntrack文件中;

能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max

此值可自行定義,建議必要時調整到足夠大;

不同的協議的連接追蹤的時長:

/proc/sys/net/netfilter/

如何開放被模式的ftp服務: 

(1) 裝載追蹤ftp協議的模塊;

# modprobe nf_conntrack_ftp

(2) 放行命令連接

~] # iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT

~] # iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW -j ACCEPT

(3) 放行數據連接

~] iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT

















              處理動作(目標)

       -j targetname [per-target-options]

       targetname:

       ACCEPT:接受;

       DROP:丟棄;

       REJECT:拒絕;


      

       注意:1.PREROUTING POSTROUTING不能設置規則


       2.拒絕要越早越好

        保存和重載規則:

               iptables-save > /PATH/TO/SOME_RULE_FILE 

               iptables-restore < /PATH/FROM/SOME_RULE_FILE

CentOS 6:

保存規則:

service iptables save

自動保存規則至/etc/sysconfig/iptables文件中;

重載規則:

server iptables restore

從/etc/sysconfig/iptables文件中重載規則; 

規則優化:

(1) 可安全放行所有入站及出站,且狀態爲ESTABLISHED的連接;

(2) 服務於同一類功能的規則,匹配條件嚴格的放前面,寬鬆放後面;

(3) 服務於不同類功能的規則,匹配報文可能性較大擴前面,較小放後面;

(4) 設置默認策略;

(a) 最後一條規則設定;

(b) 默認策略設定; 

博客作業:

上述所有內容;






lscpu

modinfo

modprobe






例題:


1.允許某主機訪問


iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -j ACCEPT  流入放行



iptables -t filter -A OUTPUT -d 172.16.0.0/16 -s 172.16.100.67 -j ACCEPT 流出放行


2.拒絕


iptables -A INPUT -s 172.16.100.67 -d 172.16.100.67 -J REJECT




iptables -vnL --line-numbers




開放本機的ssh服務給1721610067


iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 22 -j ACCEPT




iptables -A OUTPUT -d 172.16.0.0/16 -s 172.16.100.67 -p tcp --sport 22 -j ACCEPT







網絡防火牆



網絡虛擬化


二層網絡:兩個主機直接連到一個交換機上


三層網絡:兩個二層網絡的交換機之間用路由器連接



橋接:物理機用自己的網卡做虛擬機的交換機,自己虛擬一塊網卡做之前物理網卡的網卡


僅主機:虛擬一個軟件做交換機,連接連個同網段的虛擬機,vm在交換機上游虛擬出一個dhcp服務器分配IP地址,不能與物理主機連接,但是物理主機可以拋棄物理網卡,虛擬一個軟件網卡來連接交換機做到與兩個虛擬主機通信


nat:打開網絡轉發和網絡地址轉換,虛擬機通過網關到物理網卡,物理網卡發給別人,但是別人怎麼到虛擬機呢,非橋接虛擬機是私網地址,所以在於外部通信的網關會用自己的IP地址取代虛擬機的IP地址,並記錄,當響應報文回來的時候,是衝着網關來的,這是網關會把目標地址查表改回虛擬機的IP地址,這叫做源地址轉換(對於請求報文),只有虛擬機到外網的請求是new其餘都是established


響應報文是改目標地址轉換


內網虛擬機空開網關的端口IP地址,物理主機請求者個端口地址,但是網關並沒有這個服務,還是會轉到內網的虛擬機上,這是網關更改的是目標地址




tcpdump -i eno16777736 -nn tcp|udp|icmp 抓包




構建內網,samba啓動,怎樣外網能訪問




在forward上定義規則,注意問題

1.請求-響應均經由forward鏈,要注意規則的方向性;

2.竟可能的減少規則,可以啓用狀態追蹤,建議將雙方established狀態的報文直接放行,並且要將訪問可能性大的放前邊


保存:iptables-save|restore










第二節課開頭


layer7,7層過濾





處理動作


ACCEPT DROP REJECT


如何使用自定義鏈:

iptables -N icmp_rules


iptables -I forward -p -icmp -j icmp_rules


自定義鏈是被默認鏈調用生效,只要在-j後面做options就好



執行完成後,沒有繼續額規則,就返回主鏈,手動返回上級連用return ,當一條請求沒有被調用的自定義鏈匹配的時候,使用return,讓他回到主鏈再做匹配






端口映射|轉換:REDIRECT,table 是nat 有prerouting output


--to-ports ports[-prots]


iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j PREROUTING --to-port 8088



SNAT:table nat     有prerouting input


--to-source ipaddr[-ipaddr][:port][-port]


更改原地址

iptables -t nat -A postrouting -s 192.168.11.0 -p tcp -j SNAT --to-source 172.16.100.6




MASQUERADE

用於轉化的通信的地址是動態的時候,要用這個而不是snat,作用於上邊一樣,但是隻能用在postrouting


DNAT

用於公開本來是隱藏在網關後的某個主機的某個服務,並不是公開整個主機,只能用在prerouting和output


iptables -t nat -A PREROUTING -d 172.16.100.6 -p tcp --dport 80 -j DNAT --to-destination 192.168.11.2



--to-destination ipaddr[-ipaddr][:port][-port]


後面的port作用和REDIRECT作用一樣


可以不同服務不同主機,也可以同服務不同主機(類似後邊講的負載均衡)


LOG:記日誌,先記日誌再拒絕,不然的話,先拒絕那下邊的就不會再執行了,一定要放在控制規則之前


iptables -A INPUT -d 172.16.100.7 -p tcp --dport 8088 -j LOG --log-prefix "to 8088" --log-ip-options


--log-prefix

--log-ip-options











tcp-wrapper


庫文件:libwrap.so



配置文件:/etc/hosts.allow 放行 /etc/hosts.deny 拒絕


默認策略是放行


ldd -v 詳細信息


判斷一個命令是不是支持tcp-wrapper進行訪問控制的方法


1.動態鏈接到libwrap.so庫

ldd查看


2.靜態編譯庫文件到應用程序中

使用strings命令查看應用程序的文件中的字符串中是不是出現了/etc/hosts.allow /etc/hosts.deny



strings命令是打印文件可以打印的所有字符串



配置文件的語法格式


deamon_list:client_list[:options]


allow和deny都是這種格式


deamon_list:應用程序的文件名,例如DNS是named


1.單個應用程序的文件名

2.可以使程序文件名列表,號分割

3.ALL:所有可以收wrapper控制的應用程序


client_list

1.單個IP地址或主機名

2.網絡地址:必須使用完整格式的掩碼

3.域名:支持帶通配符的名稱

4.簡短格式網絡地址,例如172.16.注意:最後的這個.點不能省略

5.內建的ACL:

ALL

KNOWN:所有已知的 主機

UNKNOMN:未知

PARANOID:不一致的主機名,正反向解析的主機名不一致



練習:vsftpd只允許172.16網絡中的主機訪問


檢測次序先allow沒有匹配就檢查deny,deny匹配就拒絕,不匹配就默認,默認是放行,那就放行

如果allow匹配到了,不管deny匹不匹配都是允許



[:options]


deny

allow:一般在allow文件中使用deny選項表示拒絕,在deny文件中使用allow選項表示允許。。。。有病。。


EXCEPT:除了xxxxx



練習:vsftpd只允許172.16網絡中的主機訪問,但不包含172.16.200.2


allow:

vsftpd:172.16. EXCEPT 172.16.200.2

deny:

vsftpd:ALL EXCEPT 10. EXCEPT 10.10. EXCEPT 10.10.10. 


EXCEPT是奇數個允許,偶數個不允許,後邊加:allow就反過來了




spawn:生成,發起,運行


匹配到次規則後臨時運行一個外部的應用程序,多數情況是做日誌記錄//




























































iptables -A INPUT -d 127.0.0.1 -m string --string "admin" -m limit --limit rate 100/second -m time MON -j DROP

iptables -A OUTPUT -s 127.0.0.1 -j ACCEPT

iptables -A OUTPUT -j DROP





iptables -A INPUT -s 172.16.0.0/16 -d 127.0.0.1 -p tcp -m tate --state ESTABLISHED,RELATED -m time --weekdays MON-FRI -m time --timestart 08:00:00 --timestop 20:00:00 -j ACCEPT

iptables -A INPUT -s 172.16.0.0/16 -d 127.0.0.1 -o tcp --dpotr 21 -m state --state NEW -j ACCEPT



iptables -A INPUT -d 172.16.7.1 -p tcp --dport 21 -m iprange --src-range 172.16.7.1-172.16.7.100     


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