Linux之netfilter與iptables學習
一、為什么我們的主機需要防火墻
二、Linux下防火墻如何實現
三、四表五鏈學習
四、主機防火墻
五、網絡防火墻
六、iptables命令學習
七、主機防火墻規則備份與恢復
======================================
一、為什么我們的主機需要防火墻?
1、防止不合理的用戶,通過不合理的手段登錄系統搞破壞,
2、企圖通過攻擊手段組織其繼續為用戶提供服務,
3、尤其當我們的主機需要提供互聯網服務的時候,安全性就不言而喻,
二、Linux下防火墻如何實現?
1、iptables,這個只是方便用戶編寫各類規則交由netfilter處理執行。
2、一部分是基于TCP/IP協議棧的netfilter安全框架,通過“數據報文進入主機,內核處理完成,
交由用戶空間處理,在由內核處理完成并響應給客戶”,
數據報文的處理路徑設置了各種規則鏈,根據規則鏈的順序或者特點,
又在規則鏈中增加功能表,通過在不同的功能表中設置具體的規則,來達到安全訪問。
那么netfilter的規則定義是如何來達到安全訪問的效果呢?
首先我們應該知道主機之間的通信是數據流,是參考OSI七層模型來包裝用戶的數據,OSI七層包括了
應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層,物理層,每一層都有其自己的功能,
netfilter就是通過識別每一層功能中的數據是否符合我們定義的規則,從而達到監控,修改,丟棄,轉發的目錄。
我們學習的防火墻主要部分是監控網絡層,傳輸層,少部分應用層數據。如上圖類似主機間通信的數據。
三、四表五鏈:
四表:
1、raw: 關閉NAT,ip_conntrack(連接跟蹤)
2、mangle: 拆開數據,修改數據,封裝數據
3、nat: 源,目的IP地址轉換
4、filter: 過濾
執行的優先級順序是:1 > 2 > 3 >4
五鏈(數據報文處理路徑上的五個鉤子):
1、PREROUTING: 路由前鏈
2、INPUT: 進入用戶空間鏈
3、FORWARD: 轉發鏈
4、OUTPUT: 用戶空間出去鏈
5、POSTROUTING: 路由后鏈
四、主機防火墻:
對于主機防火墻而言(主機就是報文的響應方,處理完成之后,主機在發送響應給請求方),四表五鏈工作模型(默認情況下并不是所有的鏈上都必須要有所有的功能規則表,這是設計者精巧設計):
說明(數據包經過防火墻被處理):
1、數據包經過網絡傳輸,到達主機網卡緩沖區,接著被內核加載到內核內存空間,
2、數據報文經過PREROUTING鏈,
1、規則表匹配順序raw–>mangle–>nat,
2、每個規則表中有N多規則,
3、被PREROUTING鏈處理過后的數據將會轉發給INPUUT鏈
1、規則表匹配順序mangle–>filter,
2、通常需要阻止別人訪問,或者開放服務給用戶都是在此filter規則表中設定
4、用戶空間:程序運行時生成的進程監聽在某個套接字(端口)上,內核拆分數據報文到傳輸層時(TCP/UDP),檢查數據報文的目的端口,進而轉交給其監控的進程處理。
用戶空間處理完數據包之后,會將需要返回給用戶的數據重新打包,交給內核,由內核將數據封裝(封裝傳輸層,網絡層,數據鏈層報文頭部),
這里的封裝就會參考OUTPUT鏈與POSTROUTING鏈,
5、數據報文到達OUTPUT鏈
1、規則表匹配順序:raw–>mangle–>nat–>filter
6、數據報文被OUTPUT鏈處理完畢之后接著交給POSTROUTING
1、規則表匹配順序:mangle–>nat
五、網絡防火墻:
網絡防火墻的意思是提供數據包轉發,數據報文的最終目的地址并不是本機防火墻,需要開啟forward功能
網絡防火墻管控修改數據包源,目的IP地址與過濾數據報文。
六、IPTABLES命令學習(編寫規則表):iptables并不是服務,沒有進程,是工作在內核
命令學習:
鏈管理: | 規則管理: | 查看: | |||
-F | Flush 清空規則鏈 | -A | Append 將規則追擊到指定鏈的最后 | -L | List 列出指定鏈的規則 |
-N | New 創建新的自定義規則鏈 | -I | Insert 插入一條規則,不給序號就是第一條 | -n | Number數字顯示IP與端口號 |
-X | 刪除用戶自定義鏈 | -D | Delete 刪除規則 | -v,-vv,-vvv | 顯示詳細信息 |
-Z | Zero 清零,規則計數器重置為零 | -R | Replace 替換規則 | –line-numbers | 顯示規則編號 |
-P | Policy 為指定的規則鏈設置默認策略 | -x | 顯示計數結果精確值 | ||
-E | rEname 重命名自定義鏈 | ||||
-j | 指定被規則匹配后所要執行的動作,ACCEPT(允許),DROP(丟棄),REJECT(拒絕),RETURN(返回),REDIRECT(重定向),LOG(記錄日志),MARK(標記),DNAT(目的地址轉換),SNAT(源地址轉換),MASQUERADE(地址偽裝) |
例子:
~]# iptables -t nat -L #查看nat表中規則鏈與規則
匹配條件:
基本匹配:
[!] -s -src –source [ip|network] 數據報文源地址匹配,[!]表示取反
[!] -d -dst –destination [ip|network] 數據報文目的地址匹配,[!]表示取反
-p –protocol [tcp|udp|icmp] 傳輸層協議
-i –in-interface 指定數據報文入接口 ##仔細想想只能用在PREROUTING,FORWARD,INPUT鏈上
-o –out-interface 指定數據報文This test Page abcdefgh出接口 ##仔細想想只能用在OUTPUT,FORWARD,POSTROUTING鏈上
隱含擴展匹配:
-p tcp {–sport,–dport,–tcp-flage,–sync}
例:–tcp-flage SYN,ACK,FIN,RST SYN 表示匹配TCP數據報文中TCP首部SYN,ACK,FIN,RST四個關鍵字位置,并且只有SYN為1,能可以,其它三個位置必須為0(TCP三次握手的第一次)
-p udp {–sport,–dport}
-p icmp –icmp-type icmp類型有很多,常用就是類型為0的表示ping應答(Echo reply) 類型8為ping請求(Echo request)
顯示擴展:使用-m macth_name –spec_options,必須指明使用的擴展模塊(重點)
一、multiport:指定多端口
使用方法:
[!] –source-ports,–sports port[,port|,port:port]…
~]# iptables -A INPUT -d 192.168.3.21 -p tcp -m multiport –dports 53:80,111 -j ACCEPT
#沒有指定源IP地址,表示任意源IP地址訪問本機192.168.3.31這個IP的TCP協議,目的端口是53~80的所有端口,加上111這個端口
[!] –destination-ports,–dports port[,port|,port:port]…
[!] –ports port[,port|,port:port]…
~]# iptables -A INPUT -d 192.168.3.21 -p tcp -m multiport –dports 22,80,443 -j ACCEPT #此規則類似,
二、iprange:指定IP地址范圍
使用方法:
[!] –src-range from[-to]
~]# iptables -A INPUT -d 192.168.3.21 -p tcp –dport 443 -m iprange –src-range 192.168.3.1-192.168.3.50 -j ACCEPT
[!] –dst-range from[-to]
三、string:指定的字符
使用方法:
–algo {bm|kmp} bm與kmp是匹配字符串的算法
~]# iptables -A OUTPUT -s 192.168.3.21 -p tcp –sport 80 -m string –algo bm –string "abcdefg" -j DROP
#當192.168.3.21這臺web服務器網頁上出現abcdefg字符,網站就不能被訪問了
四、time:訪問時間控制
使用方法
–datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
~]#iptables -A OUTPUT -s 192.168.3.10 -p tcp –sport 80 -m time –timestart 07:00 –timestop 23:00 -j ACCEPT
#每天的早上7點到晚上23點才能訪問
[!] –monthdays day[,day…]
[!] –weekdays day[,day…] Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7,
~]#iptables -A OUTPUT -s 192.168.3.10 -p tcp –sport 80 -m time ! –weekdays 6,7 -j ACCEPT
#星期6,星期7取反,也就是只能星期一到星期五訪問
五、conntlimit:連接限制
使用方法:
[!] –connlimit-above n
~]# iptables -I INPUT -d 192.168.3.10 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP
#表示對連接22端口限制最大連接數為3,在規則生效時,在線的ssh服務,不算,之后退出重新連接就算
–connlimit-mask
~]# iptables -p tcp –syn –dport 80 -m connlimit –connlimit-above 16 –connlimit-mask 24 -j REJECT
#這個有點意思,限制C類網絡地址(掩碼是24的),http并發連接不超過16個,
#假如說我們的客戶端地址是192.168.3.0/24,我們這個網段內的所有地址一起發起http請求并發,不能超過16個,
六、limit:報文速率限制
使用方法:
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
~]# iptables -I INPUT -d 192.168.3.10 -p tcp –dport 443 -m limit –limit 100/minute -j DROP
#每分鐘限制100個報文,多的會DROP掉
七、state:連接狀態追蹤,nf_conntrack
有了狀態連接之后,我們可以在OUTPUT方向只放行已經建立連接的數據(在沒有啟用state功能是,對于規則的編寫要考慮到進出兩個方向),
狀態類別有:
NEW:新建連接
ESTABLISHED:正在建立連接
RELATED:相關連接(FTP被動模式的控制連接與數據連接)
INVALID:無效的連接
[!] –state state:
~]# iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT
#已經建立的連接OUTPUT方向直接放行流量
~]# iptables -I INPUT -d 192.168.3.10 -p tcp -m multiport –dports 22,80,53 -m state –state NEW,ESTABLISHED -j ACCEPT
#對于訪問192.168.3.10的22,80,53服務,新建或者已經建立連接的流量直接放行
八、還有很多顯示擴展的高級功能,我們需要多多man iptables
七、主機防火墻規則備份與恢復:
規則保存:~]# iptables-save > iptables-rules
規則恢復:~]# iptables -restore < iptables-rules
FTP特殊放行:需要加載單獨對FTP放行的模塊
/lib/modules/2.6.32-573.el6.x86_64/kernel/net/netfilter/nf_conntrack_ftp.ko 模塊位置
~]# modprobe nf_conntrack_ftp #加載模塊
~]# iptables -A INPUT -d 192.168.3.10 -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
~]# iptables -A INPUT -d 192.168.3.10 -p tcp -m state –state RELATED -j ACCEPT
~]# iptables -I INPUT -s 192.168.3.10 -p tcp -m state –state ESTABLISHED -j ACCEPT
原創文章,作者:nice_neo_linux,如若轉載,請注明出處:http://www.www58058.com/18952