首頁 系統教程 Linux 深度解析CentOS下的iptables使用方法

深度解析CentOS下的iptables使用方法

Jan 11, 2024 pm 05:27 PM
centos iptables

一:前言

#

防火牆,其實說白了講,就是用來實現Linux下存取控制的功能的,它分為硬體的或軟體的防火牆兩種。無論是在哪個網路中,防火牆工作的地方一定是在網路的邊緣。而我們的任務就是需要去定義到底防火牆如何運作,這就是防火牆的策略,規則,以達到讓它對出入網路的IP、資料進行偵測。

目前市面上比較常見的有3、4層的防火牆,叫網路層的防火牆,還有7層的防火牆,其實是代理層的網關。

對於TCP/IP的七層模型來講,我們知道第三層是網路層,三層的防火牆會在這層對來源位址和目標位址進行偵測。但是對於七層的防火牆,不管你來源端口或目標端口,來源位址或目標位址是什麼,都將對你所有的東西進行檢查。所以,對於設計原理來講,七層防火牆比較安全,但這帶來了效率更低。所以市面上通常的防火牆方案,都是兩者結合的。而又由於我們都需要從防火牆所控制的這個口來訪問,所以防火牆的工作效率就成了用戶能夠訪問數據多少的一個最重要的控制,配置的不好甚至有可能成為流量的瓶頸。

二:iptables 的歷史以及運作原理

1.iptables的發展:

iptables的前身叫ipfirewall (核心1.x時代),這是一個作者從freeBSD上移植過來的,能夠工作在內核當中的,對資料包進行檢測的一款簡易存取控制工具。但是ipfirewall工作功能極為有限(它需要將所有的規則都放進內核當中,這樣規則才能夠運行起來,而放進內核,這個做法一般是極其困難的)。當核心發展到2.x系列的時候,軟體更名為ipchains,它可以定義多條規則,將他們串起來,共同發揮作用,而現在,它叫做iptables,可以將規則組成一個列表,實現絕對詳細的存取控制功能。

他們都是工作在使用者空間中,定義規則的工具,本身不算是防火牆。它們定義的規則,可以讓在核心空間當中的netfilter來讀取,並且實作讓防火牆運作。而放入核心的地方必須要是特定的位置,必須是tcp/ip的協定棧經過的地方。而這個tcp/ip協定堆疊必須經過的地方,可以實作讀取規則的地方就叫做 netfilter.(網路過濾器)

    作者總共在核心空間中選擇了5個位置,

    1.核心空間中:從一個網路介面進來,到另一個網路介面去的

    2.封包從核心流入使用者空間的

    3.封包從使用者空間流出的

    4.進入/離開本機的外網介面

#

    5.進入/離開本機的內部網路介面

#

2.iptables的工作機制

從上面的發展我們知道了作者選擇了5個位置,來作為控制的地方,但是你有沒有發現,其實前三個位置已經基本上能將路徑徹底封鎖了,但是為什麼已經在進出的口設定了關卡之後還要在內部卡呢?由於資料包尚未進行路由決策,還不知道資料要走向哪裡,所以在進出口是沒辦法實現資料過濾的。所以要在核心空間設定轉送的關卡,進入使用者空間的關卡,從使用者空間出去的關卡。那麼,既然他們沒什麼用,那我們為什麼還要放置他們呢?因為我們在做NAT和DNAT的時候,目標位址轉換必須在路由之前轉換。所以我們必須在外網而後內網的介面進行設定關卡。       

#

 這五個位置也被稱為五個鉤子函數(hook functions),也叫五個規則鏈。

1.PREROUTING (路由前)

2.INPUT (封包流入口)

3.FORWARD (轉送管卡)

4.OUTPUT(封包出口)

5.POSTROUTING(路由後)

這是NetFilter規定的五個規則鏈,任何一個資料包,只要經過本機,必將經過這五個鏈中的其中一個鏈。      

#

3.防火牆的策略

