iptables和firewall防火牆
防火牆管理工具
防火牆作為公網與內網之間的保護屏障,在保障資料的安全性方面起著至關重要的作用。
防火牆策略可以基於流量的源目地址、埠號、協議、應用等資訊來定製,然後防火牆使用預先定製的策略規則監控出入的流量,若流量與某一條策略規則相匹配,則執行相應的處理,反之則丟棄。
在Linux系統中其實存在多個防火牆管理工具,旨在方便運維人員管理Linux系統中的防火牆策略,只需要配置妥當其中的一個就足夠。
iptables與firewalld只是用來定義防火牆策略的防火牆管理工具,並不是真正的防火牆。或者說,它們只是一種服務。iptables服務會把配置好的防火牆策略交由核心層面的netfilter網路過濾器來處理,而firewalld服務則是把配置好的防火牆策略交由核心層面的nftables包過濾框架來處理。
iptables
在早期的Linux系統中(RHEL7之前),預設使用的是iptables防火牆管理服務來配置防火牆。儘管新型的firewalld防火牆管理服務已經被投入使用多年,但是大量的企業在生產環境中依然出於各種原因而繼續使用iptables。iptables在當前生產環境中還具有頑強的生命力。
策略與規則鏈
防火牆會從上至下的順序來讀取配置的策略規則,在找到匹配項後就立即結束匹配工作(即下面的規則不再匹配)並去執行匹配項中定義的行為(即允許或拒絕)。如果在讀取完所有的策略規則之後沒有匹配項,就去執行預設的策略。
防火牆策略規則的設定無非就是兩種:允許或拒絕。
當防火牆的預設策略為拒絕時,就要設定允許規則,否則誰都進不來; 當防火牆的預設策略為允許時,就要設定拒絕規則,否則誰都能進來,防火牆也就失去了防範的作用。
iptables服務把用於處理或過濾流量的策略條目稱之為規則,多條規則可以組成一個規則鏈,而規則鏈則依據資料包處理位置的不同進行分類:
在進行路由選擇前處理資料包(PREROUTING);#SNAT
處理流入的資料包(INPUT);#外網-->內網
處理流出的資料包(OUTPUT);#外網<--內網
處理轉發的資料包(FORWARD);#通過第三方
在進行路由選擇後處理資料包(POSTROUTING)。#DNAT
從內網向外網傳送的流量一般都是可控且良性的,因此使用最多的就是INPUT規則鏈(從外網流入內網的流量),該規則鏈可以增大黑客人員從外網入侵內網的難度。
匹配策略規則採取的動作:
ACCEPT(允許):允許流量通過
LOG(登記):允許流量通過,但記錄日誌資訊
REJECT(拒絕):拒絕流量通過且明確給予拒絕的響應(考試時務必用REJECT,讓系統明確知道流量被拒絕)
DROP(丟棄):拒絕流量通過但不響應
iptables中的基本命令引數
iptables是一款基於命令列的防火牆策略管理工具。
iptables命令可以根據流量的源地址、目的地址、傳輸協議、服務型別等資訊進行匹配,一旦匹配成功,iptables就會根據策略規則所預設的動作來處理這些流量。防火牆策略規則的匹配順序是從上至下的,因此要把較為嚴格、優先順序較高的策略規則放到前面,以免發生錯誤。
iptables中常用的引數以及作用
引數 | 作用 |
---|---|
-P | 設定預設策略 |
-F | 清空規則鏈 |
-L | 檢視規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I num | 在規則鏈的頭部加入新規則 |
-D num | 刪除某一條規則 |
-s | 匹配來源地址IP/MASK,加歎號“!”表示除這個IP外 |
-d | 匹配目標地址 |
-i 網絡卡名稱 | 匹配從這塊網絡卡流入的資料 |
-o 網絡卡名稱 | 匹配從這塊網絡卡流出的資料 |
-p | 匹配協議,如TCP、UDP、ICMP |
--dport num | 匹配目標埠號 |
--sport num | 匹配來源埠號 |
-j | 採取的動作(ACCEPT、LOG、REJECT、DROP) |
例項:
1 iptables -L #檢視已有的防火牆規則鏈
2 iptables -F #清空已有的防火牆規則鏈
3 iptables -L #再次檢視防火牆規則鏈,發現之前存在的規則鏈均已被刪除
4 iptables -P INPUT DROP #把INPUT規則鏈的預設策略設定為拒絕,規則鏈的預設拒絕動作只能是DROP,不能是REJECT
5 iptables -L #檢視規則鏈,顯示Chain INPUT (policy DROP)
6 iptables -I INPUT -p icmp -j ACCEPT #向INPUT鏈頭部中新增允許ICMP流量進入的策略規則
7 ping -c 4 192.168.10.10 #此時可以ping通,但是其餘的ssh什麼的是不行的
8 iptables -D INPUT 1 #刪除INPUT規則鏈的第1條規則(即剛剛允許ICMP那條)
9 iptables -P INPUT ACCEPT #把INPUT規則鏈預設策略設定為允許
10 iptables -L #檢視規則鏈,顯示Chain INPUT (policy ACCEPT),ping,ssh什麼的都允許
11 iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT #將INPUT規則鏈設定為只允許指定網段的主機訪問本機的22埠(必須先指明協議才能指明埠號)
12 iptables -A INPUT -p tcp --dport 22 -j REJECT #向INPUT規則鏈尾部新增拒絕來自所有主機訪問本機22埠的規則(結合上一條規則的效果就是隻允許指定網段主機訪問本機22埠,拒絕其他主機訪問)
13 iptables -L #檢視已有規則鏈,此時應有2條,一條允許一條拒絕
14 iptables -I INPUT -p tcp --dport 12345 -j REJECT #向INPUT規則鏈中新增拒絕所有人訪問本機12345埠(tcp+udp)的策略規則
15 iptables -I INPUT -p udp --dport 12345 -j REJECT
16 iptables -L
17 iptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT #向INPUT規則鏈中新增拒絕192.168.10.5主機訪問本機80埠(Web服務)的策略規則
18 iptables -L
19 iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT #向INPUT規則鏈中新增拒絕所有主機訪問本機1000~1024埠的策略規則
20 iptables -A INPUT -p udp --dport 1000:1024 -j REJECT
21 iptables -L
22 service iptables save #讓配置的防火牆策略永久生效(防火牆規則預設會在系統下一次重啟時失效)
firewalld
RHEL 7系統中集成了多款防火牆管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系統的動態防火牆管理器)服務是預設的防火牆配置管理工具,它擁有基於CLI(命令列介面)和基於GUI(圖形使用者介面)的兩種管理方式。
firewalld支援動態更新技術並加入了區域(zone)的概念。區域就是firewalld預先準備了幾套防火牆策略集合(策略模板),使用者可以根據生產場景的不同而選擇合適的策略集合,從而實現防火牆策略之間的快速切換。
firewalld中常用的區域名稱(預設為public)及策略規則
區域 | 預設規則策略 |
---|---|
trusted | 允許所有的資料包 |
home | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、mdns、ipp-client、amba-client與dhcpv6-client服務相關,則允許流量 |
internal | 等同於home區域 |
work | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、ipp-client與dhcpv6-client服務相關,則允許流量 |
public | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、dhcpv6-client服務相關,則允許流量 |
external | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
dmz | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
block | 拒絕流入的流量,除非與流出的流量相關 |
drop | 拒絕流入的流量,除非與流出的流量相關 |
終端管理工具
firewall-cmd是firewalld防火牆配置管理工具的CLI(命令列介面)版本。它的引數一般都是以“長格式”來提供的。
firewall-cmd命令中使用的引數以及作用
引數 | 作用 |
---|---|
--get-default-zone | 查詢預設的區域名稱 |
--set-default-zone=<區域名稱> | 設定預設的區域,使其永久生效 |
--get-zones | 顯示可用的區域 |
--get-services | 顯示預先定義的服務 |
--get-active-zones | 顯示當前正在使用的區域與網絡卡名稱 |
--add-source= | 將源自此IP或子網的流量導向指定的區域 |
--remove-source= | 不再將源自此IP或子網的流量導向某個指定區域 |
--add-interface=<網絡卡名稱> | 將源自該網絡卡的所有流量都導向某個指定區域 |
--change-interface=<網絡卡名稱> | 將某個網絡卡與區域進行關聯 |
--list-all | 顯示當前區域的網絡卡配置引數、資源、埠以及服務等資訊 |
--list-all-zones | 顯示所有區域的網絡卡配置引數、資源、埠以及服務等資訊 |
--add-service=<服務名> | 設定預設區域允許該服務的流量 |
--add-port=<埠號/協議> | 設定預設區域允許該埠的流量 |
--remove-service=<服務名> | 設定預設區域不再允許該服務的流量 |
--remove-port=<埠號/協議> | 設定預設區域不再允許該埠的流量 |
--reload | 讓“永久生效”的配置規則立即生效,並覆蓋當前的配置規則 |
--panic-on | 開啟應急狀況模式 |
--panic-off | 關閉應急狀況模式 |
使用firewalld配置的防火牆策略有兩個模式:
執行時(Runtime)模式:預設的firewall防火牆策略模式,又稱為當前生效模式,策略會隨著系統的重啟會失效。
永久(Permanent)模式:在用firewall-cmd命令正常設定防火牆策略時新增--permanent引數,配置的防火牆策略就可以永久生效。但是,使用永久生效模式設定的策略只有在系統重啟之後才能自動生效。如果想讓永久模式下配置的策略立即生效,需要手動執行firewall-cmd --reload命令。
例項1:firewall防火牆常用配置
1 firewall-cmd --get-default-zone #檢視firewalld服務當前所使用的區域(預設應該是public)
2 firewall-cmd --get-zone-of-interface=eno16777728 #查詢eno16777728網絡卡當前在firewalld服務中的區域(預設也應該是public)
3 firewall-cmd --permanent --zone=external --change-interface=eno16777728 #把firewalld服務中eno16777728網絡卡的預設區域修改為external,並在系統重啟後永久生效。
4 firewall-cmd --get-zone-of-interface=eno16777728 #檢視eno16777728網絡卡在當前的區域(應該仍為public)
5 firewall-cmd --permanent --get-zone-of-interface=eno16777728 #檢視eno16777728網絡卡在永久模式下的區域(應該為external)
6 firewall-cmd --set-default-zone=public #把firewalld服務的當前預設區域設定為public
7 firewall-cmd --get-default-zone #檢視firewall當前預設區域
8 firewall-cmd --panic-on #啟動firewalld防火牆服務的應急狀況模式,阻斷一切網路連線(當遠端控制伺服器時請慎用)
9 firewall-cmd --panic-off #關閉firewall防火牆服務的應急狀況模式
10 firewall-cmd --zone=public --query-service=ssh #查詢public區域當前是否允許SSH服務的流量(查到為yes)
11 firewall-cmd --zone=public --query-service=https #查詢public區域當前是否允許HTTPS服務的流量(查到為no)
12 firewall-cmd --zone=public --add-service=https #設定public區域當前允許請求HTTPS服務的流量通過
13 firewall-cmd --permanent --zone=public --add-service=https #設定piblic區域允許請求HTTPS服務的流量通過,永久生效
14 firewall-cmd --reload #讓firewall服務永久模式下的策略設定立即生效
15 firewall-cmd --permanent --zone=public --remove-service=http #設定public區域禁止HTTP服務的流量通過,永久生效
16 firewall-cmd --reload
17 firewall-cmd --zone=public --add-port=8080-8081/tcp #設定public區域當前訪問8080-8081埠的流量策略設定為允許
18 firewall-cmd --zone=public --list-ports #檢視public區域當前允許通過的埠
例項2:把原本訪問本機888埠的流量轉發到22埠,要且求當前和長期均有效。
流量轉發命令格式:firewall-cmd --permanent --zone=<區域> --add-forward-port=port=<源埠號>:proto=<協議>:toport=<目標埠號>:toaddr=<目標IP地址>
1 firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10
2 firewall-cmd --reload
在Windows 10系統的cmd命令列視窗中執行ssh -p 888 192.168.10.10 -l root嘗試訪問主機192.168.10.10的888埠,實際上就是訪問該主機的22埠,即ssh服務。
例項3:在firewalld服務中配置一條富規則,使其拒絕192.168.10.0/24網段的所有使用者訪問本機的ssh服務(22埠)。
firewalld中的富規則表示更細緻、更詳細的防火牆策略配置,它可以針對系統服務、埠號、源地址和目標地址等諸多資訊進行更有針對性的策略配置。它的優先順序在所有的防火牆策略中也是最高的。
1 firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
2 firewall-cmd --reload
圖形管理工具
firewall-config是firewalld防火牆配置管理工具的GUI(圖形使用者介面)版本,幾乎可以實現所有以命令列來執行的操作。
標號對應的具體功能:
1.選擇執行時(Runtime)模式或永久(Permanent)模式的配置。
2.可選的策略集合區域列表。
3.常用的系統服務列表。
4.當前正在使用的區域。
5.管理當前被選中區域中的服務。
6.管理當前被選中區域中的埠。
7.開啟或關閉SNAT(源地址轉換協議)技術。
8.設定埠轉發策略。
9.控制請求icmp服務的流量。
10.管理防火牆的富規則。
11.管理網絡卡裝置。
12.被選中區域的服務,若勾選了相應服務前面的複選框,則表示允許與之相關的流量。
13.firewall-config工具的執行狀態。
在使用firewall-config工具配置完防火牆策略之後,無須進行二次確認,因為只要有修改內容,它就自動進行儲存。
SNAT(Source Network Address Translation,源網路地址轉換)技術是一種為了解決IP地址匱乏而設計的技術,它可以使得多個內網中的使用者通過同一個外網IP接入Internet。
沒有使用SNAT技術的網路:如果閘道器伺服器沒有應用SNAT技術,則網際網路中的網站伺服器在收到PC的請求資料包,並回送響應資料包時,將無法在網路中找到這個私有網路的IP地址,所以PC也就收不到響應資料包了。
使用了SNAT技術的網路:由於閘道器伺服器應用了SNAT技術,所以網際網路中的網站伺服器會將響應資料包發給閘道器伺服器,再由後者轉發給區域網中的PC。
開啟SNAT:
iptables命令:很麻煩
firewall-cmd:firewall-cmd --permanent --zone=public --add-masquerade
firewall-config:輕而易舉。在圖形介面Masquerading頁籤中勾選Masquerade zone複選框即可。
服務的訪問控制列表
TCP Wrappers是RHEL 7系統中預設啟用的一款流量監控程式,它能夠根據來訪主機的地址與本機的目標服務程式作出允許或拒絕的操作。
Linux系統中其實有兩個層面的防火牆,第一種是基於TCP/IP協議的流量過濾工具,而TCP Wrappers服務則是能允許或禁止Linux系統提供服務的防火牆,從而在更高層面保護了Linux系統的安全執行。
TCP Wrappers服務的防火牆策略由兩個控制列表檔案所控制,使用者可以編輯允許控制列表檔案來放行對服務的請求流量,也可以編輯拒絕控制列表檔案來阻止對服務的請求流量。控制列表檔案修改後會立即生效。系統將會先檢查允許控制列表檔案(/etc/hosts.allow),如果匹配到相應的允許策略則放行流量;如果沒有匹配,則去進一步匹配拒絕控制列表檔案(/etc/hosts.deny),若找到匹配項則拒絕該流量。如果這兩個檔案全都沒有匹配到,則預設放行流量。
TCP Wrappers服務的控制列表檔案中常用的引數
客戶端型別 | 示例 | 滿足示例的客戶端列表 |
---|---|---|
單一主機 | 192.168.10.10 | IP地址為192.168.10.10的主機 |
指定網段 | 192.168.10. | IP段為192.168.10.0/24的主機 |
指定網段 | 192.168.10.0/255.255.255.0 | IP段為192.168.10.0/24的主機 |
指定DNS字尾 | .linuxprobe.com | 所有DNS字尾為.linuxprobe.com的主機 |
指定主機名稱 | www.linuxprobe.com | 主機名稱為www.linuxprobe.com的主機 |
指定所有客戶端 | ALL | 所有主機全部包括在內 |
在配置TCP Wrappers服務時需要遵循兩個原則:
1.編寫拒絕策略規則時,填寫的是服務名稱,而非協議名稱;
2.建議先編寫拒絕策略規則,再編寫允許策略規則,以便直觀地看到相應的效果。
例項:先編輯/etc/host.deny檔案,拒絕訪問本機sshd服務的所有流量;再編輯/etc/hosts.allow檔案,允許指定網段訪問本機sshd服務。
1 vim /etc/hosts.deny #編輯/etc/hosts.deny檔案
2 sshd:* #禁止所有流量訪問本機sshd服務
3 ssh 192.168.10.10 #嘗試訪問本機sshd服務,發現就算是本機自身也不能訪問本機sshd服務
4 vim /etc/hosts.allow #編輯/etc/hosts.allow檔案
5 sshd:192.168.10.0/24 #允許指定網段訪問本機sshd服務
6 ssh 192.168.10.10 #嘗試訪問本機sshd服務,發現可以了
不同的防火牆規則有所衝突時,只要有一個拒絕,即使其他工具是允許,也會被拒絕。