死磕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使用以及各個引數表達含義。希望通過此篇幫助像我一樣的小白。