防火牆策略一般分為兩種,一種叫「通」策略,一種叫「堵」策略,通策略,預設門是關著的,必須定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義封包中允許或不允許的策略,filter過濾的功能,而定義位址轉換的功能的則是nat選項。為了讓這些功能交替運作,我們制定了「表」這個定義,來定義、區分各種不同的工作功能和處理方式。

我們現在用的比較多個功能有3個:

1.filter 定義允許或不允許的

2.nat 定義位址轉換的 

#

3.mangle功能:修改封包原資料

我們修改封包原資料就是來修改TTL的。能夠實現將資料包的元資料拆開,在裡面做標記/修改內容的。而防火牆標記,其實就是靠mangle來實現的。

小擴充:

對於filter來講通常只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT

對於nat來講一般也只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING

而mangle則是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

#

iptables/netfilter(這款軟體)是工作在使用者空間的,它可以讓規則進行生效的,本身不是一種服務,而且規則是立即生效的。而我們iptables現在被做成了一個服務,可以進行啟動,停止的。啟動,則將規則直接生效,停止,則將規則撤銷。 

iptables也支援自己定義鏈。但是自己定義的鏈,必須是跟某種特定的鏈關聯起來的。在一個關卡設定,指定當有資料的時候專門去找某個特定的鏈來處理,當那個鏈處理完之後,再回傳。接著在特定的鏈中繼續檢查。

注意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。

三.規則的寫法:

#

iptables定義規則的方式比較複雜:

格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION

-t table :3個filter nat mangle

COMMAND:定義如何對規則進行管理

chain:指定你接下來的規則到底是在哪個鏈上操作的,當定義策略的時候,是可以省略的

CRETIRIA:指定符合標準

-j ACTION :指定如何進行處理

例如:不允許172.16.0.0/24的進行存取。

iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP

##

當然你如果想拒絕的更徹底:

iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT

iptables -L -n -v #查看定義規則的詳細資訊

四:詳解COMMAND:

1.鏈管理指令(這都是立即生效的)

#

-P :設定預設策略的(設定預設門是關著的還是開著的)

預設策略一般只有兩種

iptables -P INPUT (DROP|ACCEPT)  預設是關的/預設是開的

例如:

iptables -P INPUT DROP 這就把預設規則拒絕了。而且沒有定義哪個動作,所以關於外界連線的所有規則都包括Xshell連線之類的,遠端連線都被拒絕了。

-F: FLASH,清空規則鏈的(注意每個鏈的管理權限)

iptables -t nat -F PREROUTING

iptables -t nat -F 清空nat錶的所有鏈

-N:NEW 支援用戶新建一個鏈

iptables -N inbound_tcp_web 表示附在tcp表上用來檢查web的。

-X: 用於刪除使用者自訂的空鏈

使用方法跟-N相同,但是在刪除之前必須要將裡面的鏈給清空昂了

-E:用來Rename chain主要是用來為使用者自訂的鏈重新命名

-E oldname newname

-Z:清空鏈,及鏈中預設規則的計數器的(有兩個計數器,被匹配到多少個資料包,多少個位元組)

iptables -Z :清空

2.規則管理指令

#

-A:追加,在目前鏈的最後新增一個規則

-I num : 插入,把目前規則插入為第幾條。

-I 3 :插入為第三條

-R num:Replays替換/修改第幾條規則

格式:iptables -R 3 …………

-D num:刪除,明確指定刪除第幾個規則    

#

3.查看管理指令 “-L”

附加子命令

-n:以數字的方式顯示ip,它會將ip直接顯示出來,如果不加-n,則會將ip反向解析成主機名稱。

-v:顯示詳細資訊

-vv

-vvv :越多越詳細

-x:在計數器上顯示精確值,不做單位換算

--line-numbers : 顯示規則的行號

-t nat:顯示所有的關卡的資訊

五:詳解符合標準

#

1.通用匹配:來源位址目標位址的匹配

-s:指定作為來源位址匹配,這裡不能指定主機名稱,必須是IP

IP | IP/MASK | 0.0.0.0/0.0.0.0

而且位址可以取反,加上一個「!」表示除了哪個IP之外

-d:表示符合目標位址

