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),即應用程式級網關技術
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