通信五元素
源ip和目標ip 源端口和目標端口 協議
通信四元素
源ip和目標ip 源端口和目標端口
iptables表鏈結構
Netfilter
Linux防火墻是由Netfilter組件提供的,Netfilter工作在內核空間,集成在linux內核中
Netfilter是Linux 2.4.x之后新一代的Linux防火墻機制,是linux內核的一個子系統。
Netfilter采用模塊化設計,具有良好的可擴充性,提供擴展各種網絡服務的結構化底層框架。
Netfilter與IP協議棧是無縫契合,并允許對數據報進行過濾、地址轉換、處理等操作。
?
netfilter/iptables關系
netfilter:屬于“內核態”又稱內核空間的防火墻功能體系。linux 好多東西都是內核態 用戶態,那我們運維人員關注的是用戶態, 內核我們關注不是很多,內核基本是我們開發人員關心的事情是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables :屬于“用戶態”的防火墻管理體系。
是一種用來管理Linux防火墻的命令程序,它使插入、修改和刪除數據包過濾表中的規則變得容易,通常位于/sbin/iptables目錄下。
netfilter/iptables后期簡稱為iptables。iptables是基于內核的防火墻,其中內置了raw、mangle、 nat和filter四個規則表。
表中所有規則配置后,立即生效,不需要重啟服務。
iptables的四表五鏈結構介紹
iptables由四個表table和五個鏈chain以及一些規則組成(SELinux也是一個表,但它是獨立的,不在我們討論的范圍內)
規則鏈
規則作用:對數據包進行過濾處理
? 規則表作用:容納各種規則鏈
? 鏈作用:容納各種防火墻規則
? 鏈分類依據:處理數據包不同時機
默認五種規則鏈
?INPUT:處理入棧數據包
? OUTPUT:處理出棧數據包
? FORWARD:處理轉發數據包
? POATROUTING鏈:在進行路由選擇后處理數據包
? PREROUTING鏈:在進行路由選擇前處理數據包
表作用:容納各種規則鏈
表劃分依據:防火墻規則相似
默認包括四個規則表
raw表:確定是否對該數據包進行狀態跟蹤
mangle表:為數據包設置標記
nat表:修改數據包中源目標IP地址或端口
filter表:確定是否放行該數據包(過濾)(ip地址,端口協議)
按照順序,依次查當前表中鏈,看鏈中是否有匹配規則,匹配到立即停止,找不到使用鏈默認策略處理
入棧:PREROUTING---------->INPUT
出棧:OUTPUT----------------->POSTROUTING
轉發:PREROUTING---------->FORWARD--------->POSTROUTING
規則鏈內匹配順序
按順序依次檢查,匹配即停止(LOG策略例外)
若找不到相匹配規則,則按該鏈默認策略處理
1.按照順序查
raw表------->mangle表--------->nat表--------->filter表(input讓不讓數據進來,進不來丟棄)-------->路由轉發(不允許轉發,直接丟棄)--------->一般不會對數據限制------->r m n f-------->nat(對數據進行地址轉換)--------->出去,送達
nat PREROUTING:目的地址轉換,把公網IP換成內網IP(外網訪問內網)
nat POSTROUTING:源地址轉換,把內網地址轉換成公網(內網轉成公網地址才能上網
?
總結
四表五鏈
規則表的作用:容納各種規則鏈
規則鏈的作用:容納各種防火墻規則
總結:表里有鏈,鏈里有規則
內核中數據包的傳輸過程
1. 當一個數據包進入網卡時,數據包首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
2. 如果數據包是進入本機的,數據包就會沿著圖向下移動,到達INPUT鏈。
數據包到達INPUT鏈后, 任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包經過OUTPUT鏈,然后到達
3. 如果數據包是要轉發出去的,且內核允許轉發,數據包就會向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出
三種報文流向
流入本機:PREROUTING --> INPUT-->用戶空間進程 httpd服務-目的轉換-httpd
流出本機:用戶空間進程 -->OUTPUT--> POSTROUTING ?httpd服務-out-源地址
轉發:PREROUTING --> FORWARD --> POSTROUTING ?-----FOR------
nat PREROUTING ? 目的地址轉換,要把別人的公網IP換成你們內部的IP
nat POSTROUTING ?源地址轉換,要把你的內網地址轉換成公網地址才能上網,一般用于對外發布內網的服務
規則內的匹配順序
自上向下按順序依次進行檢查,找到相匹配的規則即停止(LOG策略例外,表示記錄相關日志)
若在該鏈內找不到相匹配的規則,則按該鏈的默認策略處理(未修改的狀況下,默認策略為允許)
?
iptables
iptables 安裝
CentOS7默認使用firewalld防火墻,沒有安裝iptables,若想使用iptables防火墻。必須先關閉firewalld防火墻,再安裝iptables。
1.關閉firewalld防火墻
systemctl stop firewalld.service
systemctl disable firewalld.service
2.安裝iptables 防火墻
yum -y install iptables iptables-services
3.設置iptables開機啟動
systemctl start iptables.service
systemctl enable iptables.service
4.iptables防火墻的配置方法:
1、使用iptables命令行。
2、使用system-config-firewall; centso7不能使用 centos 6可以使用
?
iptables的命令格式
iptables ?[-t 表名] ?管理選項 ?[鏈名] ?[匹配條件] ?[-j 控制類型]
-t:如果不指定 ?默認是filter
表名、鏈名用來指定 iptables 命令所操作的表和鏈,未指定表名時將默認使用 filter 表;
管理選項:表示iptables規則的操作方式,如插入、增加、刪除、查看等;
匹配條件:用來指定要處理的數據包的特征,不符合指定條件的數據包將不會處理;
控制類型指的是數據包的處理方式,如允許、拒絕、丟棄等。
?
注意事項:
不指定表名時,默認指filter表
不指定鏈名時,默認指表內的所有鏈,一般不這么操作
除非設置鏈的默認策略,否則必須指定匹配條件
選項、鏈名、控制類型使用大寫字母,其余均為小寫
?
數據包的常見控制類型
對于防火墻,數據包的控制類型非常關鍵,直接關系到數據包的放行、封堵及做相應的日志記錄等。
在 iptables 防火墻體系中,最常用的幾種控制類型如下
ACCEPT:允許數據包通過。?
DROP: ?直接丟棄數據包,不給出任何回 應信息。?
REJECT:拒絕數據包通過,必要時會給數據發送端一個響應信息。
SNAT: ? ?修改數據包的源地址
DNAT: ? ?修改數據包的本地地址?
LOG: ? 在/var/log/messages 文件中記錄日志信息,然后將數據包傳遞給下一條規則。
?iptables 命令的常用管理選項
管理選項 ? ? ? ? 用法示例 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?-A ? ? ? ? ? ? 在指定鏈末尾追加一條 ? ?iptables -A INPUT (操作) ? ? ? ? ??
?-I ? ? ? ? ? ? 在指定鏈中插入一條新的,未指定序號默認作為第一條 ? ?iptables -I INPUT ?(操作)?
?-P ? ? ? ? ? ? 指定默認規則 ? ?iptables -P ?OUTPUT ACCEPT ? (操作) ? ? ? ?
?-D ? ? ? ? ? ? 刪除 ? ?iptables -t nat -D INPUT ? 2 (操作) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?-R ? ? ? ? ? ? 修改、替換某一條規則 ? ?iptables -t nat -R INPUT ? ?(操作)?
?-L ? ? ? ? ? ? 查看 ? ?iptables -t nat -L (查看) ? ? ? ? ? ? ? ? ? ? ? ? ?
?-n ? ? ? ? ? ? 所有字段以數字形式顯示(比如任意ip地址是0.0.0.0而不是anywhere,比如顯示協議 ? ? ? ? ? ? ? ? ? ? 端口號而不是服務名) ? ?iptables -L -n,iptables -nL,iptables -vnL (查看) |
?-v ? ? ? ? ? ? 查看時顯示更詳細信息,常跟-L一起使用 ? ?(查看) ? ? ? ? ? ??
?--line-numbers ?規則帶編號 ? ?iptables -t nat -L -n --line-number ?iptables -t nat -L --line-number
?-F ? ? ? ? ? ? 清除鏈中所有規則 ? ?iptables -F ? (操作) ? ? ? ? ? ? ? ? ??
?-X ? ? ? ? ? ? 清空自定義鏈的規則,不影響其他鏈 ? ? ?iptables -X ? ? ? ? ? ?
?-Z ? ? ? ? ? ? 清空鏈的計數器(匹配到的數據包的大小和總和)iptables -Z ? ? ?
?-S ? ? ? ? ? ? 看鏈的所有規則或者某個鏈的規則/某個具體規則后面跟編號
匹配的條件 ? ? ? ? ? ? ? ? ? 作用
-p ? ? ? ? ? ? ? ? 指定要匹配的數據包的協議類型
-s ? ? ? ? ? ? ? ? 指定要匹配的數據包的源IP地址
-d ? ? ? ? ? ? ? ? 指定要匹配的數據包的目的IP地址
-i ? ? ? ? ? ? ? ? 指定數據包進入本機的網絡接口
-o ? ? ? ? ? ? ? ? 指定數據包離開本機做使用的網絡接口
--sport ? ? ? ? ? ? 指定源端口號
--dport ? ? ? ? ? ? 指定目的端口號
添加規則?
添加規則的兩個常用選項:
-A,在末尾追加規則。
-I,在指定位置前插入規則。如果不指定,則在首行插入
添加新的防火墻規則時,使用管理選項“-A”、“-I”,前者用來追加規則,后者用來插入規則。
iptables -F #清空規則
iptables -t filter -A INPUT -p icmp -j REJECT #禁止所有主機ping本機
iptables -t filter -A INPUT -p icmp -j ACCEPT #允許ping通,-A在前一條規則后添加
iptables -t filter -I INPUT 1 -p icmp -j ACCEPT #指定序號插入,插入到第一條
iptables -t filter -A INPUT -p tcp -j REJECT ? #允許任何主機tcp
iptables -I INPUT 1 -p udp -j ACCEPT ? ? ? ?#允許任何主機udp
iptables ?-nL ?--line-number ?#查看行規則的位置
iptables -t filter -A INPUT -s 192.168.233.22 -p icmp -j REJECT#拒絕某一臺主機,其他的可以
iptables -t filter -A INPUT -s 192.168.233.22,192.168.233.23 -p icmp -j REJECT#拒絕多臺主機
iptables -t filter -A OUTPUT -s 192.168.233.21 -p icmp -j REJECT#不允許21的數據包出去,其他的就都ping不通了
iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT#指定端口
iptables -t filter -A INPUT -s 192.168.233.22 -p tcp --dport 22 -j REJECT#指定IP地址的服務端口拒絕
iptables -t filter -A INPUT -s 192.168.233.22 -p tcp --dport 80 -j REJECT#禁止192.168.233.22:80的端口入訪問
刪除規則
D刪除 ?:
1.根據序號刪除內容
?iptables -D INPUT 1 #刪除指定的INPUT鏈中的第一條規則
2、內容匹配刪除(有兩個
相同的則作用為去重) 如果有兩個重復的規則,則刪除序號較小的
注意:按照內容匹配刪除規則,只能每次刪除內容相同序號較小的規則。
直到刪除最后一條時,才能將該規則全部清除 。
一定要報保證該匹配的內容存在,且完全匹配規則才能刪除,不然報錯。
?
修改規則
-R 直接修改
iptables -R INPUT 1 -p icmp -j REJECT#原本的ACCEPT替換成了REJECT
修改默認規則
默認策略是指四表五鏈中鏈的默認策略,INPUT,FORWARD,OUTPUT,filter三條鏈的默認值為ACCEPT
就像是設定黑名單一樣,默認其他的協議操作都是允許的,只有指定加入的且聲明權限的為(DROP 或 REJECT)是拒絕禁止的對象。
iptables -P INPUT DROP?
注意:
1.-F 僅僅是清空鏈中的規則,并不影響 -P 設置的規則,默認規則需要手動進行修改
2.-P 設置了DROP后,使用 -F 一定要小心!
#防止把允許遠程連接的相關規則清除后導致無法遠程連接主機,此情況如果沒有保存規則可重啟主機解決
此時的解決方案有三種:
第一種:我的防火墻設置只是臨時設置,并為保存,重啟服務器即可
第二種:操作服務器,重啟iptables服務?
第三種:進入機房操作該服務器(將設置恢復,重新修改規則)炸!
在生產中都是默認DROP
通用匹配
網絡協議、IP地址、網絡接口等條件。
協議匹配: -p協議名
地址匹配: -s 源地址、-d目的地址
#可以是IP、網段、域名、空(任何地址)
接口匹配: -i入站網卡、-o出站網卡 ?
感嘆號”!”表示取反
網絡協議
iptables -A INPUT ! -p icmp -j ACCEPT ?#除了icmp以外,所有的協議都可以進入
IP地址
iptables -A INPUT -s 192.168.233.22 -j DROP ? #禁止22的數據進入
使整個網段不能用指定的端口
iptables -t filter -A INPUT -s 192.168.233.0/24 -p tcp --dport 80 -j REJECT #禁止整個網段訪問80端口
顯示匹配
多端口匹配
要求以“-m 擴展模塊”的形式明確指出類型,包括多端口、MAC地址、IP范圍、數據包狀態等條件
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
iptables -A INPUT -p tcp -m multiport --dport 80,22,21,20,53 -j REJECT#多端口匹配,一次性禁止多個tcp網絡協議的端口匹配規則
iptables -A INPUT -p udp -m multiport --dport 53,54,55 -j ACCEP#多端口匹配,一次性放通多個udp網絡協議的端口匹配規則
IP范圍匹配
-m iprange --src-range ?源IP范圍
-m iprange --dst-range ?目的IP范圍
iptables -A INPUT -p icmp -m iprange --src-range 192.168.233.20-192.168.233.30 -j REJECT#禁止網段內的ip地址ping主機
MAC匹配
-m mac --mac-source MAC地址
iptables -A INPUT -m mac --mac-source 00:0c:29:f7:24:38 -j DROP
備份與還原
我們對iptables命令行中的設置,都是臨時設置,只要遇到服務器關機,或者服務重啟時,所有的設置都會清空且還原為原本的設置。
為此,我們可以對已經測試完畢符合我們需求的防火墻設置進行備份,在必要時,可以一鍵還原
備份iptables設置
格式:iptables-save >/指定的文件?
iptables-save >/opt/iptables.bak#備份到指定文件
iptables-restore </opt/iptables.bak #一鍵導入,設置為當前防火墻設置?
SNAT和DNAT
SNAT又稱源地址轉換。
源地址轉換是內網地址向外訪問時,發起訪問的內網ip地址轉換為指定的ip地址
(可指定具體的服務以及相應的端口或端口范圍),這可以使內網中使用保留ip地址的主機訪問外部網絡,
即內網的多部主機可以通過一個有效的公網ip地址訪問外部網絡。
就是把內網地址轉成指定的IP地址,這個iP地址可以訪問公網
DNAT:目的地址轉換的作用是將一組本地內部的地址映射到一組全球地址。
通常來說,合法地址的數量比起本地內部的地址數量來要少得多。
私網地址只能作為源地址來訪問公網IP,而無法作為目標地址被其他主機訪問
所以DNAT將私網中web服務器映射到公網IP,使其公網IP作為目標地址被公網中主機進行訪問
?