iptables
在早期的Linux系統中,默認使用的是iptables防火墻管理服務來配置防火墻。盡管新型的fierwalld防火墻管理服務已經被投入使用多年,但是大量的企業在生產環境中依然出于各種原因而繼續使用iptables。
策略與規則鏈
防火墻會從上至下的順序來讀取配置的策略規則,在找到匹配項后就立即結束匹配工作并去執行匹配項中定義的行為(即放行或阻止)。如果在讀取完所有的策略規則之后沒有匹配項,就去執行默認的策略。
一般而言,防火墻策略規則的設置有兩種:
一種是“通”(即放行),
一種是 “堵”(即阻止)。
當防火墻的默認策略為拒絕時(堵),就要設置允許規則 (通),否則誰都進不來;如果防火墻的默認策略為允許時,就要設置拒絕規則,否則誰都能進來,防火墻也就失去了防范的作用。
iptables 服務把用于處理或過濾流量的策略條目稱之為規則,多條規則可以組成一個規則鏈,而規則鏈則依據數據包處理位置的不同進行分類,具體如下:
?在進行路由選擇前處理數據包( PREROUTING);
?處理流入的數據包( INPUT );
?處理流出的數據包( OUTPUT );
?處理轉發的數據包( FORWARD );
?在進行路由選擇后處理數據包( POSTROUTING )。
一般來說, 從內網向外網發送的流量一般都是可控且良性的,因此我們使用最多的就是INPUT規則鏈,該規則鏈可以增大黑客人員從外網人侵內網的難度。比如在您居住的社區內,物業管理公司有兩條規定:禁止小商小販進入社區;各種車輛在進人社區時都要登記。顯而易見,這兩條規定應該是用于社區的正門的(流量必須經過的地方),而不是每家每戶的防盜門上。根據前面提到的防火墻策略的匹配順序,可能會存在多種情況。比如,來訪人員是小商小販,則直接會被物業公司的保安拒之門外,也就需再對車輛進行登記。如果來訪人員乘坐輛汽車進人社區正門,則“禁止小商小販進人社區”的第一條規則就沒有被匹配到,因此按照順序匹配第二條策略, 即需要對車輛進行登記。如果是社區居民要進入正門,則這兩條規定都不會匹配到,因此會執行默認的放行策略。
但是,僅有策略規則還不能保證社區的安全,保安還應該知道采用什么樣的動作來處理這些匹配的流量,比如“允許”、“拒絕”、“登記”、“不理它”。
這些動作對應到iptables服務的術語中分別是ACCEPT(允許流量通過)、REJECT(拒絕流量通過)、LOG(記錄日志信息)、DROP (拒絕流量通過)。
“允許流量通過”和“記錄日志信息”都比較好理解,這里需要著重講解的是REJECT和DROP的不同點。
就DROP來說,它是直接將流量丟棄而且不響應;
REJECT則會在拒絕流量后再回復條“您的信息已經收到, 但是被扔掉了”信息,從而讓流量發送方清晰地看到數據被拒絕的響應信息。
iptables是一款基于命令行的防火墻策略工具,具有大量參數,學習難度大。
不過大家無須深入了解眾多的理論概念,只需要掌握常用的參數并做到靈活搭配就好。
iptables命令可以根據流量的源地址、目的地址、傳輸協議、服務類型等信息進行匹配,一旦匹配成功。iptables就會根據策略規則所預設的動作來處理這些流量。另外,防火墻策略規則的匹配順序是從上至下的,因此要把控嚴格,優先級越高的策略規則放在前面,以免發生錯誤。
以下是iptables的參數,無須死記硬背,慢慢使用理解
參數 | 作用 |
-P | 設置默認策略 |
-F | 清空規則鏈 |
-L | 查看規則鏈 |
-A | 在規則鏈的末尾加入新規則 |
-I num | 在規則鏈的頭部加入新規則 |
-D num | 刪除某一條規則 |
-s | 匹配來源地址IP/MASK,加嘆號“!”表示除這個IP外 |
-d | 匹配目標地址 |
-i 網卡名稱 | 匹配從這塊網卡流入的數據 |
-o 網卡名稱 | 匹配從這塊網卡流出的數據 |
-p | 匹配協議 |
--dport num | 匹配目標端口號 |
--sport num | 匹配來源端口號 |
在iptables命令后加 -L 參數查看已有的防火墻規則鏈
在iptables命令后加 -F 參數清空已有的防火墻規則鏈
把INPUT規則鏈的默認策略設置為拒絕
把INPUT規則鏈改為默認策略設置
?前面提到,防火墻策略規則的設置有兩種:通 和 堵
當把INPUT鏈設置為默認拒絕后,就要在防火墻策略中寫入允許策略了,否則所有到來的流量都會被拒接掉。另外。需要注意的是,規則鏈的默認拒絕動作只能是DROP,而不是REJECT
向INPUT鏈中添加ICMP流量進入的策略規則:
在日常運維工作中,經常會使用ping命令來檢查對方主機是否在線,而向防火墻的INPUT規則鏈中添加一條允許ICMP流量進入的策略規則就默認允許了這種ping命令檢測行為:
刪除INPUT規則鏈中剛剛加入的那條策略(允許ICMP流量),并把默認策略設置為允許:
將INPUT規則鏈設置為只允許指定網段的主機訪問本機的22端口,拒絕來自其他所有主機的流量
?再次重申,防火墻策略規則是按照從上到下的順序匹配的,因此一定要把允許動作放到拒絕動作前面,否則所有的流量就將被拒絕掉,從而導致任何主機都無法訪問我們的服務。
另外,這里提到的22號端口是ssh服務使用的(有關ssh服務,后續會介紹)
在設置完上述INPUT規則鏈之后,我們使用192.168.203.0/24網段內主機訪問服務器的22端口,效果如下
?然后,我們再使用ip地址在192.168.20.0/24,網段內的主機訪問服務器的22端口,效果如下
?向INPUT規則鏈中添加拒絕所有人訪問本機12345端口的策略規則:
向INPUT規則鏈中添加拒絕192.168.203.100主機訪問本機的80端口(Web服務)的策略:
向INPUT規則鏈中添加拒絕所有主機訪問本機1000-1024端口的規則:
使用iptables命令配置的防火墻規則默認會在下次重啟時失效,如果想讓配置的防火墻策略永久生效,還需要執行保存命令:
firewalld
RHEL7系統中集成了多款防火墻管理工具,其中firewalld服務是默認的防火墻配置管理工具,它擁有基于CLI(命令行界面)和基于GUI(圖形用戶界面)的兩種管理方式。
相較于傳統的防火墻管理配置工具,firewalld支持動態更新技術并加入了區域(zone)的概念。
簡單來說,區域就是firewalld預先準備了幾套防火墻策略集合(策略模板),用戶可以根據生產場景的不同而選擇合適的策略集合,從而實現防火墻策略之間的加速切換。
例如,有臺筆記本電腦,每天都要在辦公室,咖啡廳和家里使用,按照常理來說,這三者的安全性由高到低的順序排序,應該是家庭,公司辦公室,咖啡廳。當前,我們希望為這臺筆記本指定如下防火墻策略規則:
在家中允許訪問所有服務;
在辦公室僅允許訪問文件共享服務;
在咖啡廳僅允許上網瀏覽。
在以往,我們需要頻繁地手動設置防火墻策略規則,而現在只需要預設好區域集合,然后只需輕點鼠標可以自動切換了,從而極大地提升了防火墻策略的應用效率。
firewalld中常見的區域名稱(默認為public)以及相應的策略規則
如圖
區域 | 默認策略規則 |
trusted | 允許所有的數據包 |
home | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、mdns、ipp-client、dhcpv6-client、amba-client服務相關,則允許流量 |
internal | 等同于home區域 |
work | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、ipp-client、dhcpv6-client服務相關,則允許流量 |
public | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh、ipp-client服務相關,則允許流量 |
external | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
dmz | 拒絕流入的流量,除非與流出的流量相關;而如果流量與ssh服務相關,則允許流量 |
block | 拒絕流入的流量,除非與流出的流量相關 |
drop | 拒絕流入的流量,除非與流出的流量相關 |
終端管理工具
firewall-cmd是firewalld防火墻配置管理工具的CLI(命令行界面)版本。它的參數一般都是以長格式來提供的。(Tab自動補齊)
參數 | 作用 |
--get-default-zone | 查詢默認的區域名稱 |
--get-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 | 關閉應急狀況模式 |
與Linux系統中其他的防火墻策略配置一樣,使用firewalld配置的防火墻策略默認為運行時(Runtime)模式,又稱為當前生效模式,而且隨著系統的重啟會失效。如果想讓配置策略一直存在,就需要使用永久模式了。方法就是在用firewall-cmd命令正常設置防火墻策略時添加 --permanent 參數,這樣配置的防火墻策略就可永久生效了。但是。永久生效有一個特點,就是使用它設置的策略只有在系統重啟之后才能生效。如果想讓配置的策略立即生效,需要手動執行firewall-cmd --reload命令。
查看firewalld服務當前所使用的區域
查看ens160網卡在firewalld服務中的區域
把firewalld服務中ens160網卡的默認區域修改為external,并在系統重啟后生效。分別查看當前永久模式下的區域名稱:
把firewalld服務的當前默認區域設置為public
啟動/關閉firewalld防火墻服務的應急狀況模式,阻斷一切網絡連接:
firewall-cmd --panic-on
firewall-cmd --panic-off
查詢public區域是否允許請求SSH和HTTPS協議流量:
?把firewalld服務中請求HTTPS協議的流量設置為永久允許,并立即生效:
? 把firewalld服務中請求HTTPS協議的流量設置為永久NO,并立即生效:
把在firewalld服務中訪問8080和8081端口的流量策略設置為允許,但僅限當前生效:
把原本訪問本機888端口的流量轉發到22端口,要且求當前和長期有效:
下一篇我們介紹圖形管理工具