-p:用於匹配協定的(這裡的協定通常有3種,TCP/UDP/ICMP)

-i eth0:從這塊網路卡流入的資料

流入一般用在INPUT和PREROUTING上###

-o eth0:從這塊網路卡流出的資料

流出一般在OUTPUT和POSTROUTING上    

2.擴充匹配

2.1隱含擴充:對協定的擴充

-p tcp :TCP協定的擴充。一般有三種擴展

--dport XX-XX:指定目標端口,不能指定多個非連續端口,只能指定單一端口,例如

--dport 21  或 --dport 21-23 (此時表示21,22,23)

--sport:指定來源連接埠

--tcp-fiags:TCP的標誌位元(SYN,ACK,FIN,PSH,RST,URG)

對於它,一般要跟兩個參數:

1.檢查的標誌位元

2.必須為1的標誌位元

--tcpflags syn,ack,fin,rst syn   =    --syn

表示檢查這4個位,這4個位元中syn必須為1,其他的必須為0。所以這個意思就是用來偵測三次握手的第一次包包的。對於這種專門配對第一包的SYN為1的包,還有一種簡寫方式,叫做--syn

-p udp:UDP協定的擴充

        --dport

        --sport

-p icmp:icmp資料封包的擴充

        --icmp-type:

echo-r​​equest(請求回顯),一般用8 來表示

所以 --icmp-type 8 匹配請求回顯資料包

echo-r​​eply (回應的資料包)一般用0來表示

2.2明確擴充(-m)

擴充各種模組

      -m multiport:表示啟用多埠擴充

      之後我們就可以啟用例如 --dports 21,23,80

六:詳解-j ACTION

#

常用的ACTION:

DROP:悄悄丟棄

一般我們多用DROP來隱藏我們的身份,以及隱藏我們的鍊錶

REJECT:明示拒絕

ACCEPT:接受

custom_chain:轉向一個自訂的鏈

DNAT

SNAT

MASQUERADE:來源位址偽裝

##

REDIRECT:重定向:主要用於實作連接埠重定向

MARK:打防火牆標記的

RETURN:回傳

在自訂鏈執行完畢後使用返回,來返回原始規則鏈。

練習題1:

只要是來自於172.16.0.0/16網段的都允許存取我本機的172.16.100.1的SSHD服務

分析:首先肯定是在允許表中定義的。因為不需要做NAT位址轉換之類的,然後查看我們SSHD服務,在22號埠上,處理機制是接受,對於這個表,需要有來回兩個規則,如果我們允許也好,拒絕也好,對於存取本機服務,我們最好是定義在INPUT鏈上,而OUTPUT再予以定義就好。 (會話的初始端先定義),所以加規則就是:

定義進來的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT

定義出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT

將預設策略改成DROP:

  iptables -P INPUT DROP

#

  iptables -P OUTPUT DROP

  iptables -P FORWARD DROP

七:狀態偵測:

#

是一種明確擴展,用於檢測會話之間的連接關係的,有了檢測我們可以實現會話間功能的擴展

什麼是狀態偵測?對於整個TCP協議來講,它是一個有連接的協議,三次握手中,第一次握手,我們就叫NEW連接,而從第二次握手以後的,ack都為1,這是正常的數據傳輸,和tcp的第二次第三次握手,叫做已建立的連接(ESTABLISHED),還有一種狀態,比較詭異的,比如:SYN=1 ACK=1 RST=1,對於這種我們無法識別的,我們都稱之為INVALID無法辨識的。還有第四種,FTP這種古老的擁有的特徵,每個端口都是獨立的,21號和20號端口都是一去一回,他們之間是有關係的,這種關係我們稱之為為RELATED。

所以我們的狀態一共有四種:

        NEW

        ESTABLISHED

        RELATED

        INVALID

所以我們對於剛才的練習題,可以增加狀態偵測。例如進來的只允許狀態為NEW和ESTABLISHED的進來,出去只允許ESTABLISHED的狀態出去,這就可以將比較常見的反彈式木馬有很好的控制機制。   

#

對於練習題的擴展:

進來的拒絕出去的允許,進來的只允許ESTABLISHED進來,出去只允許ESTABLISHED出去。預設規則都使用拒絕

iptables -L -n --line-number  :檢視先前的規則位於第幾行

改寫INPUT

        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT###

此時如果想再放行一個80埠如何放行呢?

        iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

        iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT

練習題2:

假如我們允許自己ping別人,但別人ping自己ping不通如何實現呢?

分析:對於ping這個協議,進來的為8(ping),出去的為0(響應).我們為了達到目的,需要8出去,允許0進來

在出去的連接埠上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

在進來的連接埠上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT

小擴充:對於127.0.0.1比較特殊,我們需要明確定義它

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

八:SNAT與DNAT的實作

由於我們現在IP位址十分緊俏,已經分配完了,這就導致我們必須要進行位址轉換,來節省我們僅剩的一點IP資源。那麼透過iptables如何實現NAT的位址轉換呢?

1.SNAT基於原始位址的轉換

基於原位址的轉換一般用在我們的許多內部網路用戶透過一個外網的口上網的時候,這時我們將我們內部網路的位址轉換為一個外網的IP,我們就可以實現連接其他外網IP的功能。

所以我們在iptables中就要定義到底如何轉換:

定義的樣式:

例如我們現在要將所有192.168.10.0網段的IP在經過的時候全都轉換成172.16.100.1這個假設出來的外網位址:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1

這樣,只要是來自本地網路的試圖透過網路卡存取網路的,就會被統統轉換成172.16.100.1這個IP.

那麼,如果172.16.100.1不是固定的怎麼辦?

我們都知道當我們使用聯通或電信上網的時候,一般它都會在每次你開機的時候隨機產生一個外網的IP,意思就是外網位址是動態變換的。這時我們就要將外網位址換成 MASQUERADE(動態偽裝):它可以實現自動尋找到外網位址,而自動將其改為正確的外網位址。所以,我們就需要這樣設定:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE

這裡要注意:地址偽裝並不適用於所有的地方。

2.DNAT目標位址轉換

對於目標位址轉換,資料流向是從外向內的,外面的是客戶端,裡面的是伺服器端透過目標位址轉換,我們可以讓外面的ip透過我們對外的外網ip來存取我們伺服器不同的伺服器,而我們的服務卻放在內網伺服器的不同的伺服器上。

如何做目標位址轉換呢? :

iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2

目標位址轉換要做在到達網卡之前進行轉換,所以要做在PREROUTING這個位置上

九:控制規則的存放以及開啟

#

注意:你所定義的所有內容,當你重啟的時候都會失效,要想我們能夠生效,需要使用一個命令將它保存起來

1.service iptables save 指令

它會保存在/etc/sysconfig/iptables這個檔案中

2.iptables-save 指令

iptables-save > /etc/sysconfig/iptables

3.iptables-restore 指令

開機的時候,它會自動載入/etc/sysconfig/iptabels

如果開機不能載入或沒有加載,而你想讓一個自己寫的設定檔(假設為iptables.2)手動生效的話:

iptables-restore /etc/sysconfig/iptables.2

則完成了iptables中定義的規則手動生效

十:總結

Iptables是一個非常重要的工具,它是每個防火牆上幾乎必備的設置,也是我們在做大型網路的時候,為了很多原因而必須要設置的。學好Iptables,可以讓我們對整個網路的結構有一個比較深刻的了解,同時,我們也能夠將內核空間中資料的走向以及linux的安全給掌握的非常透徹。我們在學習的時候,盡量能結合各種各樣的項目,實驗來完成,這樣對你加深iptables的配置,以及各種技巧有非常大的幫助。

以上是深度解析CentOS下的iptables使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1247
24
CentOS上GitLab的備份方法有哪些 CentOS上GitLab的備份方法有哪些 Apr 14, 2025 pm 05:33 PM

