天天看點

iptables學習筆記

關于iptables

Linux的防火牆體系主要工作在網絡層,針對TCP/IP資料包實施過濾和限制,屬于典型的包過濾防火牆(或稱網絡層防火牆)。iptables是一個指令行防火牆實用程式,它使用政策鍊來允許或阻止通信。當連接配接試圖在你的系統上建立自己時,iptables在它的清單中尋找一條規則來比對它。如果找不到,則采取預設操作。

netfilter/iptables過濾防火牆系統是一種功能強大的工具,可用于添加、編輯和除去規則,這些規則是在做資訊包過濾決定時,防火牆所遵循群組成的規則。這些規則存儲在專用的資訊包過濾表中,而這些表內建在Linux核心中。在資訊包過濾表中,規則被分組放在我們所謂的鍊(chain)中。

雖然netfilter/iptables包過濾系統被稱為單個實體,但它實際上由兩個元件netfilter 和 iptables 組成。

netfilter 元件也稱為核心空間(kernelspace),是核心的一部分,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。

iptables 元件是一種工具,也稱為使用者空間(userspace),它使插入、修改和除去資訊包過濾表中的規則變得容易。

iptables工作原理

iptables的原理就是通過iptables中的規則對資料包進行控制,iptables中定義了5條鍊,每條鍊中可以定義多條規則,每當資料包到達一個鍊,iptables就會從鍊中第一條規則開始檢查,看該資料包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該資料包;否則iptables将繼續檢查下一條規則,如果該資料包不符合鍊中任一條規則,iptables就會根據該鍊預先定義的預設政策來處理資料包

1.一個資料包進入網卡時,它首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉發出去。

2.如果資料包就是進入本機的,它就會沿着圖向上移動,到達INPUT鍊。資料包到了INPUT鍊後,任何程序都會收到它。本機上運作的程式可以發送資料包,這些資料包會經過OUTPUT鍊,然後到達POSTROUTING鍊輸出。

3.如果資料包是要轉發出去的,且核心允許轉發,資料包就會如圖所示向右移動,經過 FORWARD鍊,然後到達POSTROUTING鍊輸出。

iptables過濾流程

防火牆是一層層過濾的。實際是按照配置規則的順序從上到下,從前到後進行過濾的。

如果比對上規則,即明确表是阻止還是通過,此時資料包就不在向下比對新規則了。

如果所有規則中沒有明确是阻止還是通過這個資料包,也就是沒有比對上新規則,向下進行比對,直到比對預設規則得到明确的組織還是通過

防火牆的預設規則是對應鍊的所有規則執行完才會執行的。

iptables表、鍊、規則

iptables規則

