iptables的四表五鏈與NAT工作原理

image

本文主要介紹了iptables的基本工作原理和四表五鏈等基本概念以及NAT的工作原理。

1、iptables簡介

我們先來看一下netfilter官網對iptables的描述:

iptables is the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset. It is targeted towards system administrators.

Since Network Address Translation is also configured from the packet filter ruleset, iptables is used for this, too.

The iptables package also includes ip6tables. ip6tables is used for configuring the IPv6 packet filter.

也就是說iptables實際上只是位于用戶空間的一個面向系統(tǒng)管理員的Linux防火墻的管理工具而已,而真正實現防火墻功能的是netfilter,它是Linux內核中實現包過濾的內核模塊,iptables對應在內核中的模塊應該是ip_tables,我們查看系統(tǒng)內核中ip_tables的信息的時候可以看到ip_tables.ko這個模塊是在netfilter這個目錄下的。

image

實際上除了iptables還有如nftablesfirewalld等防火墻工具都是在用戶空間(用戶層)對相應的內核空間中對應的netfilter相關的模塊進行操作的工具。

2、iptables的四表五鏈

2.1 iptables流程圖

首先我們來看一下下面的這張圖了解一下iptables中的表和鏈的概念。圖中使用箭頭展示了用戶訪問使用了iptables的機器的過程,其中按照箭頭的順序我們就可以將其梳理為一條大的帶有分支的鏈條,在每個需要進行操作的模塊處都標有名稱和相應的括號,括號內的就是iptables的四表,而每個模塊都可以視為一個鏈。

image

CentOS7中的input鏈中還有nat表,但是在CentOS6中并沒有。

之所以叫做鏈就是因為在訪問該鏈的時候會按照每個鏈對應的表依次進行查詢匹配執(zhí)行的操作,如PREROUTING鏈對應的就是(raw->mangle->nat),每個表按照優(yōu)先級順序進行連接,每個表中還可能有多個規(guī)則,因此最后看起來就像鏈一樣,因此稱為鏈。而iptables的表中存儲的就是對應的規(guī)則和需要執(zhí)行的操作,這里以路由器為例查看其中iptablesfilter表:

image

注意每一個鏈對應的表都是不完全一樣的,表和鏈之間是多對多的對應關系。但是不管一個鏈對應多少個表,它的表都是按照下面的優(yōu)先順序來進行查找匹配的。

表的處理優(yōu)先級:raw>mangle>nat>filter。

2.2 四表

iptables的四個表iptable_filter,iptable_mangleiptable_nat,iptable_raw,默認表是filter(沒有指定表的時候就是filter表)。

  • filter 表:用來對數據包進行過濾,具體的規(guī)則要求決定如何處理一個數據包。

    對應的內核模塊為:iptable_filter,其表內包括三個鏈:inputforward、output;

  • nat 表:nat 全稱:network address translation 網絡地址轉換,主要用來修改數據包的 IP 地址、端口號信息。

    對應的內核模塊為:iptable_nat,其表內包括三個鏈:preroutingpostrouting、output;

  • mangle 表:主要用來修改數據包的服務類型,生存周期,為數據包設置標記,實現流量整形、策略路由等。

    對應的內核模塊為:iptable_mangle,其表內包括五個鏈:prerouting、postrouting、input、output、forward;

  • raw 表:主要用來決定是否對數據包進行狀態(tài)跟蹤。

    對應的內核模塊為:iptable_raw,其表內包括兩個鏈:output、prerouting;

raw表只使用在PREROUTING鏈和OUTPUT鏈上,因為優(yōu)先級最高,從而可以對收到的數據包在系統(tǒng)進行ip_conntrack(連接跟蹤)前進行處理。一但用戶使用了raw表,在某個鏈上,raw表處理完后,將跳過NAT表和ip_conntrack處理,即不再做地址轉換和數據包的鏈接跟蹤處理了。RAW表可以應用在那些不需要做nat的情況下,以提高性能。

2.3 五鏈

