1. 程式人生 > >死磕Linux防火牆(iptables和firewalld)

死磕Linux防火牆(iptables和firewalld)

對於Linux防火牆無論是使用方式上還是實現機制上理解的都不是很深刻。例如,在windows做埠對映很方便,但是到了linux下面卻很頭疼,今天打算徹底搞懂它。

一、Linux防火牆概述

1.1、背景

1) iptables和firewalld並不是真正的防火牆,他們兩個只是管理工具。通過他們兩個自身的服務(配置),去配置核心中Netfilter和TCPwrappers。對於日常工作,這兩種配置方式只要熟練掌握其中一個即可。

2) 在centos7.0/redhat7.0以上版本,內建防火牆有兩個iptables和firewalld。在centos6/redhat6中,防火牆只有一個iptables。

1.2、策略

所謂策略,是由兩個部分組成,匹配原則和執行動作。對於防火牆來說,要麼是允許通過,要是是被拒絕,只有這兩種動作。策略分類:

策略 作用 備註
預設策略 系統提供策略 預設策略的動作,通過或者拒絕。
使用者策略 由使用者指定的策略 當一條報文流入防火牆,防火牆會依據當前報文,與防火牆現有策略進行匹配,如果匹配成功則只執行當前動作,如果匹配不成功則執行預設策略。

1.3、規則鏈

規則鏈 作用
INPUT 進入主機
OUTPUT 離開主機
PREROUTING 路由前操作
FORWARD 轉發
POSTROUTING 路由後操作

以上是iptables內建規則鏈,其中常用鏈有INPUT、OUTPUT、FORWARD。 當然我們也可以自定義規則鏈,以便可以滿足業務需求。

1.4、表

表是用來將相同規則進行統一化管理。

作用
filter 負責過濾功能,核心模組 iptables_filter,預設表
nat 負責進行網路地址轉換,核心模組 iptable_nat
mangle 拆解報文,進行修改,重新封裝,核心模組 iptable_mangle
raw 關閉 nat 表上啟用的連線追蹤機制,核心模組 iptable_raw

說明:

1)常用表是,filter、nat這兩個表。如果新增規則的時候沒有指定表,則預設是filter表。

2)優先順序處理, raw>mangle>nat>filter

二、深入理解iptables

雖然在centos7.0以後增加了firewalld,以一種全新方式管理防火牆,但是發現業界還是使用iptables較多,例如:lvs、docker等,而且我對於iptables各種規則鏈也不是很清晰。所以打算徹底搞明白這個iptables。

2.1、檢視規則鏈

通過命令列ipables -L <規則鏈名稱>,具體如下:

說明:

1)藍色框為內建規則鏈,紅色框為自定義規則鏈。

2)規則鏈頭部欄位說明:

欄位 說明
target 動作,例如接受、丟棄等,具體取值請看下文。
prot 協議名稱,例如all,icmp,tcp等
opt 選項
source 源ip
destination 目的ip

3)target取值說明:

欄位 說明
ACCEPT 接受報文,表示允許通過本機
DROP 丟棄報文,不給客戶端任何響應
REJECT 拒絕報文,會給客戶端傳送一個響應(與DROP區別)
SNAT 源地址轉換
MASQUERADE 是 SNAT 的一種特殊形式,適用於動態的、臨時會變的 IP上
DNAT 目的地址轉換
REDIRECT 重定向,主要用於埠對映
RETURN 返回,當進入自定義鏈中,執行完自定義鏈規則後可返回上一規則鏈
LOG 只記錄報文,不對報文做任何操作

4)policy ACCEPT 表示預設策略為接受,此處policy取值為上面介紹target欄位。

2.2、檢視規則

上面是我的docker環境下面所有策略,這裡詳細介紹一下各個含義:

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

修改INPUT鏈, FORWARD鏈,OUTPUT鏈預設策略為ACCEPT,這個操作對應上面通過iptables -L檢視顯示:policy ACCEPT。

-N DOCKER
-N DOCKER-ISOLATION

建立兩個新鏈,名字為DOCKER,DOCKER-ISOLATION。

-A DOCKER -d 192.168.2.2/32 ! -i br-f9077321f368 -o br-f9077321f368 -p tcp -m tcp --dport 8999 -j ACCEPT

 說明:

1)向DOCKER鏈中增加一個規則,並且該規則的動作是ACCEPT(-j ACCEPT)

2)-A是在末尾新增,-I是在前面新增

3)匹配規則說明:

規則 說明
-d 192.168.2.2/32 目的ip是192.168.2.2/32
! -i br-f9077321f368 輸入介面(網絡卡),不能br-f9077321f368。也就是說除br-f9077321f368以外的網絡卡,是可以接受的
-o br-f9077321f368 輸出介面(網絡卡),br-f9077321f368
-p tcp 匹配協議為tcp協議
-m tcp --dport 8999 擴充套件匹配規則,tcp協議下埠為8999

這裡注意:感嘆號的作用,是取反的意思。 

三、使用

我們可以通過iptables命令列,增加、刪除規則鏈,命令列形式為:iptables [-t table] command [match] [target],這個其實對應上面2.2小節。如果不指定table則預設是filter表。我們對上面規則進行詳細說明:

紅色:對應command欄位,這裡沒有指定table,那麼該規則追加到filter表。

紫色:對應match欄位,可以根據業務需求進行設定。

黃色:對應target欄位,此處為ACCEPT,代表是接受。

四、服務管理

我們啟動/關閉iptables可使用sytemctl方式,具體如下:

[[email protected] ~[11:57]#systemctl start iptables
[[email protected] ~[11:57]#systemctl stop iptables
[[email protected] ~[11:57]#systemctl status iptables

我們通過命令列進行配置iptables,當我們主機重啟後配置就會丟失,那麼我們如何儲存呢?可使用iptables-save命令列

五、總結

至此,通過實際例子,介紹iptables使用以及各個引數表達含義。希望通過此篇幫助像我一樣的小白。