防火牆 (iptables、firewalld)

1、iptables

1. iptables概述

Linux系統的防火牆:IP信息包過濾系統,它實際上由兩個組件netfilter和iptables組成。
主要工做在網絡層,針對IP數據包。體如今對包內的IP地址、端口等信息的處理上。javascript

2. netfilter和iptables

(1)netfilter

netfilter屬於「內核態」(Kernel Space,又稱爲內核空間)的防火牆功能體系;
是內核的一部分,由一些數據包過濾表組成,這些表包含內核用來控制數據包過濾處理的規則集。css

(2)iptables

iptables屬於「用戶態」(User Space,又稱爲用戶空間)的防火牆管理體系;
是一種用來管理Linux防火牆的命令程序,它使插入、修改和刪除數據包過濾表中的規則變得容易,一般位於/sbin/iptables目錄下。java

(3)netfile/iptables

netfilter/iptables下文中統一簡稱爲iptables。
iptables是基於內核的防火牆,其中內置了raw、mangle、nat和 filter四個規則表。
表中全部規則配置後,當即生效,不須要重啓服務。linux

3. 四表五鏈

(1)四表

規則表的做用:容納各類規則鏈,即表中有鏈。nginx

規則表 說明
raw表 肯定是否對該數據包進行狀態跟蹤。包含兩個規則鏈,OUTPUT、PREROUTING
mangle表 修改數據包內容,用來作流量整形的,給數據包設置標記。包含五個規則鏈,INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
nat表 負責網絡地址轉換,用來修改數據包中的源、目標IP地址或端口。包含三個規則鏈,OUTPUT、PREROUTING、POSTROUTING。
filter表 負責過濾數據包,肯定是否放行該數據包(過濾)。包含三個規則鏈,INPUT、FORWARD、OUTPUT

注:在iptables的四個規則表中,mangle表和raw表的應用相對較少web

(2)五鏈

規則鏈的做用:容納各類防火牆規則,即鏈中有規則。sql

規則鏈 說明
INPUT 處理入站數據包,匹配目標IP爲本機的數據包
OUTPUT 處理出站數據包,通常不在此鏈上作配置
FORWARD 處理轉發數據包,匹配流經本機的數據包
PREROUTING 在進行路由選擇前處理數據包,用來修改目的地址,用來作DNAT。至關於把內網中的80端口映射到路由器外網端口上
POSTROUTING鏈 在進行路由選擇後處理數據包,用來修改源地址,用來作SNAT。至關於內網經過路由器NAT轉換功能實現內網主機經過一個公網IP地址上網

(3)規則表的匹配順序

raw>>mangle>>nat>>filterapache

(4)規則鏈之間的匹配順序

  1. 主機型防火牆
    1)入站數據(來自外界的數據包,且目標地址是防火牆本機)
    PREROUTING --> INPUT --> 本機的應用程序
    2)出站數據(從防火牆本機向外部地址發送的數據包)
    本機的應用程序 --> OUTPUT --> POSTROUTING
  2. 網絡型防火牆
    轉發數據(須要通過防火牆轉發的數據包)
    PREROUTING --> FORWARD --> POSTROUTING
  3. 規則鏈內的匹配順序
    1)自上向下按順序依次進行檢查,找到相匹配的規則即中止(LOG策略例外,表示記錄相關日誌)
    2)若在該鏈內找不到相匹配的規則,則按該鏈的默認策略處理(未修改的情況下,默認策略爲容許)

4. iptables的安裝

CentOS 7默認使用firewalld防火牆,沒有安裝iptables,若想使用iptables防火牆。必須先關閉firewalld防火牆,再安裝iptablesvim

#關閉防火牆 [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# systemctl disable firewalld.service #安裝並開啓iptables服務 [root@localhost ~]# yum -y install iptables iptables-services [root@localhost ~]# systemctl start iptables.service 

5. iptables防火牆的配置

(1)命令行配置格式

(2)注意事項

  1. 不指定表名時,默認指filter表
  2. 不指定鏈名時,默認指表內的全部鏈
  3. 除非設置鏈的默認策略,不然必須指定匹配條件
  4. 選項、鏈名、控制類型使用大寫字母,其他均爲小寫

(3)經常使用的控制類型

控制類型 做用
ACCEPT 容許數據包經過。DROP直接丟棄數據包,不給出任何迴應信息
REJECT 拒絕數據包經過,會給數據發送端一個響應信息
SNAT 修改數據包的源地址
DNAT 修改數據包的目的地址
MASQUERADE 假裝成一個非固定公網IP地址
LOG 在/var/log/messages文件中記錄日誌信息,而後將數據包傳遞給下一條規則。LOG只是一種輔助動做,並無真正處理數據包

