iptables防火牆
iptables概述
linux系統的防火牆;ip資訊包過濾系統,它實際上由兩個元件netfilter和iptables組成。主要工作在網絡層,針對ip資料包,展現在對包内的ip位址、端口等資訊處理上
iptables /netfilter 的關系
netfilter ;屬于**‘核心态’**的防火牆功能體系。(幹活的,屬于核心的一部分)
是核心的一部分,由一些資料包過濾表組成,這些表情包包含核心用來控制資料包過濾處理的規則集
iptables : 屬于**“使用者态”**的防火牆管理體系。
是一種用來管理linux防火牆的指令程式,它使插入、修改和删除資料包過濾表中的規則變得容易,通常位于/sbin/iptables檔案下
netfilter、iptables 後期簡稱為iptables。iptables是基于核心的防火牆,其中内置了raw、mangle、nat和filter四個規劃1表。表中所有規則配置後,立即生效,不需要重新開機服務。

四表五鍊
規則表的作用:容納各種規則
規則鍊的作用:容納各種防火牆的規則
總結:表裡有鍊,鍊裡有規則
四表:
raw表:确定是否修改資料包進行狀态跟蹤。包含兩個規則鍊,OUTPUT、PREOUTING
mangle表:修改資料包内容,用來做流量整形的。給資料包設定表記,包含五個規則鍊,INPUT、OUTPUT、FORWARD、PREROUTPUT、POSTROUTING
! nat表:負責網絡位址轉化,用來修改資料包中的源、目标ip位址或者端口。包含三個規則鍊:OUTPUT、PREROUTING、POSTROUTING
! filter表:負責過濾資料包,确定是否放行該資料包(過濾)。包含三個規則鍊:INPUT、FORWARD、OUTPUT
#在iptables 的四個規則表中,mangle表和raw表應用相對較小
五鍊:
INPUT:處理入站資料包,比對目标IP為本機的資料包
OUTPUT:處理出站資料包,一般不在次鍊路上做配置
FORWARD:處理轉發資料包,比對流經本機的資料包
PREROUTING:在進行路由選擇前處理資料包,用來修改目的位址,用來做DNAT,相當于把内網伺服器的IP位址和端口映射到路由器的外網IP和端口号(入站資料第一個經過過)
POSTROUTING鍊:在進行路由選擇後處理資料包,用來修改源位址,用來做SNAT。相當于内網通過路由器NAT功能實作内網主機通過一個公網IP位址上網(出站資料經過)
資料包到達防火牆時,規則表之間的優先順序:
raw > mangle > nat > filter
規則鍊之間的比對順序
主機型防火牆
入站資料(來自外界的資料包,且目标位址是防火牆本機):PREROUTING、INPUT、本機的應用程式
出站資料(從防火牆本機向外部位址發送的資料包):本機的應用程式、OUTPUT、POSTROUTING
網絡型防火牆
轉發資料(需要經過防火牆轉發的資料包):PREROUTING、FORWARD、POSTROUTING
規則鍊内的比對順序:
自上向下按照順序依次進行檢查,找到相比對的規則就立即停止(LOG政策除外,表示相關日志)
諾在該鍊内找不到相比對的規則,則按該鍊的熱預設政策處理(未修改的情況下,預設政策是允許的)
‘iptables的安裝’
Centos7預設使用firewalld防火牆,沒有安裝iptables,如果想要使用iptables防火牆。必須先關閉firewalld防火牆,再開啟iptables防火牆
iptables防火牆指令配置的方法
指令格式
iptables [-t 表名] 管理選項 [鍊名] [比對條件] [-j 控制類型]
注意事項:
不指定表名時,預設指定filter表
不指定鍊名時,預設指定表内所有的鍊
除非設定鍊的預設值,否則必須指定比對條件
控制類型使用大寫字母,其餘均為小寫
常用的控制類型:
ACCEPT:允許資料包通過
DROP:直接丢棄資料包。不給任何回應資訊
REJECT:拒絕資料包通過,不給任何回應資訊
SNAT:修改資料包的源位址
DNAT:修改資料包的目的位址
MASQUERADE:僞裝成一個非固定的公網ip位址
LOG:在/var/log/messages檔案中記錄日志資訊,然後将資料包傳遞給下一條規則,LOG隻是一種輔助動作,沒有真正處理資料包
常用管理選項:
-A:在指定鍊的末尾追加一條新的規則
-I:在指定鍊的開頭插入一條新的規則,未指定序号的話預設作為第一條規則
-R:修改、替換指定鍊中的某一條規則,可指定規則序号或者具體内容
-P:設定指定鍊路的預設政策
-D:删除指定鍊路中的某一條規則,可指定規則序号或者具體内容
-F:清空指定鍊中的所有規則,如未指定鍊名,則清空表中的所有鍊
-L:列出指定鍊路中的所有規則,如未指定鍊名,則列出表中的所有鍊
-n:使用數字形式顯示輸出結果,如顯示IP位址,而不是顯示主機名
-v:顯示詳細資訊,包括每條規則的比對,包括數量和比對位元組數
--line-number:檢視規則時,顯示規則的序号。
添加新的規則:
iptables -t filter -A INPUT -p icmp -j REJECT
iptables -I INPUT 2 -p tcp --dport 22 -f ACCEPT
檢視規則表:
iptables [-t 表名 ] -n -L 鍊名 [--line-number]
或者
iptables -[vn]L ;注意:不可以合寫為 -Ln
iptables -n -L --line-number
設定預設政策
iptables [-t 表名] -p <連接配接名> <控制類型>
iptables -p INPUT DROP
iptables -p FORWARD DROP
一般在生産環境的設定中,網絡型防火牆、主機型防火牆時都要設定預設規則為DROP,并設定白名單
删除規則
iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -j REJECT
注意:1.若規則清單中有多條相同的規則時,按内容比對隻删除的序号最小的一條
2.按号碼比對删除時,確定規則号碼小于等于已有規則數,否則報錯
3.按内容比對删數時,確定規則存在,否則報錯
清空規則:
iptables [-t 表名] -F [鍊名]
iptables F INPUT
iptables -F
注意:
1.-F僅僅是清空鍊中的規則,并不影響-P設定的預設規則,預設規則需要手動進行修改
2.-P 設定了DROP後, 使用-F一定要小心!
3.如果不寫表名和鍊名,預設清空filter表中所有鍊裡的所有規則
#防止把允許遠端連接配接的相關規則清除後導緻無法遠端連接配接主機,此情況如果沒有儲存規則可重新開機主機解決
規則的比對:
1.通用比對
可直接使用,不依賴于其他條件或擴充,包括網絡協定、IP位址、網絡接口等條件。
協定比對: -p協定名.
位址比對: -s源位址、-d目的位址 #可以是IP、網段、域名、空(任何位址)
接口比對: -i入站網卡、-o出站網卡.
iptables A FORWARD ! -P icmp -j ACCEPT
iptables -A INPUT -s 192.168.80.11 -j DROP
iptables -I INPUT -i ens33 -s 192.168.80.0/24 -j DROP
2.隐含比對
要求以特定的協定比對作為前提,包括端口、TCP标記、ICMP類型等 條件。
端口比對: --sport 源端口、--dport目的端口
#可以是個别端口、端口範圍.
-- sport 1000 比對源端口是1000的資料包
-sport 1000:3000 比對源端口是1000- 3000的資料包
--sport :3000 比對源端口是3000及以下的資料包
--sport 1000: 比對源端口是1000及以上的資料包
注意: --sport 和--dport 必須配合-p <協定類型>使用
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I FORWARD -d 192.168.80.0/24 -P tcp --dport 24500:24600 -j DROP
TCP标記比對: --tcp- flags TCP标記
iptables -I INPUT -i ens33 -P tcp --tcp-flags SYN, RST,ACK SYN -j ACCEPT
#丢棄SYN請求包,放行其他包
ICMP類型四配: -- icmp-type ICMP類型
#可以是字元串、數字代碼
"Echo- Request" ( 代碼為8)表示 請求
"Echo-Reply" (代碼為0)表示回顯
"Destination-Unreachable" (代碼為3)表示目标不可達
關于其它可用的ICMP 協定類型,可以執行"iptables -p icmp -h”指令,檢視幫助資訊
iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止其它主機ping本機
iptables -A INPUT -P icmp --icmp-type 0 -j ACCEPT #允許本機ping其它主機
iptables -A INPUT -P icmp --icmp-type 3 -j ACCEPT #當本機ping不通其它主機時提示目标不可達
#此時其它主機需要配置關于icmp協定的控制類型為REJECT
iptables -A INPUT -P icmp -j REJECT
3、顯式比對
要求以"-m"擴充子產品的形式明确指出類型。包括多端口、mac位址、ip範圍、資料包狀态等條件
多端口比對:
```
-m multiport --sport 源端口清單
-m multiport --dport 目的端口清單
```
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
IP範圍比對: -m iprange --src-range IP範圍
iptables -A FORWARD -P udp -m iprange --src-range 192. 168.80.100-192.168.80.200 -j DROP
#禁止轉發源位址位于192.168.80.100-192.168.80.200的udp資料包
MAC位址比對: -m mac --mac-source MAC位址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#禁止來自某MAC位址的資料包通過本機轉發
狀态比對: -m state --state 連接配接狀态
常見的連接配接狀态:
NEW :與任何連接配接無關的,還沒開始連接配接
ESTABLISHED :響應請求或者已建立連接配接的,連接配接态
RELATED :與已有連接配接有相關性的( 如FTP主被動模式的資料連接配接),衍生态,一般與ESTABLISHED配合使用
INVALID:不能被識别屬于哪個連接配接或沒有任何狀态
iptables -A FORWARD -m state --state NEW -P tcp ! --syn -j DROP
#禁止轉發與正常TCP連接配接無關的非--syn請求資料包(如僞造的網絡攻擊資料包)
iptables -I INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state ESTABLISHED, RELATED -j ACCEPT
#對進來的包的狀态進行檢測。已經建立tcp連接配接的包以及該連接配接相關的包允許通過。
#比如我和你做生意,我們談成了生意,到了支付的時候,就可以直接調用與這筆生意相關的支付功能
iptables -P INPUT DROP
SNAT原理
SNAT政策的典型應用環境
區域網路内主機共享單個公網ip位址接入internet
SNAT政策的原理
源位址的轉換,
修改資料包的源位址
前提條件
區域網路主機正确配置ip位址、掩碼
區域網路各個主機配置正确的預設網關位址
linux網關支援ip路由轉發
實作方法
編寫SNAT轉換規則
沒做SNAT轉換情況:
做SNAT轉換的情況:
(資料包從内網到外網發送時将内網位址轉換成合法的外網位址(請求消息)。資料包從外網向内網回應時将外網位址轉換成相應的内網位址(相應消息))
DNAT
DNAT政策的典型應用環境
在internet中釋出位于企業區域網路内的伺服器
DNAT政策的原理
目标位址轉換
修改資料包的目的位址
前置條件
區域網路的web伺服器能夠通路internet
網關的外網ip有正确的DNS解析記錄
Linux網關支援ip路由轉發
實作方法
編寫DNAT轉換規則
iptables -t -A POSTROUTING -s 192.168.1.0/24
-o ens33 -j SNAT --to-source 12.0.0.1
SNAT應用環境:區域網路主機共享單個公網IP位址接入Internet (私有IP不能在Internet中正常路由)
SNAT原理:修改資料包的源位址。
SNAT轉換前提條件:
1.區域網路各主機已正确設定IP位址、子網路遮罩、預設網關位址
2.Linux網關開啟IP路由轉發
臨時打開:
echo 1 > /proc/sys/net/ipv4/ip_ forward
或者
sysctl -W net. ipv4.ip_ forward=1
永久打開:
vim /etc/ sysctl. conf
net. ipv4.ip_ forward = 1 #将此行寫入配置檔案
sysctl -P #讀取修改後的配置
永久打開:
vim, /etc/ sysctl . conf
net. ipv4.ip_ forward = 1 #将此行寫入配置檔案
sysctl -P #讀取修改後的配置
SNAT轉換1:固定的公網IP位址:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to 12.0.0.1
或者
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j SNAT --to-source 12.0.0.1-12.0.0.10
SNAT轉換2:非固定的公網IP位址(共享動态IP位址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens36 -j MASQUERADE
補充拓展:
一個IP位址做SNAT轉換。一般可以讓内網100到200台主機實作上網。
DNAT政策概述
典型應用環境
在internet中釋出位于企業區域網路内的伺服器
DNAT的原理
目标位址轉換
修改資料包的目标位址
前提條件
區域網路的WEB伺服器能夠通路Internet
網關的外網IP有正确的DNS解析記錄
linux網關支援IP路由轉發
編寫DNAT轉換規則
iptables -t nat -APREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
防火牆規則的備份和還原
導出(備份)所有表的規則
iptables-save > /opt/ipt. txt
導入(還原)規則
iptables- - restore < /opt/ ipt. txt
将iptables規則檔案儲存在/etc/sysconfig/iptables 中,iptables服 務啟動時會自動還原規則
iptables-save > /etc/sysconfig/ iptables
systemctl stop iptables #停止iptables服務會清空掉所有表的規則
systemctl start iptables #啟動iptables服務會自動還原/etc/sysconfig/iptables中的規則
TCPdump抓包
tlcpdump tcp -i ens33 -t -s 0 -C 100 and dst port ! 22 and src net 192.168.1.0/24 -W ./target. cap
(1)tcp:ipicmparprarp和tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾資料報的類型
(2)-i ens33 :隻抓經過接口ens33的包
(3)-t:不顯示時間戳
(4)-s 0:抓取資料包時預設抓取長度為68位元組。加上-s0後可以抓到完整的資料包
(5)-c 100 :隻抓取100個資料包
(6)dstport ! 22:不抓取目标端口是22的資料包
(7)src net 192.168.1.0/24 :資料包的源網絡位址為192.168.1.0/24
(8)-w ./target.cap :儲存成cap檔案,友善用ethereal (即wireshark)分析
firewalld防火牆基礎
firewalld概述
firewalld防火牆是centos7系統預設的防火牆管理工具,取代了之前的iptables防火牆,也是工作在網絡層,屬于包過濾防火牆。
firewalld和iptables都是用來管理範防火牆的工具(屬于使用者态)來定意防火牆的各種規則功能,内部結構都指向netfilter網絡過濾子系統(屬于核心态),來實作防火牆的過濾功能。
firewalld提供了支援網絡區域定義的網絡連接配接以及接口安全等級的動态防火牆管理工具,它支援IPV4、IPV6防火牆設定以及以太網橋,并且擁有兩種配置模式;運作時配置以及永久配置
firewalld與iptables的差別
1、iptables主要是基于接口,來設定規則,進而判斷網絡的安全性
firewalld是基于區域,根據不同區域來設定不同的規則,進而保證網絡的安全性,與硬體防火牆的設定相類似
2、iptables在/etc/sysconfig/iptables中存儲配置
firewalld将配置存儲在/etc/firewalld(優先加載)和 /usr/lib/firewalld/ (預設的配置檔案)中的各種XML檔案裡。
3、使用iptables每一個單獨更改意味着清除所有舊的規則和從/etc/sysconfig/iptables裡讀取所有的新規則
使用firewalld卻不會再建立任何新的規則,金金牛男運作規則中的不同之處uu,是以firewalld可以運作在時間内
改變設定而不丢失現有的連接配接
4、iptables防火牆是靜态防火牆
firewalld防火牆類型是動态防火牆
總結:iptables 傾向于對資料包的源/日的IP,端口,協定,入出站網卡來設定包過濾規則
firewalld對指定的網絡區域設定相關過過濾規則,資料包在金國指定的區域時會根據區域的規則對包進行過濾
firewalld區域的概念:
firewalld防火牆為了簡化管理,将所有的網絡流量分為多個區域,然後根據資料包的源IP位址或者傳入的網絡接口等條件将流量傳入相應的區域,每個區域都定義了自己打開或者關閉的店口和服務清單
firewalld防火牆定義了9個區域
1、trusted(信任區域);允許所有的流量傳入
2、public(公共區域);允許與ssh或者dhcpv6-client預定意服務比對的傳入流量,其餘均拒絕,是新添加網絡接口的預設區域
3、extent(外部區域):允許與ssh預定意服務比對的傳入流量,其餘均拒絕
預設将通過此區域轉發的IPV4傳出流量将進行地質僞裝,可用于作為路由器啟用了僞裝功能的外部網絡
4、home(家庭區域),允許與ssh、ipp-client、mdns、samba-client或者dhcpv6-client預定意服務比對的傳入流量,其餘均拒絕
5、internal(内部區域):預設值時與home區域相同
6、work(工作區域):允許與ssh,ipp-client、dhcpv6-client預定義服務比對的傳入流量,其餘均拒絕
7、dmz(隔離區域也稱為非軍事區域):允許與ssh預定義服務比對的傳入流量。其餘均拒絕
8、block(限制區域):拒絕所有傳入流量
9、drop(丢棄區域):丢棄現有傳入流量,并且不産生包含ICMP的錯誤響應
最終一個區域的安全程度是取決于管理者在此區域中設定的規則
區域如圖進入主機的安全門,每一個區域都是具有不同限制程度的規則,隻會允許符合規則的流量傳入
可以根據網絡規模,使用一個或者多個區域,但是任何一個活躍地區,至少需要關聯源位址或者接口
預設情況下,public區域是預設區域,包含所有接口
firewalld資料處理流程:
firewalld對于進入系統的資料包,會根據資料包的源IP位址或傳入的網絡接口等條件,将資料流量轉入相應區域的防火牆規則。對于進入
系統的資料包,首先檢查的就是其源位址。
firewalld檢查資料包的源位址的規則:
1.若源位址關聯到特定的區域(即源位址或接口綁定的區域有沖突),則執行該區域所制定的規則。
firewalld防火牆的配置方法:
1、使用firewall-cmd 指令行工具。
2、使用firewall-config 圖形工具。
3、編寫/etc/firewalld/中的配置檔案。
systemctl start firewalld. service
常用的firewall-cmd指令選項
--get-default-zone :顯示目前預設區域
--set- default- zone=< zone > :設定預設區域
--get-active-zones:顯示目前正在使用的區域及其對應的網卡接口
--get-zones :顯示所有可用的區域
--get-zone-of-interface-<interface> : 顯示指定接口綁定的區域
--zone=<zone> --add-interface=<interface> :為指定接口綁定區域
--zone=<zone> --change-interface=<interface> :為指定的區域更改綁定的網絡接口
-zone=<zone> --remove-interface-<interface> :為指定的區域删除綁定的網絡接口
--zone=<zone> --add-source=<source>[/<mask>] :為指定源位址綁定區域
--zone=<zone> --change-source=<source>[/<mask>] :為指定的區域更改綁定的源位址
--zone=<zone> --remove-source=<source>[/<mask>] :為指定的區域删除綁定的源位址
-- list-all-zones :顯示所有區域及其規則
[-- zone=<zone>] --list-all :顯示所有指定區域的所有規則,省略-- zone=<zone>時表示僅對預設區域操作
常用的firewall-cmd指令選項
--get-default-zone :顯示目前預設區域
--set-default-zone=<zone> :設定預設區域
--get-active-zones :顯示目前正在使用的區域及其對應的網卡接口
--get-zones :顯示所有可用的區域
--get-zone-of-interface=<interface> :顯示指定接口綁定的區域
--zone=<zone> --add-interface=<interface> :為指定接口綁定區域
--zone=<zone> --change-interface=<interface> :為指定的區域更改綁定的網絡接口
--zone=<zone> --remove-interface-<interface> :為指定的區域删除綁定的網絡接口
--zone=<zone> --add-source=<source>[/<mask>] :為指定源位址綁定區域
--zone=<zone> --change-source=<source>[/<mask>] :為指定的區域更改綁定的源位址
--zone=<zone> --remove-source=<source>[/<mask>] :為指定的區域删除綁定的源位址
--list-all-zones :顯示所有區域及其規則
[--zone=<zone>] --list-all :顯示所有指定區域的所有規則,省略-- zone=<zone>時 表示僅對預設區域操作
[--zone=<zone>] --list-services :顯示指定區域内允許通路的所有服務
[--zone=<zone>] --add-service=<service> :為指定 區域設定允許通路的某項服務
[-- zone=<zone>] --remove-service=<service> :删除 指定區域已設定的允許通路的某項服務
[--zone=<zone>] --list-ports :顯示指定區 域内允許通路的所有端口号
[-- zone=<zone>] --add-port=<portid> [-<portid>]/<protocol> :為指定區 域設定允許通路的某個/某段端口号(包括協定名)
[--zone=<zone>] --remove-port=<portid>[-<portid>j/<protocol> :删除 指定區域已設定的允許通路的端口号(包括協定名)
[--zone=<zone>] --list-icmp-blocks :顯示指定區域内拒絕通路的所有ICMP類型
[--zone=<zone>] --add-icmp-block=<icmptype> :為指 定區域設定拒絕通路的某項ICMP類型
[--zone=<zone>] --remove-icmp-block-<icmptype> :删除 指定區域己設定的拒絕通路的某項ICMP類型
firewall-cmd --get-icmptypes :顯示所有ICMP類型
區域管理:
(1) 顯示目前系統中的預設區域
firewall-cmd --get-default-zone
(2)顯示預設區域的所有規則
firewall-cmd --list-all
(3)顯示目前正在使用的區域及其對應的網卡接口
firewall-cmd --get-active-zones
(4)設定預設區域
firewall-cmd --set-default-zone=home
firewall-cmd --get-default-zone
服務管理:
(1)檢視預設區域内允許通路的所有服務
firewall-cmd --list-service
(2)添加httpd服務到public區域
firewall-cmd --add-service=http --zone-public
(3)檢視public區域已配置規則
firewall-cmd --list-all --zone=public
(4)删除public區域的httpd服務
firewall-cmd --remove-service-http --zone-public
(5)同時添加httpd、https服務到預設區域,設定成永久生效
firewall-cmd --add-service=http --add-service=https --pe rmanent
firewall-cmd --add-service= {http, https, ftp} --zone=internal
firewall-cmd --reload
firewall-cmd --list-all
#添加使用--permanent選項表示設定成永久生效,需要重新啟動firewalld服務或執行firewall-cmd --reload指令
重新加載防火牆規則時才會生效。若不帶有此選項,表示用于設定運作時規則,但是這些規則在系統或firewalld服務重新開機、停止時配置将失效
端口管理:
(1) 允許TCP的443端口到internal區域
firewall-cmd -- zone=internal --add-port=443/tcp
firewall-cmd --list-all --zone=internal
(2)從internal 區域将TCP的443端口移除
firewall-cmd -- zlone= internal --remove-port=443/tcp
(3)允許UDP的2048~2050端口到預設區域
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all