CentOS系統下GitLab的備份與恢復策略為了保障數據安全和可恢復性,CentOS上的GitLab提供了多種備份方法。本文將詳細介紹幾種常見的備份方法、配置參數以及恢復流程,幫助您建立完善的GitLab備份與恢復策略。一、手動備份利用gitlab-rakegitlab:backup:create命令即可執行手動備份。此命令會備份GitLab倉庫、數據庫、用戶、用戶組、密鑰和權限等關鍵信息。默認備份文件存儲於/var/opt/gitlab/backups目錄,您可通過修改/etc/gitlab

centos關機命令行 centos關機命令行 Apr 14, 2025 pm 09:12 PM

CentOS 關機命令為 shutdown,語法為 shutdown [選項] 時間 [信息]。選項包括:-h 立即停止系統;-P 關機後關電源;-r 重新啟動;-t 等待時間。時間可指定為立即 (now)、分鐘數 ( minutes) 或特定時間 (hh:mm)。可添加信息在系統消息中顯示。

centos和ubuntu的區別 centos和ubuntu的區別 Apr 14, 2025 pm 09:09 PM

CentOS 和 Ubuntu 的關鍵差異在於:起源(CentOS 源自 Red Hat,面向企業;Ubuntu 源自 Debian,面向個人)、包管理(CentOS 使用 yum,注重穩定;Ubuntu 使用 apt,更新頻率高)、支持週期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社區支持(CentOS 側重穩定,Ubuntu 提供廣泛教程和文檔)、用途(CentOS 偏向服務器,Ubuntu 適用於服務器和桌面),其他差異包括安裝精簡度(CentOS 精

怎樣優化CentOS HDFS配置 怎樣優化CentOS HDFS配置 Apr 14, 2025 pm 07:15 PM

提升CentOS上HDFS性能:全方位優化指南優化CentOS上的HDFS(Hadoop分佈式文件系統)需要綜合考慮硬件、系統配置和網絡設置等多個方面。本文提供一系列優化策略,助您提升HDFS性能。一、硬件升級與選型資源擴容:盡可能增加服務器的CPU、內存和存儲容量。高性能硬件:採用高性能網卡和交換機,提升網絡吞吐量。二、系統配置精調內核參數調整:修改/etc/sysctl.conf文件,優化TCP連接數、文件句柄數和內存管理等內核參數。例如,調整TCP連接狀態和緩衝區大小

centos配置ip地址 centos配置ip地址 Apr 14, 2025 pm 09:06 PM

CentOS 中配置 IP 地址的步驟:查看當前網絡配置:ip addr編輯網絡配置文件:sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0更改 IP 地址:編輯 IPADDR= 行更改子網掩碼和網關(可選):編輯 NETMASK= 和 GATEWAY= 行重啟網絡服務:sudo systemctl restart network驗證 IP 地址:ip addr

CentOS HDFS配置有哪些常見誤區 CentOS HDFS配置有哪些常見誤區 Apr 14, 2025 pm 07:12 PM

CentOS下Hadoop分佈式文件系統(HDFS)配置常見問題及解決方案在CentOS系統上搭建HadoopHDFS集群時,一些常見的錯誤配置可能導致性能下降、數據丟失甚至集群無法啟動。本文總結了這些常見問題及其解決方法,幫助您避免這些陷阱,確保HDFS集群的穩定性和高效運行。機架感知配置錯誤:問題:未正確配置機架感知信息,導致數據塊副本分佈不均,增加網絡負載。解決方案:仔細檢查hdfs-site.xml文件中的機架感知配置,並使用hdfsdfsadmin-printTopo

HDFS配置CentOS需要哪些步驟 HDFS配置CentOS需要哪些步驟 Apr 14, 2025 pm 06:42 PM

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令

centos7如何安裝mysql centos7如何安裝mysql Apr 14, 2025 pm 08:30 PM

優雅安裝 MySQL 的關鍵在於添加 MySQL 官方倉庫。具體步驟如下:下載 MySQL 官方 GPG 密鑰,防止釣魚攻擊。添加 MySQL 倉庫文件:rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm更新 yum 倉庫緩存:yum update安裝 MySQL:yum install mysql-server啟動 MySQL 服務:systemctl start mysqld設置開機自啟動

See all articles