(4)經常使用的管理選項

選項 說明
-A 在指定鏈的末尾追加(–append)一條新的規則
-I 在指定鏈的開頭插入(–insert)一條新的規則,未指定序號時默認做爲第一條規則
-R 修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容
-P 設置指定鏈的默認策略(–policy)
-D 刪除(–delete)指定鏈中的某一條規則,可指定規則序號或具體內容
-F 清空(–flush)指定鏈中的全部規則,若未指定鏈名,則清空表中的全部鏈
-L 列出(–list)指定鏈中全部的規則,若未指定鏈名,則列出表中的全部鏈
-n 使用數字形式(–numeric)顯示輸出結果,如顯示IP地址而不是主機名
-v 顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
–line-numbers 查看規則時,顯示規則的序號

(5)匹配條件

匹配條件 說明
-p 指定要匹配的數據包的協議類型
-s 指定要匹配的數據包的源IP地址
-d 指定要匹配的數據包的目的IP地址
-i 指定數據包進入本機的網絡接口
-o 指定數據包離開本機作使用的網絡接口
–sport 指定源端口號
–dport 指定目的端口號

6. 匹配類型

①通用匹配

直接使用,不依賴於其餘條件或擴展,包括網絡協議、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 
②隱含匹配

以特定的協議匹配做爲前提,包括端口、TCP標記、ICMP類型等條件

  1. 端口匹配
--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 
  1. TCP標記匹配
--tcp-flags TCP標記 iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT #丟棄SYN請求包,放行其餘包 
  1. 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不通其它主機時提示目標不可達 iptables -A INPUT -p icmp -j REJECT #此時其它主機須要配置關於icmp協議的控制類型爲 REJECT 
③顯示匹配

要求以「-m 擴展模塊」的形式明確指出類型,包括多端口、MAC地址、IP範圍、數據包狀態等條件

  1. 多端口匹配
-m multiport --sports 源端口列表 -m multiport --dports 目的端口列表 例: 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 
  1. 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 
  1. 狀態匹配
-m state --state 鏈接狀態 常見的鏈接狀態: NEW :與任何鏈接無關的,還沒開始鏈接 ESTABLISHED :響應請求或者已創建鏈接的,鏈接態 RELATED :與已有鏈接有相關性的(如FTP 主被動模式的數據鏈接),衍生態,通常與ESTABLISHED 配合使用 INVALID :不能被識別屬於哪一個鏈接或沒有任何狀態 iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP #禁止轉發與正常 TCP 鏈接無關的非--syn 請求數據包(如僞造的網絡攻擊數據包) 

7. SNAT原理與應用

(1)應用環境

局域網主機共享單個公網IP地址接入Internet(私有IP不能在Internet中正常路由)。
一個IP地址作SNAT轉換,通常可讓內網 100到200 臺主機實現上網。

(2)原理

修改數據包的源地址

(3)SNAT轉換前提條件

局域網各主機已正確設置IP地址、子網掩碼、默認網關地址
Linux網關開啓IP路由轉發

(4)路由轉發開啓方式

1.臨時打開: echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -w net.ipv4.ip_forward=1 2.永久打開: vim /etc/sysctl.conf net.ipv4.ip_forward = 1 #將此行寫入配置文件 3.sysctl -p #讀取修改後的配置 

