天天看點

Iptables詳解-快速從理論到實踐

本篇文章整理了 Iptables 的基本概念及入門知識,旨在幫助大家快速了解和使用 iptables。

1 什麼是Iptables

認識Netfilter

在講Iptables之前我們必須要先認識一下Netfilter;      
Netfilter是由Rusty Russell提出的Linux 2.4核心防火牆架構,該架構既簡潔又靈活, 可實作安全政策應用中的許多功能,如資料包過濾、資料包處理、位址僞裝、透明代理、動态網絡位址轉換(Network Address Translation,NAT),以及基于使用者及媒體通路控制(Media Access Control,MAC)位址的過濾和基于狀态的過濾、包速率限制等。

Netfilter是Linux作業系統核心層内部的一個資料包處理子產品,它具有如下功能:

- 網絡位址轉換(Network Address Translate)
- 資料包内容修改
- 資料包過濾防火牆      

 Netfilter 平台中制定了資料包的五個挂載點,這5個挂載點分别是

PRE_ROUTING

INPUT

OUTPUT

FORWARD

POST_ROUTING

Netfilter 所設定的規則是存放在核心記憶體中的,通過 Netfilter 放出的接口來對存放在核心記憶體中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables,鍊chains,規則rules組成。

認識Iptables

Iptables 是 Linux 防火牆工作在使用者空間的管理工具,用來設定、維護和檢查 Linux 核心的 IP 資料包過濾規則.

那麼Iptables和Netfilter到底什麼關系;

簡單來說就是Iptables配置規則,而Netfilter執行規則。
Iptables會把配置好的防火牆政策交給核心層的Netfilter網絡過濾器來處理.      

2 iptables主要特點

iptables主要特點

- 列出資料包過濾器規則集的内容
- 添加 / 删除 / 修改資料包過濾器規則集中的規則
- 列出 / 清零資料包過濾器規則集的每個規則計數器      

基本概念

iptables 可以檢測、修改、轉發、重定向和丢棄 IP 資料包。
其代碼已經内置于核心中,并且按照不同的目的被組織成表(table)的集合。表由一組預先定義的鍊 (chain) 組成,鍊包含周遊順序規則。
每一條規則包含條件比對和相應的動作(稱為目标),如果條件比對為真,該動作會被執行。      

下圖簡要描述了網絡資料包通過 iptables 的過程

檢視源圖像

Iptables詳解-快速從理論到實踐
當一個資料包進入網卡時,資料包首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉送出去.
如果資料包是進入本機的,資料包就會沿着圖向下移動,到達INPUT鍊。資料包到達INPUT鍊後,任何程序都會收到它。
本機上運作的程式可以發送資料包,這些資料包經過OUTPUT鍊,然後到達POSTROUTING鍊輸出.
如果資料包是要轉發出去的,且核心允許轉發,資料包就會向右移動,經過FORWARD鍊,然後到達POSTROUTING鍊輸出.      

3 四表五鍊

表(tables)

iptables 包含 4 張表(優先級為:raw > mangle > nat > filter):
   filter 表:用于存放所有有防火牆相關操作的預設表。
   nat 表:用于網絡位址轉換(例如:DNAT 和 SNAT)
   mangle 表:用于對特定資料包的修改
   raw 表:用于配置資料包,raw 中的資料包不會被系統跟蹤。      

在大多數情況下僅需要使用 filter 和 nat,不會用到 raw,mangle,這2張表用于更複雜的情況——包括多路由和路由判定。

鍊(chains)

鍊就是位置:共有五個

進路由(PREROUTING)
進系統(INPUT)
轉發(FORWARN)
出系統(OUTPUT)
出路由(POSTROUTING)      

表由鍊組成,鍊是一些按順序排列的規則的清單。Iptables 一共包含 5 條鍊:

INPUT 鍊:用于處理進入本機的資料包
OUTPUT 鍊:用于處理從本機輸出的資料包
FORWARD 鍊:用于轉發資料包
PREROUTING 鍊:用于在路由決策前對資料包做相關操作,經常用來做 DNAT
POSTROUTING 鍊:用于在路由決策後對資料包做相關操作,經常用來做 SNAT      

filter 表包含 INPUT、OUTPUT 和 FORWARD 3 條内建的鍊,

nat 表包含 PREROUTING、POSTROUTING 和 OUTPUT 鍊。

mangle 表包含 PERROUTING、POSTROUTING、INPUT、OUTPUT 和 FORWARD 鍊。raw 表包含 PREROUTING 和 OUTPUT 鍊。

預設情況下,任何鍊中都沒有規則。可以向鍊中添加自己想用的規則。

四表五鍊之間的關系如圖

Iptables詳解-快速從理論到實踐

4 規則

規則(rules)

資料包的過濾基于規則。規則由一個目标(資料包包比對所有條件後的動作)和很多比對(導緻該規則可以應用的資料包所滿足的條件)指定。

一個規則的典型比對事項是資料包進入的端口(例如:eth0 或者 eth1)、資料包的類型(ICMP、TCP 或者 UDP)和資料包的目的端口。

資料包通過防火牆的時候是按順序比對規則的,從上往下依次比對,一個包不符合某條規則,就會由後面的規則來處理,如果都不符合,就由預設的規則處理。

規則注意事項:

規則表示一條鍊上某個表的一些比對條件,比如拒絕某個 IP 通路
一個鍊上某個表可以設定多條規則
規則的順序很重要,一旦有一個規則比對成功了,後面的規則将會被忽略
如果所有規則沒有比對,那麼會有一個預設規則
修改規則的邏輯最好是先删除某條規則,再加入新的規則
iptables 所有的規則都儲存在 /etc/sysconfig/iptables
設定了新的規則後,必須使用 service iptables save 進行儲存或者使用iptable-save > /etc/sysconfig/iptables,否則重新開機後,新設定的規則将失效
一個規則中存在多個比對條件時,這些條件預設規則是與的關系,比如端口,IP必須滿足才算比對      

