iptables 防火牆
一: iptables 概述
1.1 iptables 的組成和工作位置
-
組成:它是linux系統的防火牆: iP資訊包過濾系統,它實際上由兩個元件 netfilter 和 iptables 組成。
-
工作位置:主要工作在網路層,針對IP 資料包。體現在對包內ip地址,埠資訊,協議等處理
1.2 netfiler 和 iptables 的關係
-
netfilter:
-
屬於“核心態”的防火牆功能體系。
-
是核心的一部分,由一些資料包過濾表組成,這些表包含核心用來控制資料包過濾處理的規則集
-
-
iptables:
-
屬於“使用者態” 的防火牆管理體系
-
是一種用來管理Linux防火牆的命令程式,它使插入,修改,和刪除資料包過濾表中的規則變得容易,通常位於 /usr/sbin/iptables 檔案
netfilter/iptables 後期簡稱為 iptables 。 iptables 是基於核心的防火牆,其中內建了四個規則表。表中所有的規則配置後,立即生效,不需要重啟服務
-
1.3 四表五鏈
規則表作用:容納各種規則鏈
規則鏈作用:容納各種防火牆規則
總結:表裡有鏈,鏈裡有規則
1.3.1 四表
raw表∶ 確定是否對該資料包進行狀態跟蹤。包含兩個規則鏈, OUTPUT、PREROUTING。
mangle表∶修改資料包內容,用來做流量整形的,給資料包設定標記。包含五個規則鏈,INPUT、oUTPUT、FORWARD、PRERoUTTNG、PosTRou TING。
nat表∶ 負責網路地址轉換,用來修改資料包中的源、目標IP地址或埠。包含三個規則鏈, oUTPUT、PRERoUTING、PoSTRoUTING。
filter表:負責過濾資料包, 確定是否放行該資料包(過濾)。 包含三個規則鋅鏈,INPUT、FORWARD、OUTPUT。
-
在iptable的四個規則表中,mangle表和raw 表 應用相對較少
1.3.2 五鏈
-
INPUT:處理入站資料包,匹配目標IP為本機的資料包。
-
OUTPUT:處理出站資料包,一般不在此鏈上做配置。
-
FORWARD:處理轉發資料包,匹配流經本機的資料包。
-
PREROUTING鏈:在進行路由選擇前處理資料包,用來修改目的地址,用來做DNAT。相當於把內網伺服器的工P和埠對映到路由器的外網IP和埠上
-
POSTROUTING鏈:在進行路由選擇後處理資料包,用來修改源地址,用來做SNAT。相當於內網通過路由器NAT轉換功能實現內網主機通過一個公網IP地址上網。
1.3.3 規則表的匹配順序
raw → mangle → nat → filter
1.3.4 規則鏈之間的匹配順序
-
主機型防火牆
-
入站資料(來自外界的資料包,且目標地址是防火牆本機)
-
PREROUTING --> INPUT --> 本機的應用程式
-
-
出站資料(從防火牆本機向外部地址傳送的資料包)
-
本機的應用程式 --> OUTPUT --> POSTROUTING
-
-
-
網路型防火牆
-
轉發資料(需要經過防火牆轉發的資料包)
-
PREROUTING --> FORWARD --> POSTROUTING
-
-
-
規則鏈內的匹配順序
-
自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日誌)
-
若在該鏈內找不到相匹配的規則,則按該鏈的預設策略處理(未修改的狀況下,預設策略為允許)
-
-
二: 編寫防火牆規則
2.1 安裝iptables防火牆
-
CentOS 7預設使用firewalld防火牆,沒有安裝 iptables,若想使用iptables防火牆。必須先關閉firewalld防火牆,再安裝 iptables
#關閉防火firewalld 防火牆,並取消開機自啟
systemctl stop firewalld
systemctl disable firewalld
#下載iptables 防火牆,並啟動
yum -y install iptables iptables-services
systemctl start iptables
2.2 iptables 的配置方法
2.2.1 命令列配置格式
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [ -j 控制型別]
-
不指定表名時,預設指filter表
-
不指定鏈名時,預設指表內的所有鏈
-
除非設定鏈的預設策略,否則必須指定匹配條件
-
選項、鏈名、控制型別使用大寫字母,其餘均為小寫
2.2.2 常用控制型別
控制型別 | 作用 |
---|---|
ACCEPT | 允許資料通過 |
DROP | 直接丟棄資料包,不會給出迴應資訊 |
REJECT | 拒絕資料包通過,給出迴應資訊 |
SNAT | 修改資料包源地址 |
DNAT | 修改資料包目的地址 |
MASQUERADE | 偽裝為一個非固定公網IP地址 |
LOG | /var/log/messages 檔案中記錄日誌資訊然後將包傳遞給下一條規則。只是一種輔助動作,並不會真正處理資料包 |
2.2.3 常用管理選項
-
-A ∶ 在指定鏈的末尾追加 (–append)一條新的規則
-
-I ∶ 在指定鏈的開頭插入(–insert)一條新的規則, 未指定序號時預設作為第一條規則
-
-R ∶ 修改、替換(–replace)指定鏈中的某一條規則,可指定規則序號或具體內容
-
-P ∶設定指定鏈的預設策略(–policy)
-
-D ∶ 刪除 (–delete)指定鏈中的某一條規則, 可指定規則序號或具體內容
-
-F ∶ 清空(–flush)指定鏈中的所有規則,若未指定鏈名,則清空表中的所有鏈
-
-L∶列出 (–list)指定鏈中所有的規則,若未指定鏈名,則列出表中的所有鏈
-
-n ∶ 使用數字形式(–numeric)顯示輸出結果,如顯示 IP 地址而不是主機名
-
-v ∶ 顯示詳細資訊,包括每條規則的匹配包數量和匹配位元組數
-
--line-numbers∶ 檢視規則時,顯示規則的序號
2.2.4匹配條件
-
-p :指定要匹配的資料包協議型別
-
-s :指定要匹配的資料包源 IP 地址
-
-d : 指定要匹配的資料包的目的 IP 地址
-
-i :指定資料包進入本機的網路介面
-
-o :指定資料包離開本機的網路介面
-
--sport :指定源埠號
-
--dport :指定目的埠號
2.2.5 新增,檢視,刪除規則
-
新增新規則
iptables -t filter -A INPUT -p icmp -j REJECT 禁止ping通本主機(有響應)
iptables -t filter -A INPUT -p icmp -j DROP 禁止ping通本主機(無響應)
iptables -I INPUT 2 -p tcp--dport 22 -jACCEPT
-
檢視規則表
iptables [-t 表名 ]-n -L[ 鏈名][--line-numbers]
或
iptables -[vn]L #注意∶不可以合寫為 -Ln
iptables -n -L --line-numbers
-
設定預設策略
iptlables [-t 表名 ] -P <鏈名><控制型別>
iptables -P INPUT DROp iptables -P FORWARD DROp
-
刪除規則
iptables -D INPUT 2
iptables -t filter -D INPUT -p icmp -jREJECT
注意∶
若規則列表中有多條相同的規則時, 按內容匹配只刪除的序號最小的一條
按號碼匹配刪除時, 確保規則號碼小於等於已有規則數,否則報錯
按內容匹配刪數時, 確保規則存在, 否則報錯
-
清空規則
iptables [-t 表名] -F [鏈名]
iptables -F INPUT
iptables -F
注意:
-F 僅僅是清空鏈中的規則,並不影響 -P 設定的預設規則,預設規則需要手動進行修改
-P 設定了DROP後,使用-F 一定要小心
防止把允許遠端連線的相關規則清除後導致無法遠端連線主機,此情況如果沒有儲存規則可重啟主機解決
如果不寫表名和鏈名,預設清空filter表中所有鏈裡的所有規
2.3 規則的匹配
2.3.1 通用匹配
可以直接使用,不依賴與其他條件或擴充套件,包括網路協議、IP地址、網路介面等條件
協議匹配∶ -p 協議名(如tcp,udp,ip,icmp等)
地址匹配∶ -s 源地址、-d 目的地址 #可以是IP、網段、域名、空(任何地址)
介面匹配∶ -i 入站網絡卡(如ens33,ens36等網絡卡)、 -o 出站網絡卡
#設定FORWARD 鏈規則,除了 icmp 協議資料包,其他都允許通過
iptables -A FORWARD ! -p icmp -j ACCEPT
#設定INPUT鏈規則,源ip 是192.168.23.103 的資料包,丟棄
iptables -A INPUT -s 192.168.23.103 -j DROP
#設定INPUT 鏈規則,從網絡卡 ens33進入,且源 ip 是192.168.23.0 網段的資料包丟棄
iptables -I INPUT -i ens33 -s 192.168.23.0/24 -j DROP
2.3.2 隱含匹配
要求以特定的協議匹配作為前提,包括埠,TCP標記,ICMP標記
-
埠匹配
--sport 源埠、
--dport 目的埠
#可以是個別埠、埠範圍
--sport 1000 匹配源埠是1000的資料包 --sport 1000:3000 匹配源埠是1000-3000的資料包 --sport :3000 匹配源埠是3000及以下的資料包 --sport 1000: 匹配源埠是1000及以上的資料包 注意:--sport 和 --dport 必須配合 -p <協議型別> 使用
# 在 INPUT 鏈末尾追加規則, tcp協議,且目標埠是20到21 埠的資料包,允許通過
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
#在FORWARD 鏈 開頭插入規則, 目標ip 是192.168.23.0/24 網段,協議是tcp協議,且目標埠是24500到24600的資料包,丟棄
iptables -I FORWARD -d 192.168.23.0/24 -p tcp --dport 24500:24600 -j DROP
-
TCP標記匹配
--tcp-flags TCP標記( URG,ACK,PSH,RST,SYN,FIN)
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -jACCEPT
#丟棄SYN請求包,放行其他包
-
ICMP型別匹配
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
2.3.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
#INPUT 鏈允許 tcp 協議 目標埠 80,22,21,20,52 的資料包通過
iptables -A INPUT -p udp -m multiport --dport 53 -j ACCEPT
#INPUT 鏈 允許 udp 協議,目標埠是 53 的資料包通過
-
IP範圍匹配
-m iprange --src-range IP範圍
iptables -A FORWARD -p udp -m iprange --src-range 192.168.23.100-192.168.80.23 -j DROP
#禁止轉發源地址位於192.168.23.100-192.168.23.200的udp資料包
-
狀態匹配
-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
三 SNAT 和 DNAT
3.1 SNAT 原理與應用
3.1.1 應用
-
區域網主機共享單個公網IP地址接入Internet(私有IP不能在Internet中正常路由)
3.1.2SNAT原理
-
修改資料包的源地址。
3.1.3 SNAT轉換前提條件
-
區域網各主機已正確設定IP地址、子網掩碼、預設閘道器地址
-
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 #讀取修改後的配置
3.1.4 SNAT 轉換
#SNAT轉換 1:固定的公網IP地址:
iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens33 -j SNAT --to 12.0.0.1
或
iptables -t nat -A POSTROUTING -s 192.168.23.0/24 -o ens33 -j SNAT --to-source 12.0.0.1-12.0.0.10
#192.168.23.0/24 內網ip
#-o 指定網網絡卡
# ens33 外網網絡卡
#SNAT轉換2:非固定的公網IP地址(共享動態IP地址):
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j MASQUERADE
3.2 DNAT 原理與應用
3.2.1 DNAT 應用環境
在Internet中釋出位於區域網內的伺服器
3.2.2 DNAT原理
修改資料包的目的地址。
3.2.3 DNAT轉換前提條件
-
區域網的伺服器能夠訪問Internet
-
閘道器的外網地址有正確的DNS解析記錄
-
Linux閘道器開啟IP路由轉發
3.2.4 DNAT 轉換
釋出內網的Web服務
#把從ens33進來的要訪問web服務的資料包目的地址轉換為 192.168.23.11
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.80.11
或
iptables -t nat -A PREROUTING -i ens33 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to 192.168.80.11-192.168.80.20
# -i 指定入站網絡卡
# ens33 外網網絡卡
# 12.0.0.1 外網ip
2、釋出時修改目標埠
#釋出區域網內部的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測試
ssh -p 250 [email protected]
yum -y install net-tools #若沒有 ifconfig 命令可提前使用 yum 進行安裝
ifconfig ens33
四: 防火牆規則備份和還原
iptables 規則檔案儲存在/etc/sysconfig/iptables中,iptables 啟動時,會自動還原規則
iptables-save > /etc/sysconfig/iptables
#停止iptables服務,會清空所有表的規則
systemctl stop iptables
#啟動iptables 服務會自動還原 /etc/sysconfig/iptables
systemctl start iptables
4.1 匯出(備份)所有表的規則
iptables-save > /opt/ipt.txt
#將規則匯出到檔案 ipt.txt中
4.2 匯入(還原)規則
iptables-restore </opt/ipt.txt
五: 抓包命令 tcpdump
tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.23.0/24 -w ./target.cap
#tcp: 協議型別,放在第一個引數,用來過濾資料型別。如 ip,icmp,arp,rarp,tcp,udp 等
# -i ens33 : 只抓取經過介面 ens33 的包
# -t : 不顯示時間戳
# -s 0 : 抓取資料包時預設抓取長度為 68 位元組。加上 -s 0 後嗎,可以抓到完整的資料包
# -c 100 : 只抓取 100 個包
# dst port ! 22 : 不抓取目標埠是 22 的包
#src net 192.168.23.0/24 :資料包的源ip為 192.168.23.0/24 網段
#-w ./target.cap :儲存成 cap 檔案,可以拷貝到windows使用 (wireshark )分析