(5)SNAT轉換具體格式

  1. 固定的公網IP地址:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24(內網IP) -o(出站) ens33(外網網卡) -j SNAT --to 12.0.0.1(外網IP或地址池) iptables -t nat -A POSTROUTING -s 192.168.80.0/24(內網IP) -o(出站) ens33(外網網卡) -j SNAT --to-source 12.0.0.1-12.0.0.10(外網IP或地址池) 
  1. 非固定的公網IP地址(共享動態IP地址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE 

8. DNAT原理與應用

(1)應用環境

在Internet中發佈位於局域網內的服務器。
主機型防火牆:主要使用INPUT、OUTPUT鏈,設置規則時通常要詳細的指定到端口。
網絡型防火牆:主要使用FORWARD鏈,設置規則時不多去指定到端口,通常指定到IP地址或者到網段便可。

(2)原理

修改數據包的目的地址

(3)DNAT轉換前提條件

局域網的服務器可以訪問Internet
網關的外網地址有正確的DNS解析記錄
Linux網關開啓IP路由轉發

(4)DNAT轉換

使用DNAT時,同時配合SNAT使用,才能實現響應數據包的正確返回

  1. 發佈內網的Web服務
#把從ens33進來的要訪問web服務的數據包目的地址轉換爲 192.168.80.11 iptables -t nat -A PREROUTING -i(入站) ens33(外網網卡) -d 12.0.0.1(外網IP) -p tcp --dport 80 -j DNAT --to 192.168.80.11(內網服務器Ip) iptables -t nat -A PREROUTING -i(入站) ens33(外網網卡) -d 12.0.0.1(外網IP) -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11(內網服務器IP) iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20(地址池) 
  1. 發佈時修改目標端口
#發佈局域網內部的OpenSSH服務器,外網主機需使用250端口進行鏈接 iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 250 -j DNAT --to 192.168.80.11:22 
ssh -p 250 root@12.0.0.1 #在外網環境中使用SSH測試 yum -y install net-tools #若沒有 ifconfig 命令可提早使用 yum 進行安裝 ifconfig ens33 

9. 防火牆規則的備份和還原

(1)導出(備份)全部表的規則

iptables-save > /opt/ipt.txt 

(2)導入(還原)規則

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 中的規則 

10. linux系統抓包

(1)格式

例:tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

(2)選項

選項 說明
tcp ip icmp arp rarp和tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據包的類型
-i ens33 只抓通過接口ens33的包
-t 不顯示時間戳
-s 0 抓取數據包時默認抓取長度爲68字節。加上-s 0後能夠抓取完整的數據包
-c 100 只抓取100個數據包
dst port !22 不抓取目標端口是22的數據包
src net 192.168.1.0/24 數據包的源網絡地址爲192.168.1.0/24
-w ./target.cap 保存成cap文件,方便用ethereal(wireshark)分析

2、firewalld

1. firewalld防火牆簡介

firewalld防火牆是Centos7系統默認的防火牆管理工具,取代了以前的iptables防火牆,也是工做在網絡層,屬於包過濾防火牆
firewalld和iptables都是用來管理防火牆的工具(屬於用戶態)來定義防火牆的各類規則功能,內部結構都指向netfilter網絡過濾子系統(屬於內核態)來實現包過濾防火牆功能
firewalld提供了支持網絡區域所定義的網絡鏈接以及接口安全等級的動態防火牆管理工具
它支持IPv四、IPv6防火牆設置以及以太網橋(在某些高級服務可能會用到,好比雲計算),而且擁有兩種配置模式:運行時配置與永久配置

2. firewalld與iptables的區別

區別項 firewalld iptables
配置文件 /usr/lib/firewalld
/etc/firewalld
/etc/sysconfig/iptables
對規則的修改 不須要所有刷新策略,不丟失現行鏈接 須要所有刷新策略,丟失鏈接
防火牆類型 動態防火牆 靜態防火牆
  1. iptables主要是基於接口,來設置規則,從而判斷網絡的安全性;firewalld是基於區域,根據不一樣的區域來設置不一樣的規則,從而保證網絡的安全。與硬件防火牆的設置相相似
  2. iptables在/etc/ sysconfig/iptables中儲存配置;firewalld將配置儲存在/etc/firewalld/(優先加載)和/usr/lib/ firewalld/ (默認的配置文件)中的各類XML文件裏
  3. 使用iptables每個單獨更改意味着清除全部舊有的規則和從/etc/sysconfig/iptables裏讀取全部新的規則;使用firewalld卻不會再建立任何新的規則,僅僅運行規則中的不一樣之處。所以firewalld能夠在運行時間內,改變設置而不丟失現行鏈接
  4. iptables防火牆類型爲靜態防火牆;firewalld防火牆類型爲動態防火牆

3. firewalld區域的概念

firewalld防火牆爲了簡化管理,將全部網絡流量分爲多個區(zone),而後根據數據包的源IP地址或傳入的網絡接口等條件將流量傳入相應區域。每一個區域都定義了本身打開或者關閉的端口和服務列表

(1)firewalld防火牆9個區域

區域 說明
trusted(信任區域) 容許全部的傳入流量
public(公共區域) 容許與ssh或dhcpv6-client預約義服務匹配的傳入流量,其他均拒絕。是新添加網絡接口的默認區域
external(外部區域) 容許與 ssh 預約義服務匹配的傳入流量,其他均拒絕。 默認將經過此區域轉發的IPv4傳出流量將進行地址假裝,可用於爲 路由器啓用了假裝功能的外部網絡
home(家庭區域) 容許與ssh、ipp-client、mdns、samba-client或dhcpv6-client預約義服務匹配的傳入流量,其他均拒絕
internal(內部區域) 默認值時與home區域相同
work(工做區域) 容許與 ssh、ipp-client、dhcpv6-client 預約義服務匹配的傳入流量,其他均拒絕
dmz(隔離區域也稱爲非軍事區域) 容許與 ssh 預約義服務匹配的傳入流量,其他均拒絕
block(限制區域) 拒絕全部傳入流量
drop(丟棄區域) 丟棄全部傳入流量,而且不產生包含ICMP的錯誤響應

(2)區域介紹

  1. 最終一個區域的安全程度是取決於管理員在此區域中設置的規則
  2. 區域如同進入主機的安全門,每一個區域都具備不一樣限制程度的規則,只會容許符合規則的流量傳入
  3. 能夠根據網絡規模,使用一個或多個區域,可是任何一個 活躍區域 至少須要關聯 源地址或接口
  4. 默認狀況下,public區域是默認區域,包含全部接口(網卡)

4. firewalld數據處理流程

firewalld對於進入系統的數據包,會根據數據包的源IP地址或傳入的網絡接口等條件,將數據流量轉入相應區域的防火牆規則。對於進入系統的數據包,首先檢查的就是其源地址

5. firewalld檢查數據包的源地址規則

  1. 若源地址關聯到特定的區域(即源地址或接口綁定的區域有衝突),則執行該區域所制定的規則
  2. 若源地址未關聯到特定的區域(即源地址或接口綁定的區域沒有衝突),則使用傳入網絡接口的區域並執行該區域所制定的規則
  3. 若網絡接口也未關聯到特定的區域(即源地址或接口都沒有綁定特定的某個區域),則使用默認區域並執行該區域所制定的規則

6. firewalld防火牆的配置方法

(1)使用firewall-cmd命令行工具

經常使用的firewall-cmd命令選項 說明
--get-default-zone 顯示當前默認區域
--set-default-zone= 設置默認區域
--get-active-zones 顯示當前正在使用的區域及其對應的網卡接口
--get-zones 顯示全部可用的區域
--get-zone-of-interface= 顯示指定接口綁定的區域
--zone= --add-interface= 爲指定接口綁定區域
--zone= --change-interface= 爲指定的區域更改綁定的網絡接口
--zone= --remove-interface= 爲指定的區域刪除綁定的網絡接口
--get-zone-of-source=[/] 顯示指定源地址綁定的區域
--zone= --add-source=[/] 爲指定源地址綁定區域
--zone= --change-source=[/] 爲指定的區域更改綁定的源地址
--zone= --remove-source=[/] 爲指定的區域刪除綁定的源地址
--list-all-zones 顯示全部區域及其規則
[--zone=] --list-all 顯示全部指定區域的全部規則,省略--zone=時表示僅對默認區域操做
[--zone=] --list-services 顯示指定區域內容許訪問的全部服務
[--zone=] --add-service= 爲指定區域設置容許訪問的某項服務
[--zone=] --remove-service= 刪除指定區域已設置的容許訪問的某項服務
[--zone=] --list-ports 顯示指定區域內容許訪問的全部端口號
[--zone=] --add-port=[-]/ 爲指定區域設置容許訪問的某個/某段端口號(包括協議名)
[--zone=] --remove-port=[-]/ 刪除指定區域已設置的容許訪問的端口號(包括協議名)
[--zone=] --list-icmp-blocks 顯示指定區域內拒絕訪問的全部 ICMP 類型
[--zone=] --add-icmp-block= 爲指定區域設置拒絕訪問的某項 ICMP 類型
[--zone=] --remove-icmp-block= 刪除指定區域已設置的拒絕訪問的某項ICMP類型
firewall-cmd --get-icmptypes 顯示全部 ICMP 類型

(2)使用firewall-config圖形工具


(3)編寫/etc/firewalld/中的配置文件

7. 區域管理

  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

8. 服務管理

  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 --permanent
    firewall-cmd --reload
    firewall-cmd --list-all
    注:
  6. 添加使用 --permanent選項表示設置成永久生效,須要從新啓動firewalld服務或執行firewall-cmd --reload命令,從新加載防火牆規則時纔會生效。若不帶有此選項,表示用於設置運行時規則,可是這些規則在系統或firewalld服務重啓、中止時配置將失效。
  7. --runtime-to-permanent:將當前的運行時配置寫入規則配置文件中,使之成爲永久性配置

9. 端口管理

    1. 容許TCP的443端口到internal區域
      firewall-cmd --zone=internal --add-port=443/tcp
      firewall-cmd --list-all --zone=internal
    2. 從internal 區域將TCP的443端口移除
      firewall-cmd --zone=internal --remove-port=443/tcp
    3. 容許UDP的2048~2050端口到默認區域firewall-cmd --add-port=2048-2050/udpfirewall-cmd --list-all
相關文章
相關標籤/搜索