iptables的五個鏈PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING。

  • input 鏈:當收到訪問防火墻本機地址的數據包時,將應用此鏈中的規(guī)則;
  • output 鏈:當防火墻本機向外發(fā)送數據包時,將應用此鏈中的規(guī)則;
  • forward 鏈:當收到需要通過防火中轉發(fā)給其他地址的數據包時,將應用此鏈中的規(guī)則,注意如果需要實現forward轉發(fā)需要開啟Linux內核中的ip_forward功能;
  • prerouting 鏈:在對數據包做路由選擇之前,將應用此鏈中的規(guī)則;
  • postrouting 鏈:在對數據包做路由選擇之后,將應用此鏈中的規(guī)則;

2.4 iptables的常見情況

下面我們利用上面的流程圖來對幾種常見的情況解析:關鍵點在于發(fā)往iptables主機的數據包的目的地址是否是iptables主機本機。如果是,那我們就可以理解為常見的開啟了iptables防火墻的網站服務器主機;如果不是,那就是走ip_forward進行轉發(fā),比如我們常見的NAT路由器的NAT服務和策略路由等。如下圖為開啟了ip_forward功能的openwrt路由器。

image

3、NAT工作原理

接下來介紹一些NAT(Network Address Translation,網絡地址轉換)的基本知識,眾所周知,IPv4的公網IP地址已經枯竭,但是需要接入互聯網的設備還在不斷增加,這其中NAT就發(fā)揮了很大的作用(此處不討論IPv6)。NAT服務器提供了一組私有的IP地址池(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16),使得連接該NAT服務器的設備能夠獲得一個私有的IP地址(也稱局域網IP/內網IP),當設備需要連接互聯網的時候,NAT服務器將該設備的私有IP轉換成可以在互聯網上路由的公網IP(全球唯一)。NAT的實現方式有很多種,這里我們主要介紹三種:靜態(tài)NAT、動態(tài)NAT和網絡地址端口轉換(NAPT)。

3.1 BNAT

  • 靜態(tài)NAT:LVS的官方文檔中也稱為(N-to-N mapping)
    ,前面的N指的是局域網中需要聯網的設備數量,后面的N指的是該NAT服務器所擁有的公網IP的數量。既然數量相等,那么就可以實現靜態(tài)轉換,即一個設備對應一個公網IP,這時候的NAT服務器只需要維護一張靜態(tài)的NAT映射轉換表。

    內網IP 外網IP
    192.168.1.55 219.152.168.222
    192.168.1.59 219.152.168.223
    192.168.1.155 219.152.168.224
  • 動態(tài)NAT:LVS的官方文檔中也稱為(M-to-N mapping)
    ,注意這時候的M>N,也就是說局域網中需要聯網的設備數量多于NAT服務器擁有的公網IP數量,這時候就需要由NAT服務器來實現動態(tài)的轉換,這樣每個內網設備訪問公網的時候使用的公網IP就不一定是同一個IP。

在一些家用路由器中,DMZ是指一部所有端口都暴露在外部網絡的內部網絡主機,除此以外的端口都被轉發(fā)。嚴格來說這不是真正的DMZ,因為該主機仍能訪問內部網絡,并非獨立于內部網絡之外的。但真正的DMZ是不允許訪問內部網絡的,DMZ和內部網絡是分開的。這種 DMZ主機并沒有真正DMZ所擁有的子網劃分的安全優(yōu)勢,其常常以一種簡單的方法將所有端口轉發(fā)到另外的防火墻或NAT設備上。

3.2 NAPT

以上的這兩種都屬于基本網絡地址轉換(Basic NAT),這種轉換在技術上比較簡單,僅支持地址轉換,不支持端口映射,這也就帶來了另一個問題就是資源的浪費。我們知道一個IP實際上可以對應多個端口,而我們訪問應用實際上是通過IP地址+端口號的形式來訪問的,即客戶端訪問的時候發(fā)送請求到服務器端應用程序監(jiān)聽的端口即可實現訪問。那么NAPT就是在這基礎上的擴展延申,它在IP地址的基礎上加上了端口號,支持了端口映射的功能。

  • NAPT:NAPT實際上還可以分為源地址轉換(SNAT)目的地址轉換(DNAT)兩種。注意這個源地址和目的地址是針對NAT服務器而言,我們通過下面一張圖來說明:
image

首先我們這里有一個客戶端,上面運行著一個瀏覽器,假設它使用的是5566端口,它需要訪問14.25.23.47這個Web服務器的HTTPS服務的443端口,它在訪問的時候需要經過局域網出口的這個路由器網關(同時也是NAT服務器),路由器對它進行一個NAPT的源地址轉換(SNAT),這個時候客戶端的請求經過NAT服務器之后變成了222.17.23.45:7788這個IP端口對Web服務器的443端口進行訪問。注意在這個過程中,目標服務器(Web服務器)的IP和端口是一直沒有改變的。

接下來在Web服務器接收到請求之后,需要返回數據給發(fā)送請求的設備,注意這時候web服務器返回數據的指向IP應該是剛剛NAT服務器發(fā)送請求的227.17.23.45:7788這個IP端口,這時候路由器網關再進行一次NAPT的目標地址轉換(DNAT),目標的IP端口就是最開始發(fā)送請求的192.168.1.77:5566這個端口。

實際上對于大多數人來說日常接觸到最多的就是路由器做的SNAT和DNAT操作,它們一般成對出現用于解決公網IP資源不足的問題,需要注意的是NAT是可以進行嵌套操作的,即NAT下面的網絡設備還可以繼續(xù)做NAT,只要做NAT的網段不和上層的NAT的網段相同即可。

4、iptables配置

在了解清楚iptables的工作原理和每個表以及鏈的作用之后,我們就可以根據其特點進行針對性的配置。

iptables 的基本語法命令格式

iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
  • 表名、鏈名:指定iptables命令所操作的,未指定表名時將默認使用filter表;
  • 管理選項:表示iptables規(guī)則的操作方式,比如:插入、增加、刪除查看等;
  • 匹配條件:指定要處理的數據包的特征,不符合指定條件的數據包不處理;
  • 控制類型:指數據包的處理方式,比如:允許accept拒絕reject、丟棄drop、日志LOG等;
iptables 命令的常用管理選項
-A:在指定鏈的末尾添加一條新的規(guī)則
-D:刪除指定鏈中的某一條規(guī)則,可刪除指定序號或具體內容
-I:在指定鏈中插入一條新規(guī)則,未指定序號時默認作為第一條規(guī)則
-R:修改、替換指定鏈中的某一條規(guī)則,可指定規(guī)則序號或具體內容
-L:列出指定鏈中所有的規(guī)則,未指定鏈名,則列出表中的所有鏈
-F:清空指定鏈中所有的規(guī)則,未指定鏈名,則清空表中的所有鏈
-P:設置指定鏈的默認策略
-n:使用數字形式顯示輸出結果
-v:查看規(guī)則列表時顯示詳細的信息
-h:查看命令幫助信息
--line-numbers:查看規(guī)則列表時,同時顯示規(guī)則在鏈中的順序號

在添加規(guī)則之前我們先開啟iptables的獨立log功能,對于centos6,我們可以執(zhí)行以下操作:

echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf
# 記錄所有級別的日志到指定目錄中
service rsyslog restart
# 重啟rsyslog服務使配置生效

接著我們開始添加一條比較有針對性的規(guī)則:

iptables -A INPUT -j LOG --log-prefix "*** INPUT ***" --log-level debug
iptables -t filter -A INPUT -p tcp -s 192.168.100.100 --dport 80 -j REJECT 

上述兩條命令第一條增加了一條記錄日志的規(guī)則,對于INPUT鏈中的所有操作都記錄到日志中,添加日志前綴*** INPUT ***并設定日志級別為debug

第二條是在INPUT鏈的filter表中插入一條規(guī)則,限定對192.168.100.100這個IP使用tcp協(xié)議訪問本機的目的端口80端口的時候拒絕掉數據包。

image

接著我們嘗試訪問發(fā)現無法正常顯示頁面。

image

再查看日志發(fā)現iptables日志中多了很多請求被拒絕的記錄。

image

再清空所有的規(guī)則,此時可以正常訪問,且不再繼續(xù)記錄日志,因為記錄日志的那條規(guī)則也被我們清空掉了。

image
image
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容