規則就是網絡管理者在iptables上預定義的條件,規則一般定義為“如果資料標頭符合這樣的條件,就處理這個資料包”,規則存儲在核心空間的資訊包過濾表中,這些規則分别指定了源位址、目的位址、傳輸協定(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當資料包與規則比對時,iptables就根據規則所定義的方法來處理這些資料包,如放行(accept)、拒絕(reject)和丢棄(drop)等。配置防火牆的主要工作就是添加、修改和删除這些規則。

iptables鍊

上述規則一般都是有很多條, 将很多條規則串起來, 即形成了(規則)鍊. 核心檢查的時候, 按照鍊中的順序, 一條條的進行檢查,可以将鍊比做成一個檢查站,每個要經過檢查站的資料包,都會對其進行檢查,檢視資料包是否符合檢查站上的規則,如果有符合條件的規則,則執行規則相應的動作。Iptables上定義了五條預設的規則鍊,分别為INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。其應用時間點分别對應如下:

INPUT鍊:通過路由表後目的地為本機,應用此鍊中的規則。

OUTPUT鍊:由本機産生, 向外轉發時,應用此鍊中的規則。

FORWARD鍊:通過路由表後,當接收到需要通過防火牆發送給其他位址的資料包(轉發)時,應用此鍊中的規則。

PREROUTING鍊:在對資料包作路由選擇之前,應用此鍊中的規則。

POSTROUTING鍊:在對資料包作路由選擇之後,應用此鍊中的規則。

iptables表

我們把具有相同功能的規則的集合叫做表,是以說,不同功能的規則,我們可以放置在不同功能的表中進行管理,iptables中定義了四張表,每張表對應了不同的功能,每張表的功能如下:

Filter:一般的資料包過濾,Filter表是預設的表,如果沒有指定哪個表,iptables 就預設使用filter表來執行所有指令

Nat:網絡位址轉換(端口映射,位址映射等,可以使用nat表進行區域網路共享上網)

Managle:用于對特定資料包的修改(修改資料包的服務類型、TTL、并且可以配置路由實作QOS)

Raw:決定資料包是否被狀态跟蹤機制處理,raw表優先級最高

表的處理優先級: raw> mangle > nat > filter

表鍊關系

上面說了,表是具有相同功能的規則的集合,而鍊是有多條規則串起來的,那麼可以想一下,有些鍊是沒有具備某種功能的規則的,也就是說,有些鍊上的規則隻存在于某些表中,比如,postrouting鍊的規則隻存在于managle表和nat表,下圖是iptables表與鍊的對應關系圖:

iptables學習筆記

iptables指令操作

iptables指令格式

Iptables[-t 表] [-指令參數 鍊] [-比對條件 {擴充比對}] [-j 動作]

iptables指令參數

-P  —policy       <鍊名>  設定指定鍊的預設政策

-L  —list         <鍊名>  列出所選鍊中的所有規則。 如果未選擇鍊, 則列出所有鍊。

-A  —append       <鍊名>  将一個或多個規則追加到標明鍊的末尾。

-I  —insert       <鍊名>  在指定的位置插入1條規則,如果沒有指定規則号,則預設插傳入連結的頂部

-D  —delete       <鍊名>  從標明的鍊中删除一個或多個規則。

-R  —replace       <鍊名>  替換標明鍊中的規則。

-F  —flush        <鍊名>  删除表中所有規則

-Z  —zero         <鍊名>  将所有鍊中的資料包和位元組計數器,或者隻給定的鍊,或者隻有鍊中給定的規則歸零。

-X  —delete-chain  <鍊名>  删除使用者自定義的鍊,如果沒有給出參數,删除所有非内建鍊

-v  —verbose       <鍊名>  與-L他指令一起使用顯示更多更詳細的資訊

-C  —check        <鍊名>    檢查鍊規則-規範檢查所選鍊中是否存在與規範比對的規則。此指令使用與-D相同的邏輯來查找比對項, 但不會更改現有的 iptables 配置, 并使用其退出代碼訓示成功或失敗。

-N —new-chain   <鍊名>   建立一條使用者自定義的規則鍊

-E –-rename-chain <舊鍊名> <新鍊名> 将使用者指定的鍊重命名

—line-numbers : 顯示規則的行号

-n   以數字的方式顯示位址或端口資訊

iptables比對規則

! 在比對規則前面加上!表示取反

-p   #指定協定類型,類型可以是tcp,udp,udplite,icmp,icmpv6,esp,sctp或者特殊關鍵字‘all’

—sport #指定源端口或者端口範圍

—dport #指定目标端口或者端口範圍

-s —src       #指定資料包的源位址或源網段

-d —dst     #指定資料包的目标位址或目标網段

-i     #資料包進入的網卡

-o     #資料包出去的網卡

-m —match #指定資料包規則所使用的子產品

iptables擴充子產品

-m state —state  #比對狀态(狀态包括NEW,ESTABLISHED,RELATED,INVALID)

-m multiport —dports|—sports #表示比對多個不連續的端口,使用dports指定目标端口号,sports指定源端口号

-m iprange —src-range 192.168.0.2-192.168.0.20#指定一段連續的IP位址段

-m limit —limit 3/minute  #指定時間内的請求速率

-m limit —limit-burst 3   #在同一時間内允許通過的請求數量

-m string —algo bm|kmp —string“xxxx” #使用string比對字元串,algo表示設定字元比對的查詢算法,一般預設使用bm算法

-m time —timestart 8:00 —timestop12:00  #表示某個時間段

-m time —datestart 2018-5-28T8:00 —datestop2018-5-29T8:00 #定義一個絕對的時間範圍

-m time —weekdays|monthdays6,7|20,21  #指定每周的周幾或者每月的幾号

-m icmp —icmp-type type[/code]  #比對icmp協定的不同類型,可以使用iptables -m icmp -h 檢視icmp協定所有的類型

可以使用‘iptables -m 擴充子產品-h’檢視子產品的使用幫助

iptables動作

ACCEPT   #允許資料包通過

DROP      #丢棄資料包

REJECT    #攔阻該資料包,并傳回資料包通知對方,可以使用—reject-with選項設定提示資訊,可以設定的提示資訊有icmp-net-unreachable、icmp-host-unreachable、icmp-proto-unreachable、icmp-port-unreachable、icmp-net-prohibited、icmp-host-prohibited、icmp-admin-prohibited、tcp-reset

LOG    #對符合條件的封包的相關資訊記錄在日志中

SNAT    #源位址轉換,用于區域網路共享上網,隐藏内網IP

DNAT    #目的位址轉換,可配置外網通路内網服務

MASQUERADE   #位址僞裝,與SNAT不同的是,他不需要指定映射的IP,它會自動将源IP映射給外網網卡上可用的IP位址

REDIRECT    #端口重定向,可以将本機的端口映射到另一個端口上

MARK         #給資料包打上标記,可為後續過濾的條件判斷依據

iptables執行個體

檢視iptables詳細規則

iptables -nvL

禁止所有人通路22端口

iptables -A INPUT -p tcp —dport22 -j DROP

隻允許173.168.16.0網段通路22端口

iptables -I INPUT -s173.168.16.0/24 -p tcp —dport 22 -j ACCEPT

允許關聯的狀态包通過

iptables -A INPUT -m state —stateESTABLISHED,RELATED -j ACCEPT

允許通路Samba服務的137與138這兩個udp端口

iptables -A INPUT -p udp —dport 137 -j ACCEPT

iptables -A INPUT -p udp —dport138 -j ACCEPT

禁止别人ping通自己主機

iptables -A INPUT -p icmp -micmp —icmp-type 8 -j REJECT

iptables -A OUTPUT -p icmp -micmp —icmp-type 0 -j REJECT

數字8代表的是icmp封包的類型為8,也就是‘echo-request’,表示回應要求,

而數字0代表icmp封包的類型為0,也就是‘echo-reply’,表示回應答覆,更多icmp封包的類型和編可以使用‘iptables -m icmp -h’檢視,如果為了省事可以直接使用iptables-I INPUT -p icmp -j REJECT,不過這樣就把所有的icmp包給拒絕了,我們也就無法ping通别人了

将INPUT鍊上的預設政策設定為拒絕

iptables -P INPUT DROP

将本機的220端口轉發到22端口

iptables -t nat -APREROUTING -p tcp —dport 220 -j REDIRECT —to-ports 22

将INPUT鍊裡規則序号為2的規則删除

iptables -D INPUT 2

接受源位址為173.168.16.0/24網段的IP通路22和80端口

iptables -A INPUT -s173.168.16.0/24 -p tcp -m multiport —dports 22,80 -j ACCEPT

對源IP為173.168.16.8的包超過10個時,限制速率為每五秒鐘比對一個資料包,并對其他未放行的資料包進行丢棄

iptables -A INPUT -s173.168.16.8 -p tcp -m limit —limit 12/minute —limit-burst 10 -j ACCEPT

iptables -A INPUT -s173.168.16.8 -p tcp -j DROP

這裡因為我的INPUT鍊預設規則是ACCEPT,第一條規則是每五秒鐘比對一次資料包,那麼第五秒鐘之前沒有比對到的資料包如果沒有對應的規則比對,那麼隻能比對INPUT鍊的預設規則ACCEPT,那這樣限速是完全沒用的,于是我們需要添加一條規則來将那些沒有比對到的資料包進行丢棄

iptables使用nat表做區域網路共享上網執行個體

在一個區域網路裡隻有一台電腦能上外網,其他的都不能,現在需要使用iptables的nat表來将區域網路裡的ip映射到能上外網的電腦上

環境

主機A   外網ip:60.205.177.173

        内網ip:173.168.16.1

主機B   内網ip:173.168.16.2    網關:173.168.16.1

将主機B的網關修改成能上外網的主機A的ip

開啟主機A的核心轉發功能

臨時開啟

echo 1 >/proc/sys/net/ipv4/ip_forward

永久開啟

[root@localhost ~]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

[root@localhost ~]# sysctl-p   #重新加載核心參數

在主機A添加規則如下

iptables-t nat -A POSTROUTING -o eth0 -s 173.168.16.0/24 -jSNAT —to-source 60.205.177.173

如果外網ip是動态的,可以使用MASQUERADE動作,他跟SNAT動作相似,隻不過他會自動映射一個可用的外網ip,規則如下:

  iptables-t nat -A POSTROUTING -o eth0 -s 173.168.16.0/24 -j MASQUERADE

iptables使用nat表配置外網通路内網服務執行個體

内網中有一台web伺服器,但是外網不能直接通路到内網,需要進行ip映射到内網才可以進行通路

環境配置不變,添加規則如下:

iptables -t nat -A PREROUTING -d60.205.177.173 -p tcp -i eth0 —dport 800 -j DNAT —to-destination173.168.16.2:80

這樣就可以通過通路60.205.177.173的800端口來通路173.168.16.2上的web服務了,如果不能進行通路,可以試着将對應的SNAT規則配置一下