一、概念
1、防火墻firewall
Linux 防火墻用于控制進出系統的網絡流量,保護系統免受未授權訪問。常見的防火墻工具包括?iptables
、nftables
、UFW
?和?firewalld。
-
防火墻類型
-
包過濾防火墻:基于網絡層(IP、端口、協議)過濾流量(如?
iptables
)。 -
應用層防火墻:基于應用協議(如 HTTP、SSH)過濾流量(需結合代理或深度包檢測)。
-
-
關鍵術語
-
表(Table):規則集合,如?
filter
(過濾)、nat
(地址轉換)、mangle
(包修改)。 -
鏈(Chain):規則鏈,默認鏈包括?
INPUT
(入站)、OUTPUT
(出站)、FORWARD
(轉發)。 -
規則(Rule):定義匹配條件和動作(如允許?
ACCEPT
、拒絕?DROP
)。 -
區域(Zone):
firewalld
?的概念,定義不同網絡環境(如?public
、home
)的安全級別。
-
-
狀態檢測
-
跟蹤連接狀態(如?
NEW
、ESTABLISHED
),允許響應流量自動放行。
-
2、iptables
iptables?是集成在 Linux 內核中的包過濾防火墻系統,它允許系統管理員配置規則集,以便控制網絡數據包的進出和轉發。iptables 通過定義一系列的規則來決定如何處理經過網絡接口的數據包。這些規則可以基于數據包的來源、目的地、協議類型等多種條件來設置。
二、命令
1、搭建實驗運行環境
(1)前提說明
防火墻命令相關實驗我們準備三個虛擬機,請先自行克隆出來三個,分別命名為F1、F2、F3
其中,F1與F3相互溝通,F2是它們溝通的橋梁
主機名 | ip | 網絡類型 |
F1 | 192.168.76.10 | NAT |
F2 | 192.168.76.20(NAT的) 192.168.194.20(Host-only的) | NAT + Host-only(僅主機) |
F3 | 192.168.194.30 | Host-only(僅主機) |
ip項請務必清楚自己虛擬機在NAT和Host-only(僅主機) 這兩個網絡類型下的網段是什么,
這里說一下查看辦法:
按圖中步驟來:點擊實驗所需的三臺主機中的其中一臺,這里是F1;點編輯;點虛擬網絡編輯器;進去后即可查看:
僅主機時的ip網段
NAT時的ip網段:
這里的都是博主自己的,你們的都可以按照這個辦法來查詢
(2)設置三臺主機的網絡類型
1)對于F1
F1用NAT模式,默認應該就是NAT模式,但還是建議去查看一下:
2)對于F2
F2有兩個:
一個是默認自帶的NAT
另一個是Host-only(僅主機)
?
?
3)對于F3
F3是Host-only(僅主機)
(3)設置IP等基礎配置
IP地址的配置先前博客有講過,這里不再贅述,簡單過一遍。配置指令為nm-connection-editor
手動配置你們網段的IP地址即可,可以按照上面的表格:
來進行配置IP,注意,F2有兩個網卡,需要配置兩個。?
nm-connection-editor
示例?
主機F1、F3和F2的第二個網卡(為下圖F2的ens192)都不用配置網關,F2的第一個NAT類型網卡(圖中為ens160)需要配置網關
F2的第一個NAT類型網卡(圖中為ens160)需要配置網關
到這里就完成了實驗環境的搭建
(4)測試
F1能ping通F2的NAT網卡(192.168.76.20)
F2的僅主機網卡(192.168.194.20)能ping通F3
2、iptables命令
(1)安裝軟件
安裝需要搭建軟件倉庫,詳情請見之前博客
dnf install iptables-nft-services.noarch -y
示例
(2)關閉防火墻?
systemctl disable --now firewalld
示例?
systemctl mask firewalld
示例?
?(3)啟動服務
systemctl enable --now iptables.service
示例?
(4)iptables基本語法格式
iptables [-t 表名] 命令選項 [鏈名] [規則條件] -j 目標動作
(5)常用命令選項
參數 | 說明 |
---|---|
-A ?或?--append | 在鏈末尾添加規則(如?-A INPUT )。 |
-I ?或?--insert | 在鏈的指定位置插入規則(如?-I INPUT 1 ?插入為第一條)。 |
-D ?或?--delete | 刪除指定規則(如?-D INPUT 2 ?或按規則內容刪除)。 |
-L ?或?--list | 列出鏈中的規則(配合?-n ?禁用DNS解析,-v ?顯示詳細信息)。 |
-F ?或?--flush | 清空鏈中的所有規則(如?-F INPUT )。 |
-P ?或?--policy | 設置鏈的默認策略(如?-P INPUT DROP )。 |
-N ?或?--new-chain | 創建自定義鏈(如?-N MY_CHAIN )。 |
-X ?或?--delete-chain | 刪除自定義空鏈。 |
-Z ?或?--zero | 重置計數器(數據包和字節計數)。 |
參數 | 說明 |
---|---|
-p ?或?--protocol | 指定協議(如?tcp 、udp 、icmp 、all )。 |
-s ?或?--source | 源IP地址或網段(如?-s 192.168.1.0/24 )。 |
-d ?或?--destination | 目標IP地址或網段。 |
-i ?或?--in-interface | 指定數據包進入的網絡接口(如?-i eth0 )。 |
-o ?或?--out-interface | 指定數據包離開的網絡接口。 |
- j 或 -- jump | 指定目標,即滿足某條件時該執行什么樣的動作,如ACCPET。 |
參數 | 說明 |
---|---|
--dport | 目標端口(如?--dport 80 )。 |
--sport | 源端口。 |
--multiport | 多端口匹配(需加載?multiport ?模塊,如?--dports 80,443 )。 |
(6) 各種命令選項的常用命令
就是上面的表中的部分常用的詳解
1)iptables? -nL
查看當前iptables策略
iptables? -nL
示例
下面的三行:INPUT、FORWARD、OUTPUT,即為-A后面接的東西(規則)
2)iptables -t 表名
iptables -t
示例
輸入-t后,我們連按table鍵,可以看到彈出來的這些就是表名,分別為:filter ?mangle ?nat
以下是各個表的詳解?
filter表:
-
默認表:若未指定?
-t
?參數,默認使用?filter
?表。 -
核心功能:過濾數據包,決定是否允許數據包通過。
-
內置鏈:
鏈名 觸發時機 常見用途 INPUT
處理目標是本機的數據包(入站) 控制進入本機的流量(如開放 SSH 端口)。 OUTPUT
處理本機產生的數據包(出站) 限制本機程序對外訪問(如禁止某些 IP)。 FORWARD
處理經過本機轉發的數據包(路由) 配置 NAT 網關或防火墻路由規則。
nat 表:
-
核心功能:網絡地址轉換(Network Address Translation),用于修改數據包的源或目標地址。
-
內置鏈:
鏈名 觸發時機 常見用途 PREROUTING
數據包進入路由決策之前(剛到達網卡) DNAT(目標地址轉換,如端口轉發)。 POSTROUTING
數據包離開本機之前(即將發送到網卡) SNAT/MASQUERADE(源地址轉換,如共享上網)。 OUTPUT
本機產生的數據包在路由決策之后 對本機出站流量做 NAT(較少使用)
mangle 表:
-
核心功能:修改數據包內容(如 TTL、TOS 字段)或標記數據包(MARK),用于高級流量控制。
-
內置鏈:
鏈名 觸發時機 PREROUTING
數據包進入路由決策之前 POSTROUTING
數據包離開本機之前 INPUT
處理目標是本機的數據包 OUTPUT
處理本機產生的數據包 FORWARD
處理經過本機轉發的數據包
?拓展:清空指定表中的策略
iptables -t filter(這里填你想清理的表名,這里以filter舉例) -F
示例
?
3)拒絕某條流量的訪問
iptables -t? 表名? -p? 協議? --dport? 80? -s? ip地址? -j? 功能?
1))命令解析與添加規則
我們以一個實例來舉例理解,比如:我們想讓F1的tcp協議的訪問數據不能到達F2,即拒絕F1的tcp流量,所以我們的命令可以寫成:
iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.76.10 -j REJECT
這一項命令很長,但把其拆解就不復雜了:
所以,整條命令的意思即為:通過iptables寫入一條規則 ——?拒絕訪問(-j REJECT)表頭為filter(-t filter)、端口為80(--dport 80)的tcp協議(-p tcp),并且還是來自(-A INPUT)192.168.76.10(-s 192.168.76.10)的流量
我們再次通過iptables? -nL查看一下當前的規則,可以看到在INPUT行我們剛剛新寫入的規則:
iptables? -nL
2))測試規則的存在與生效
我們在F2主機安裝nginx來進行測試,看看我們剛剛設置的規則是否存在且生效:
dnf install nginx -y
示例
啟動nginx服務:
systemctl enable --now nginx.service
?示例
往F2的nginx里的默認index.html寫入一個內容,方便我們后續測試,內容即為F2的NAT網卡ip本身:
echo 192.168.76.20 > /usr/share/nginx/html/index.html
示例?
接下來我們分別到F1主機和F3主機進行測試,看看在F2寫的規則是否生效:
我們剛剛寫的規則是,F2拒絕F1的tcp協議訪問流量,F3的訪問流量不拒絕
- 在F1端對F2進行訪問:
- 在F3端對F2進行訪問:
?3))總結?
這就是火墻,通過iptables命令設置規則,規定誰能訪問,誰不能訪問?
4)只允許某條流量訪問
有了上面的基礎,這一條就好理解了:
同樣在F2進行配置
iptables -t filter -A INPUT -p tcp --dport 80 ! -s 192.168.194.30 -j REJECT
示例?
這里與上面不同的是-s前面的“!”感嘆號,感嘆號表示反選,-s本來是表示指定192.168.194.30這條流量,加了“!”感嘆號后,就表示除了192.168.194.30這條之外的所有ip地址,所以這條命令也就變成了:
除了192.168.194.30,之外的其他所有ip全部都被拒絕訪問F2,即——只允許ip為192.168.194.30的tcp訪問流量來訪問F2
而在默認不設置的情況下,策略都為ACCEPT,即允許,所以192.168.194.30的流量能夠訪問
5)刪除filter表中的第X條策略
iptables -D INPUT 3
各項解釋:
INPUT —— (指定為INPUT鏈,想刪哪條鏈的策略就寫哪條鏈名)?
3 ——?(3為第三條策略,想刪哪條寫哪個數字)
3、firewalld命令
(1)概念
Firewalld?是 Linux 系統(尤其是 RHEL/CentOS/Fedora)中動態管理防火墻規則的工具,基于?firewall-cmd
?命令行工具和?zone
(區域)概念,支持動態更新規則而無需重啟服務。
1)核心概念?
區域(Zone)
-
定義:預定義的網絡信任級別,每個區域關聯一組規則(允許的服務、端口等)。
-
默認區域:通常為?
public
(未明確指定時使用)。 -
常見區域:
區域名 用途 public
公共網絡(默認,僅開放明確允許的服務)。 trusted
完全信任所有連接。 internal
內部網絡(類似? home
)。dmz
非軍事區(僅允許部分服務)。 block
拒絕所有入站流量(出站允許)。 drop
丟棄所有入站流量(無響應,出站允許)。
2)服務(Service)
-
預定義的端口和協議組合(如?
ssh
、http
、https
),簡化規則配置。 -
服務定義文件路徑:
/usr/lib/firewalld/services/*.xml
。
?3)運行時與永久配置
-
運行時(Runtime):臨時生效,重啟后失效。
-
永久(Permanent):持久化配置,需?
--permanent
?參數,重啟或重載后生效。
(2)常用命令
1)firewall-cmd命令表
狀態與基本信息
命令 | 說明 | 示例 |
---|---|---|
firewall-cmd --state | 查看防火墻運行狀態。 | - |
firewall-cmd --reload | 重新加載配置(應用永久規則)。 | sudo firewall-cmd --reload |
firewall-cmd --complete-reload | 完全重啟防火墻服務(斷開現有連接)。 | sudo firewall-cmd --complete-reload |
firewall-cmd --version | 查看 firewalld 版本。 | - |
區域(Zone)管理
命令 | 說明 | 示例 |
---|---|---|
firewall-cmd --get-default-zone | 查看默認區域。 | - |
firewall-cmd --set-default-zone=<zone> | 設置默認區域(需?--permanent )。 | sudo firewall-cmd --set-default-zone=internal --permanent |
firewall-cmd --get-active-zones | 查看所有活動區域及綁定的接口。 | - |
firewall-cmd --get-zones | 列出所有可用區域。 | - |
firewall-cmd --zone=<zone> --list-all | 查看指定區域的詳細配置。 | firewall-cmd --zone=public --list-all |
firewall-cmd --zone=<zone> --change-interface=<iface> | 為接口綁定區域(需?--permanent )。 | sudo firewall-cmd --zone=work --change-interface=eth0 --permanent |
服務(Service)與端口(Port)管理
命令 | 說明 | 示例 |
---|---|---|
firewall-cmd --list-services | 查看當前區域允許的服務。 | firewall-cmd --list-services |
firewall-cmd --add-service=<service> | 允許服務(默認運行時,加?--permanent ?永久生效)。 | sudo firewall-cmd --add-service=http |
firewall-cmd --remove-service=<service> | 移除服務。 | sudo firewall-cmd --remove-service=ftp |
firewall-cmd --list-ports | 查看當前區域開放的端口。 | firewall-cmd --list-ports |
firewall-cmd --add-port=<port>/<protocol> | 開放端口(如?80/tcp )。 | sudo firewall-cmd --add-port=8080/tcp --permanent |
firewall-cmd --remove-port=<port>/<protocol> | 移除端口。 |
?高級規則(Rich Rules)
命令 | 說明 | 示例 |
---|---|---|
firewall-cmd --add-rich-rule='<rule>' | 添加富規則(支持 IP、端口、協議等復雜條件)。 | sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept' |
firewall-cmd --remove-rich-rule='<rule>' | 移除富規則。 | sudo firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept' |
firewall-cmd --list-rich-rules | 列出所有富規則。 |
應急模式與連接追蹤
命令 | 說明 | 示例 |
---|---|---|
firewall-cmd --panic-on | 進入應急模式(拒絕所有流量,立即生效)。 | sudo firewall-cmd --panic-on |
firewall-cmd --panic-off | 退出應急模式。 | sudo firewall-cmd --panic-off |
firewall-cmd --query-panic | 檢查應急模式狀態。 | firewall-cmd --query-panic |
2)?火墻信息查看
firewall-cmd --state
示例?
firewall-cmd --list-all
示例?
?
3)管理域
firewall-cmd --get-default-zonefirewall-cmd --set-default-zone=trustedfirewall-cmd --get-zonesfirewall-cmd --get-active-zones
?示例
4)管理服務
firewall-cmd --get-servicesfirewall-cmd --list-services --zone=publicfirewall-cmd --permanent --add-service=http --zone=publicfirewall-cmd --permanent --remove-service=http
示例?
5)管理ip
firewall-cmd --add-source=192.168.76.20 --zone=trustedfirewall-cmd --remove-source=192.168.76.20 --zone=trusted
示例
6)管理port接口
firewall-cmd --add-port=80/tcpfirewall-cmd --remove-port=80/tcp
示例?
(3)firewalld高級規則?
Firewalld 的高級規則(Rich Rules)允許管理員基于復雜條件(如源/目標 IP、端口、協議、連接狀態等)定義精細化的防火墻策略。
1)核心參數與功能:
匹配條件
參數 | 說明 | |
---|---|---|
`family="ipv4 | ipv6"` | 指定協議族(IPv4 或 IPv6)。 |
source address="CIDR" | 匹配源 IP 或網段(如?192.168.1.0/24 )。 | |
destination address="CIDR" | 匹配目標 IP 或網段。 | |
`port port="端口" protocol="tcp | udp"` | 匹配目標端口和協議(如?port="80" protocol="tcp" )。 |
service name="服務名" | 匹配預定義的服務(如?ssh 、http )。 | |
protocol value="協議" | 匹配 IP 協議號或名稱(如?icmp 、gre )。 |
動作與日志
參數 | 說明 |
---|---|
accept | 允許數據包。 |
reject | 拒絕數據包并返回錯誤(默認?icmp-port-unreachable )。 |
drop | 丟棄數據包(無響應)。 |
log | 記錄日志(可選?prefix ?和?level )。 |
audit | 生成審計日志(需審計子系統支持)。 |
mark set="標記值" | 為數據包設置標記(需結合?tc ?等工具實現 QoS 或策略路由)。 |
?2)規則優先級與執行順序
-
富規則優先級
-
富規則優先于普通服務/端口規則執行。
-
規則按添加順序匹配,首條匹配的規則生效。
-
-
規則順序調整
-
默認無法直接調整順序,需先刪除再重新添加。
-