iptables系列之基礎原理
linux:網絡防火墻
netfilter:frame 框架 網絡過濾器
iptables:數據報文過濾,NAT,mangle等規則生成的工具。
網絡知識:
IP報文首部
tcp報文首部
ip:tcp:http
IP報文首部:
版本號4 頭部長度4 服務類型8 總長度16
段標識符16 R1 DF1 MF1 片偏移13
TTL8 協議8 首部校驗和
源ip32
目的ip32
可選
數據
分段和重組
DF:don't fragment
MF:more fragment
片偏移:8的整數倍
協議:封裝的報文的協議
icmp:3層協議直接使用IP
udp 17 tcp 69
端口號:0--65535
0---1023 系統
>=5000用戶
tcp:有狀態的協議,三次握手
TCP首部
源端口16 目的端口16
序列號32
確認號32
頭部長度4 R6 URG1 ACK1 PSH1 RST1 SYN1 FIN1 窗口大小16
校驗和16 緊急指針
選項
數據
注意:數據的流向
序列號:發送方告訴接受方發送的數據的編號
確認號:接受方期望接受下一個序列的第一個序號。
流控:滑動窗口。
重傳;計時器
URG:緊急指針是否有效
ACK:說明確認號是否有效
PSH:推送,要優先處理的數據
RST:重置
SYN:同步請求,建立連接
FIN:斷開連接
轉換為能夠通過網絡發送的數據格式
文本
二進制
TCP的三次握手
TCP的四次斷開
被動打開:closed---->listen
主動打開:closed---->syn_sent
listen--->SYN_RCVD---->established
closed---->syn_sent---->established
三次握手 四次斷開
TCP的有限狀態機
TCP的狀態轉移:
主動關閉方:
established--->fin-wait-1----->fin-wait-2---->time-wait---->closed
被動關閉方:
established---->closed-wait---->last-ack------>closed
2MSL:最長報文段壽命
fin-wait-1---->closing--->time-wait--->closed
防火墻
工作在主機或網絡的邊緣,對進出主機或網絡的數據報進行檢查與監控,并且根據事先定義的規則,匹配其規則,采取定義的處理的動作進行操作的組件。
防火墻:硬件,軟件,規則(匹配標準,處理辦法)
framework:框架 (不防家賊)
默認規則:
開放:堵
關閉:通
服務器:默認允許已知,拒絕未知
規則:匹配標準
IP:源ip,目標ip
TCP/UDP:sport,DPORT,URS,ACK,PSH,RST,SYN,FIN
ICMP:icmp-type 控制消息報文協議 報文類型
數據報文過濾:
網絡功能:是內核空間實現的
內核中為用戶空間中命令預留一些空間
在內核中TCP/IP的模塊上開放一些位置,只是開放給用戶空間可以編寫防火墻規則的命令。可以實現用戶中的命令可以直接操控內核空間的。
內核中的工作框架,用戶空間中的管理工具。
syscall:可以和內核直接打交道。
linux2.0
ipfw/firewall
linux2.2
ipchain/netfilter,firewall
linux2.4
iptables(用戶空間中可以寫規則的用戶空間中的應用,規則生成器)/netfilter(內核中可以放置的空間)
內核中netfilter
TCP/IP模塊
網卡(拆幀)--->IP---本機->進程--->
|----->轉發--->網卡
IP---->網卡--->用戶
報文的流向類型:(取決于IP)
1.從外面進入主機內部到達進程
2.本機內部出去的報文
3.通過主機進行轉發的
檢查路由表 ,路由決策
路由決策發生在數據包文件被網卡接受后進入主機后,進入TCP/IP協議棧模塊時進行路由決策。
上述的三個位置是內核空間讓iptables在內核空間中放置規則的地方。
進,出,轉發
/proc/sys/net/ipv4/ip_forward
-s 0.0.0.0 -d 172.16.100.7 reject
hook function:鉤子函數
netfilter設計者放在TCP/IP上的鉤子函數。
自上而下,挨個檢查,匹配前一個了,就不檢查下面的了。
規則定義技巧:
若兩條規則不相關,就將范圍大的規則放在上面,匹配的可能性大。(http訪問頻繁的放在上面。)
若兩條規則相關,則將范圍小的規則放在上面,防止規則覆蓋與疏漏。
hook function:5個
路由之前的位置
報文在即將轉發之前的位置 做地址轉換的
通俗的說,netfilter的架構就是在整個網絡流程的若干位置放置了一些檢測點(HOOK),而在每個檢測點上登記了一些處理函數進行處理(如包過濾,NAT等,甚至可以是 用戶自定義的功能)。
IP層的五個HOOK點的位置
[1]:NF_IP_PRE_ROUTING:剛剛進入網絡層的數據包通過此點(剛剛進行完版本號,校驗
和等檢測), 目的地址轉換在此點進行;
[2]:NF_IP_LOCAL_IN:經路由查找后,送往本機的通過此檢查點,INPUT包過濾在此點進行;
[3]:NF_IP_FORWARD:要轉發的包通過此檢測點,FORWARD包過濾在此點進行;
[4]:NF_IP_POST_ROUTING:所有馬上便要通過網絡設備出去的包通過此檢測點,內置的源地址轉換功能(包括地址偽裝)在此點進行;
[5]:NF_IP_LOCAL_OUT:本機進程發出的包通過此檢測點,OUTPUT包過濾在此點進行。
netfilter
是由Rusty Russell提出的Linux 2.4內核防火墻框架,該框架既簡潔又靈活,可實現安全策略應用中的許多功能,如數據包過濾、數據包處理、地址偽裝、透明代理、動態網絡地址轉換(Network Address Translation,NAT),以及基于用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基于狀態的過濾、包速率限制等。
框架
netfilter提供了一個抽象、通用化的框架[1],作為中間件,為每種網絡協議(IPv4、IPv6等)定義一套鉤子函數。Ipv4定義了5個鉤子函數,這些鉤子函數在數據報流過協議棧的5個關鍵點被調用,也就是說,IPv4協議棧上定義了5個“允許垂釣點”。在每一個“垂釣點”,都可以讓netfilter放置一個“魚鉤”,把經過的網絡包(Packet)釣上來,與相應的規則鏈進行比較,并根據審查的結果,決定包的下一步命運,即是被原封不動地放回IPv4協議棧,繼續向上層遞交;還是經過一些修改,再放回網絡;或者干脆丟棄掉。
NAT
:network address transfer
sip:172.16.100.6 dip:100.2.2.1------>sip:12.1.1.6 dip:100.2.2.1 數據報文出去修改地址 源地址轉換
返回的響應的報文:
sip:100.2.2.1 dip:12.1.1.6 ----->sip:100.2.2.1 dip:172.16.100.6
目標地址轉換
注意:主機內部維護著一張地址映射表。
源地址轉換是在報文即將離開網卡的時候修改源地址。
目標地址轉換是在報文剛剛進入網卡的時候修改目標地址。
SNAT:
DNAT:
NAT
靜態轉換
動態轉換
端口多路復用(PAT)
ALG(Application Level Gateway),即應用程序級網關技術
hook function:鉤子函數
prerouting
input
output
forward
postrouting
規則鏈:
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
filter(過濾): 表
INPUT
OUTPUT
FORWARD
nat(地址轉換):表
PREROUTING
OUTPUT
POSTROUTING
mangle(修改報文首部,拆開,修改,封裝):表
PREROUTING
INPUT
OUTPUT
FORWARD
POSTROUTING
raw():
PREROUTING
OUTPUT
注意:不同功能的不能放在一起。
iptables:
數據包過濾順序:
raw:PREROUTING
mangle:PREROTING
nat:PREROUTING -------|
\|/
|-------- 路由選擇--------------|
\|/ \|/
magle:INPUT mangle:FORWARD
filter:INPUT filter:FORWARD
\|/ |
路由選擇 |
\|/ |
raw: OUTPUT |
mangle:OUTPUT |
nat:OUTPUT |
filter:OUTPUT |
| |
| |
|-------> mangle:POSTROUTING <---|
nat: POSTROUTING
iptables:
四個表五個鏈
表:raw,mangle,nat,filter
鏈:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
itables:
可以使用自定義鏈:
一個鉤子函數hook function就是一個鏈。
自定義鏈只有被默認鏈調用才可以使用。
自定義
自定義鏈是為了精簡鏈,調高鏈的效率。
可以使用自定義鏈,但是在被調用是才能發揮作用,而且如果沒有自定義鏈中任何規則匹配,還應該有返回機制:
用戶可以刪除自定義空鏈
不可以刪除默認鏈
每條規則都有兩個內置計算器
被匹配到的報文個數。
被匹配的報文大小之和。
規則:匹配標準,處理動作
iptables [-t table] subcommand CHAIN [num] 匹配標準 -j 處理辦法
匹配標準:
通用匹配
擴展匹配(使用擴展模塊,依賴于模塊進行匹配)
隱含擴展:不用特別指明由哪個模塊進行的擴展,因為此時使用-p {tcp|udp|icmp}
顯示擴展:必須指明由哪個模塊進行的擴展,在iptables中使用-m選項可完成此功能。
匹配標準:
通用匹配:
-s,--src :指定源地址
-d,--dst :指定目標地址
-p {tcp|udp|icmp}:指定協議
-i interface:指定數據報文流入的接口
可用于定義標準的鏈:PREROUTING,INPUT,FORWARD
-o interface:指定數據報文流出的接口
可用于定義標準的鏈:OUTPUT,POSTROUTING,FORWARD
-j 處理辦法 -j 跳轉
-j TARGET
ACCEPT :接受
DROP :默默丟棄
REJECT :拒絕并通知
iptables -t filter -A INPUT -s 172.160.0.0/16 -d 172.16.100.7 -j DROP