5 處理動作

處理動作(target)

ACCEPT:允許資料包通過。
DROP:直接丢棄資料包,不給任何回應資訊。
REJECT:拒絕資料包通過,必要時會給資料發送端一個響應的資訊,用戶端剛請求就會收到拒絕的資訊。
REDIRECT:在本機做端口映射。
SNAT:源位址轉換,解決内網使用者用同一個公網位址上網的問題。
MASQUERADE:是SNAT的一種特殊形式,适用于動态的、臨時會變的ip上。
DNAT:目标位址轉換。
LOG:在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則,也就是說除了記錄以外不對資料包做任何其他操作,仍然讓下一條規則去比對。      

6 iptables指令格式

Iptables詳解-快速從理論到實踐

指令格式(options)

iptables -t filter -I INPUT -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT      

文法選項(options)

[-t 表名]:該規則所操作的哪個表,可以使用filter、nat等,如果沒有指定則預設為filter
-A:新增一條規則,到該規則鍊清單的最後一行
-I:插入一條規則,原本該位置上的規則會往後順序移動,沒有指定編号則為1
-D:從規則鍊中删除一條規則,要麼輸入完整的規則,或者指定規則編号加以删除
-R:替換某條規則,規則替換不會改變順序,而且必須指定編号。
-P:設定某條規則鍊的預設動作
-nL:-L、-n,檢視目前運作的防火牆規則清單      

chain名:指定規則表的哪個鍊,如INPUT、OUPUT、FORWARD、PREROUTING等

[規則編号]:插入、删除、替換規則時用,--line-numbers顯示号碼

[-i|o 網卡名稱]:i是指定資料包從哪塊網卡進入,o是指定資料包從哪塊網卡輸出
[-p 協定類型]:可以指定規則應用的協定,包含tcp、udp和icmp等
[-s 源IP位址]:源主機的IP位址或子網位址
[--sport 源端口号]:資料包的IP的源端口号
[-d目标IP位址]:目标主機的IP位址或子網位址
[--dport目标端口号]:資料包的IP的目标端口号      
-m:extend matches,這個選項用于提供更多的比對參數,如:
-m state --state ESTABLISHED,RELATED
-m tcp --dport 22
-m multiport --dports 80,8080
-m icmp --icmp-type 8      
<-j 動作>:處理資料包的動作,包括ACCEPT、DROP、REJECT等
ACCEPT:允許資料包通過
DROP:直接丢棄資料包,不給任何回應資訊
REJECT:拒絕資料包通過,必要時會給資料發送端一個響應的資訊。
SNAT:源位址轉換。在進入路由層面的route之後,出本地的網絡棧之前,改寫源位址,目标位址不變,并在本機建立NAT表項,當資料傳回時,根據NAT表将目的位址資料改寫為資料發送出去時候的源位址,并發送給主機。
MASQUERADE,是SNAT的一種特殊形式,适用于像adsl這種臨時會變的ip上
DNAT:目标位址轉換。和SNAT相反,IP包經過route之前,重新修改目标位址,源位址不變,在本機建立NAT表項,當資料傳回時,根據NAT表将源位址修改為資料發送過來時的目标位址,并發給遠端主機。
REDIRECT:是DNAT的一種特殊形式,将網絡包轉發到本地host上(不管IP頭部指定的目标位址是啥),友善在本機做端口轉發。
LOG:在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則      

7 常見執行個體

儲存防火牆規則

iptables-save 
#儲存防火牆規則      

預設檢視 filter 表

iptables –nvL –t [filter|nat|mangle|raw]         
#預設檢視 filter 表
cat /etc/sysconfig/iptables
#檢視已儲存的防火牆規則      

重新開機iptables

service iptables restart
#重新開機iptables      

清除 iptables 規則

iptables -F -t [filter|nat|mangle|raw]             
#預設清除 filter 表
清空規則鍊中的資料包電腦和位元組計數器
iptables -Z -t [filter|nat|mangle|raw]             
#預設清除 filter 表      

定義規則鍊中的預設目标(動作)

iptables -P INPUT DROP               
#定義 filter 表的 INPUT 鍊預設目标為 DROP
iptables -P FORWARD ACCEPT           
#定義 filter 表的 FORWARD 鍊預設目标為 ACCEPT
iptables -P OUTPUT ACCEPT            
#定義 filter 表的 OUTPUT 鍊預設目标為 ACCEPT      

開放 IP / 協定 / port

iptables -A INPUT -s 192.168.1.100 -j ACCEPT     
#允許源 192.168.1.100 的資料包進入本機
iptables -A INPUT -p ospf -j ACCEPT            
#允許所有 ospf 協定資料包進入本機
iptables -A INPUT -p icmp -j ACCEPT            
#允許所有 icmp 協定資料包進入本機
iptables -A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT      
#允許本地回環
iptables -A INPUT -p tcp --dport 22 -j ACCEPT    
#允許通路 22 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT    
#允許通路 80 端口      

記錄日志

iptables -A PREROUTING -s 172.1.0.0/16 -i eth0 -j LOG  
#所有從 eth0 網卡進入的源 172.1.0.0/16 的資料包記錄在 log 日志中      

啟動網絡轉發規則

iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127      
#讓内網192.168.188.0/24使用公網 IP 210.14.67.127上網      

限速

iptables -I INPUT -p tcp -s 192.168.1.100 -m limit --limit=5000/s --limit-burst=100  -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.1.100 -j DROP      

參考文章

wikipedia netfilter Simplestatefulfirewall

繼續閱讀