Linux進階——iptables
netfilter/iptables(簡稱為iptables)組成Linux平臺下的包過濾防火牆,與大多數的Linux軟體一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網路地址轉換(NAT)等功能。
iptabels基礎
Netfilter元件
- Ø核心空間,整合在linux核心中
- Ø擴充套件各種網路服務的結構化底層框架
- Ø核心中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、 FORWARD、PREROUTING、POSTROUTING而這五個hook function 向用戶開放,使用者可以通過一個命令工具(iptables)向其寫入規則
- Ø由資訊過濾表(table)組成,包含控制IP包處理的規則集(rules),規則 被分組放在鏈(chain)上
三種報文流向:
- Ø流入本機:PREROUTING --> INPUT-->使用者空間程序
- Ø流出本機:使用者空間程序 -->OUTPUT--> POSTROUTING
- Ø轉發:PREROUTING --> FORWARD --> POSTROUTING
四表五鏈
filter表:過濾規則表,根據預定義的規則過濾符合條件的資料包
nat表:network address translation 地址轉換規則表
mangle:修改資料標記位規則表
raw:關閉NAT表上啟用的連線跟蹤機制,加快封包穿越防火牆速度
規則鏈:
1.INPUT——進來的資料包應用此規則鏈中的策略
2.OUTPUT——外出的資料包應用此規則鏈中的策略
3.FORWARD——轉發資料包時應用此規則鏈中的策略
4.PREROUTING——對資料包作路由選擇前應用此鏈中的規則
(記住!所有的資料包進來的時侯都先由這個鏈處理)
5.POSTROUTING——對資料包作路由選擇後應用此鏈中的規則
(所有的資料包出來的時侯都先由這個鏈處理)
連結串列關係圖
報文流入過濾匹配過程
核心中資料包的傳輸過程
- Ø 當一個數據包進入網絡卡時,資料包首先進入PREROUTING鏈,核心根據資料包目的 IP判斷是否需要轉送出去
- Ø 如果資料包就是進入本機的,資料包就會沿著圖向下移動,到達INPUT鏈。資料包 到達INPUT鏈後,任何程序都會收到它。本機上執行的程式可以傳送資料包,這些 資料包經過OUTPUT鏈,然後到達POSTROUTING鏈輸出
- Ø 如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過 FORWARD鏈,然後到達POSTROUTING鏈輸出
規則表之間的優先順序:
Raw——mangle——nat——filter
Iptables語法
規則rule:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動 作作出處理
- Ø 匹配條件:預設為與條件,同時滿足
基本匹配:IP,埠,TCP的Flags(SYN,ACK等)
擴充套件匹配:通過複雜高階功能匹配
- Ø處理動作:稱為target,跳轉目標
內建處理動作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG...
自定義處理動作:自定義chain,利用分類管理複雜情形
規則要新增在鏈上,才生效;新增在自定義上不會自動生效
鏈chain:
內建鏈:每個內建鏈對應於一個鉤子函式
自定義鏈:用於對內建鏈進行擴充套件或補充,可實現更靈活的規則組織管理機制;
只有 Hook鉤子呼叫自定義鏈時,才生效
iptables命令的管理控制選項
iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]-+
-t 不寫預設為預設為filter;其它可用的有raw, mangle, nat;
iptables命令選項
-A 在指定鏈的末尾新增(append)一條新的規則 -D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除 -I 在指定鏈中插入(insert)一條新的規則,預設在第一行新增 -R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換 -L 列出(list)指定鏈中所有的規則進行檢視
-n:numeric,以數值格式顯示;
-v:verbose,顯示詳細格式資訊;
-vv, -vvv
-x:exactly,計數器的精確結果;
--line-numbers:顯示鏈中的規則編號;
-E 重新命名使用者定義的鏈,不改變鏈本身 -F 清空(flush) -N 新建(new-chain)一條使用者自己定義的規則鏈 -X 刪除指定表中使用者自定義的規則鏈(delete-chain) -P 設定指定鏈的預設策略(policy) -Z 將所有表的所有鏈的位元組和資料包計數器清零 -n 使用數字形式(numeric)顯示輸出結果 -v 檢視規則表詳細資訊(verbose)的資訊 -V 檢視版本(version) -h 獲取幫助(help)
-P策略,定義預設策略
防火牆處理資料包的四種方式
ACCEPT 允許資料包通過
DROP 直接丟棄資料包,不給任何迴應資訊
REJECT 拒絕資料包通過,必要時會給資料傳送端一個響應的資訊。
LOG在/var/log/messages檔案中記錄日誌資訊,然後將資料包傳遞給下一條規則
iptables防火牆規則的儲存與恢復
iptables-save把規則儲存到檔案中,再由目錄rc.d下的指令碼(/etc/rc.d/init.d/iptables)自動裝載
使用命令iptables-save來儲存規則。一般用
iptables-save > /etc/sysconfig/iptables生成儲存規則的檔案 /etc/sysconfig/iptables,
也可以用
service iptables save它能把規則自動儲存在/etc/sysconfig/iptables中。
當計算機啟動時,rc.d下的指令碼將用命令iptables-restore呼叫這個檔案,從而就自動恢復了規則。
匹配條件:
多重條件:邏輯關係為“與”;
基本匹配條件:!表示可取反,基本條件若不寫則預設為最大值
[!] -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
擴充套件匹配條件
隱式擴充套件:不用-m選項指出matchname即可使用此match的專用選項進行匹配;
-p tcp:隱含了-m tcp;
[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源埠;
[!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標埠;
[!] --tcp-flags mask comp
mask:要檢查的標誌位列表,以逗號分隔;
comp:必須為1的標誌位列表,餘下的出現在mask列表中的標誌位則必須為0;
--tcp-flags SYN,ACK,FIN,RST SYN
[!] --syn:
相當於--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隱含了-m udp:
[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源埠;
[!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標埠;
-p icmp:隱含了-m icmp:
[!] --icmp-type {type[/code]|typename}
8:echo-request
0:echo-reply
顯式擴充套件:必須使用-m選項指出matchname,有的match可能存在專用的選項;
常用的iptables規則
在iptables規則中沒有匹配到規則則使用預設規則進行處理
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
配置SSH規則
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
如果你把OUTPUT 設定成DROP,就需要加上這個規則,否則SSH還是不能登入,因為SSH服務職能進不能出。
只允許192.168.0.3的機器進行SSH連線
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允許,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
允許loopback迴環通訊
IPTABLES -A INPUT -i lo -p all -j ACCEPT
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
目的地址轉換,對映內部地址
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dprot 81 -j DNAT --to 192.168.0.1-192.168.0.10
源地址轉換,隱藏內部地址
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
地址偽裝,動態ip的NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
masquerade和snat的主要區別在於,snat是把源地址轉換為固定的IP地址或者是地址池,而masquerade在adsl等方式撥號上網時候非常有用,因為是撥號上網所以網絡卡的外網IP經常變化,這樣在進行地址轉換的時候就要在每次都要修改轉換策略裡面的ip,使用masquerade就很好的解決了這個問題,他會自己去探測外網絡卡獲得的ip地址然後自動進行地址轉換,這樣就算外網獲得的ip經常變化也不用人工干預了。
開啟轉發功能
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 只允許已建連線及相關連結對內轉發
iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT 允許對外轉發
過濾某個MAC
iptables -A FORWARD -m mac --mac -source MAC地址 -j DROP
報文經過路由後,資料包中原有的MAC資訊會被替換,所以在路由後的iptables中使用mac匹配沒有意義。
資料包整流
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
多埠匹配
iptables -A INPUT -p tcp -m muliport --dport s 21,22,25,80,110 -j ACCEPT
丟棄非法連線
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables-A FORWARD -m state --state INVALID -j DROP
儲存於恢復iptables規則
iptables-save > somefile
iptables-restore < somefile