firewall-cmd
檢查與安裝
在 CentOS 8 上安裝和啟用 firewalld
(提供 firewall-cmd
工具)的步驟如下:
1. 檢查 **firewalld**
是否已安裝
在安裝前,先檢查系統中是否已安裝:
sudo firewall-cmd --version
如果返回版本號,說明已安裝。如果提示 command not found
,繼續以下步驟。
2. **安裝 ****firewalld**
運行以下命令安裝 firewalld
:
sudo dnf install firewalld -y
3. **啟用并啟動 ****firewalld**
安裝完成后,啟用并啟動 firewalld
服務:
sudo systemctl enable firewalld
sudo systemctl start firewalld
4. 驗證防火墻狀態
確認 firewalld
已成功運行:
sudo systemctl status firewalld
如果看到類似以下輸出,表示服務已正常運行:
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)Active: active (running) since ...
5. **測試 ****firewall-cmd**
確保 firewall-cmd
工具可用:
sudo firewall-cmd --state
如果返回 running
,表示防火墻已正常運行。
6. 開放常用端口(可選)
安裝完成后,可以根據需要開放一些常用端口:
- 開放 HTTP 端口(80):
sudo firewall-cmd --permanent --add-service=http
- 開放 HTTPS 端口(443):
sudo firewall-cmd --permanent --add-service=https
- 重新加載規則以生效:
sudo firewall-cmd --reload
7. 卸載其他防火墻工具(可選)
如果你之前使用的是 iptables
或其他防火墻工具,可以在 firewalld
安裝后將其卸載或停用以避免沖突:
sudo systemctl stop iptables
sudo systemctl disable iptables
完成以上步驟后,firewalld
和 firewall-cmd
已成功安裝并啟用!
查看配置
在 CentOS 8 中,可以使用 **firewall-cmd**
命令查看當前防火墻的配置和狀態。以下是一些常用的方法:
1. 查看防火墻狀態
檢查防火墻是否正在運行:
sudo firewall-cmd --state
- 返回
running
表示防火墻已啟用。 - 返回
not running
表示防火墻未啟動。
2. 查看當前活動的規則
查看當前啟用的服務:
sudo firewall-cmd --list-services
這將列出當前區域中已啟用的服務(如 http
、https
)。
查看當前啟用的端口:
sudo firewall-cmd --list-ports
這將顯示所有顯式開放的端口及其協議(如 8080/tcp
)。
3. 查看所有區域的配置
列出所有區域:
sudo firewall-cmd --get-zones
查看當前默認區域:
sudo firewall-cmd --get-default-zone
查看特定區域的詳細配置(以 public
為例):
sudo firewall-cmd --zone=public --list-all
這將顯示以下信息:
- 啟用的服務
- 顯式開放的端口
- 默認行為等
4. 查看防火墻規則是否永久生效
查看永久規則(不依賴當前運行狀態):
sudo firewall-cmd --list-all --permanent
5. 檢查防火墻日志
如果需要深入分析,可以檢查日志記錄:
sudo journalctl -u firewalld
示例輸出說明
以下是運行 sudo firewall-cmd --zone=public --list-all
的示例輸出:
public (active)target: defaulticmp-block-inversion: nointerfaces: eth0sources:services: dhcpv6-client http https sshports: 8080/tcpprotocols:masquerade: noforward-ports:source-ports:icmp-blocks:rich rules:
說明:
**services**
:列出了啟用的服務(如 HTTP、HTTPS 等)。**ports**
:列出了顯式開放的端口(如 8080/tcp)。**masquerade**
:是否啟用了網絡地址轉換 (NAT)。**rich rules**
:復雜自定義規則。
通過這些命令,你可以清晰了解防火墻當前的配置狀態,并根據需要進行調整。
4o
iptables
如果 CentOS 8 沒有安裝 firewalld
(或 firewall-cmd
),你可以使用 iptables 來查看和管理防火墻規則。以下是查看當前防火墻配置的命令和步驟:
1. 查看當前的防火墻規則
sudo iptables -L -n -v
**-L**
:列出所有規則。**-n**
:以數字顯示(不會解析為主機名或服務名)。**-v**
:顯示詳細信息,如流量統計。
2. 查看指定鏈的規則
iptables 的規則按鏈劃分(默認鏈為 INPUT
、OUTPUT
和 FORWARD
)。如果你只需要查看某一鏈的規則,可以指定鏈名稱:
查看 INPUT
鏈的規則:
sudo iptables -L INPUT -n -v
查看 OUTPUT
鏈的規則:
sudo iptables -L OUTPUT -n -v
3. 查看 NAT(Network Address Translation) 規則
如果你正在使用網絡地址轉換 (NAT),可以查看 NAT 表中的規則:
sudo iptables -t nat -L -n -v
**-t nat**
:指定 NAT 表。
4. 檢查端口轉發規則
如果有端口轉發規則,可以在 NAT 表中查找 PREROUTING
或 POSTROUTING
鏈的配置:
sudo iptables -t nat -L PREROUTING -n -v
sudo iptables -t nat -L POSTROUTING -n -v
5. 查看當前規則的保存文件
iptables 的規則通常會保存到配置文件中,CentOS 8 的保存文件路徑可能是:
/etc/sysconfig/iptables
用文本編輯器查看規則:
sudo cat /etc/sysconfig/iptables
6. 查看系統服務狀態
如果防火墻規則由系統服務管理,可以檢查相關服務的狀態:
sudo systemctl status iptables
示例輸出說明
運行 sudo iptables -L -n -v
后的示例輸出:
Chain INPUT (policy ACCEPT 300 packets, 20400 bytes)pkts bytes target prot opt in out source destination100 6000 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2250 3000 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8020 1500 DROP all -- * * 192.168.1.100 0.0.0.0/0
說明:
**policy ACCEPT**
:默認策略為接受(ACCEPT)。**tcp dpt:22**
:規則允許 TCP 22 端口(SSH)流量。**tcp dpt:80**
:規則允許 TCP 80 端口(HTTP)流量。**DROP**
:規則拒絕特定來源的流量。
7. 管理規則
如果需要調整規則,可直接使用 iptables
命令進行管理。例如:
添加規則:
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
刪除規則:
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
要刪除 iptables
中的規則,首先需要找到規則的具體位置。由于你提供的規則在 PREROUTING
鏈中,且規則是通過 REDIRECT
操作將端口 80 和 443 轉發到 8081 和 8443,因此我們需要精確地刪除這些規則。
步驟 1: 查看當前 PREROUTING
鏈中的規則
- 使用
iptables -t nat -L PREROUTING -n
來查看 NAT 表中PREROUTING
鏈的規則,確保能夠確認規則。
sudo iptables -t nat -L PREROUTING -n
輸出類似如下所示:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
31325 1640K REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 redir ports 8443
591K 24M REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8081
步驟 2: 刪除規則
iptables
刪除規則的命令格式是:
sudo iptables -t nat -D <chain> <rule-specification>
或者可以使用規則編號刪除。
方案 1:基于規則內容刪除
根據規則的內容刪除,將規則中每個元素逐一指定。
- 刪除第一個規則(端口 443 轉發到 8443):
sudo iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
- 刪除第二個規則(端口 80 轉發到 8081):
sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
方案 2:基于規則編號刪除
你還可以通過規則編號刪除,這要求你先查看規則編號。
- 運行命令列出規則及編號:
sudo iptables -t nat -L PREROUTING --line-numbers -n
輸出可能是這樣的:
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 31325 1640K REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 redir ports 8443
2 591K 24M REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8081
- 使用規則編號刪除:
- 刪除編號為 1 的規則(端口 443 轉發到 8443):
sudo iptables -t nat -D PREROUTING 1
- 刪除編號為 2 的規則(端口 80 轉發到 8081):
sudo iptables -t nat -D PREROUTING 2
步驟 3: 保存 iptables
配置
CentOS 8 默認使用 iptables
配置不會自動保存,因此刪除規則后,需要保存配置,以確保規則刪除后能夠持久化。
- 使用
service
命令保存配置:
sudo service iptables save
- 啟動
iptables
服務以確保配置生效:
sudo systemctl start iptables
- 設置
iptables
開機啟動:
sudo systemctl enable iptables
步驟 4: 驗證規則刪除
最后,驗證規則是否刪除成功:
sudo iptables -t nat -L PREROUTING -n
如果規則已成功刪除,輸出中將不再顯示這些 REDIRECT
規則。
總結
你可以通過 iptables -t nat -D PREROUTING
命令刪除基于端口的轉發規則,或者使用規則編號刪除。刪除完規則后,別忘了保存配置以確保修改在重啟后生效。
保存規則:
sudo service iptables save
補充說明
如果系統需要更現代的防火墻工具,可以考慮安裝并切換到 firewalld
或 nftables
,這將更易于管理。
總結
概念 | 描述 |
---|---|
表 (Tables) | 主要有 filter 、nat 、mangle 、raw 、security ,分別處理不同類型的網絡流量和規則。 |
鏈 (Chains) | 每個表包含多個鏈,最常見的鏈有 INPUT 、OUTPUT 、FORWARD ,每個鏈包含過濾規則。 |
默認鏈策略 | 每個鏈有默認策略,常見的策略有 ACCEPT (接受)和 DROP (丟棄)。 |
NAT 和過濾 | nat 表處理地址轉換,filter 表處理數據包過濾。 |
唯一確定規則的元素
- 表 (Table):
iptables
中有不同的表(例如filter
、nat
、mangle
、raw
、security
),每個表有不同的作用。規則必須指定所在的表。 - 鏈 (Chain):每個表中有若干個鏈(例如
INPUT
、OUTPUT
、FORWARD
、PREROUTING
、POSTROUTING
),規則會應用到這些鏈之一。不同鏈的規則用途不同。 - 協議 (Protocol):規則通常會基于協議進行過濾,如
tcp
、udp
、icmp
等,指定協議幫助精確匹配流量類型。 - 端口 (Port):對于
tcp
或udp
協議,通常會指定具體的端口(如80
、22
)。這使得規則能夠匹配特定的應用服務。 - 跳轉目標 (Jump target):每個規則都有一個目標(也叫跳轉目標,如
ACCEPT
、DROP
、REJECT
,或是跳轉到其他鏈),它決定了數據包匹配規則后應該如何處理。
唯一確定規則的方式
為了唯一確定一個 iptables
規則,可以將上述幾個元素結合起來:
<表> + <鏈> + <協議> + <端口> + <跳轉目標>
具體解釋
- 表 (Table):規則所在的表,決定了數據包處理的上下文。例如
filter
表用于過濾流量,nat
表用于網絡地址轉換。 - 鏈 (Chain):鏈決定了規則適用于數據流的哪個階段。例如,
INPUT
鏈用于入站流量,FORWARD
鏈用于轉發流量,OUTPUT
鏈用于出站流量。 - 協議 (Protocol):規則匹配特定協議的數據包,例如
tcp
、udp
或icmp
。你可以指定協議類型來匹配特定類型的流量。 - 端口 (Port):對于某些協議(如 TCP 和 UDP),可以進一步限定端口號。例如,HTTP 服務通常使用端口
80
,SSH 服務通常使用端口22
。 - 跳轉目標 (Jump target):在規則匹配后,數據包將會執行的操作。常見的目標包括
ACCEPT
(允許數據包通過)、DROP
(丟棄數據包)和REJECT
(拒絕數據包并返回錯誤)。
示例規則
假設我們有如下的規則:
sudo iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
- 表:
filter
(該規則是過濾表中的規則) - 鏈:
INPUT
(該規則是應用于入站流量的) - 協議:
tcp
(該規則只匹配 TCP 協議的數據包) - 端口:
80
(該規則只匹配目的端口為 80 的 TCP 數據包,即 HTTP 流量) - 跳轉目標:
ACCEPT
(如果數據包匹配規則,則允許通過)
如果另一個規則是:
sudo iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
- 表:
filter
- 鏈:
INPUT
- 協議:
tcp
- 端口:
22
(該規則匹配 SSH 流量) - 跳轉目標:
ACCEPT
這兩個規則是不同的,因為它們匹配不同的端口(80 和 22)。因此,在 iptables
中,表 + 鏈 + 協議 + 端口 + 跳轉目標 組合起來能唯一確定一條規則。
更復雜的規則
你還可以使用更多的匹配條件,例如:
- 源 IP 地址:
-s 192.168.1.1
- 目標 IP 地址:
-d 192.168.1.2
- 源端口:
--sport 1024
- TTL(生存時間):
--ttl 64
例如,下面的規則:
sudo iptables -t filter -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT
此規則的唯一確定性進一步增強,因為它不僅匹配端口 80 的 TCP 流量,還限制了源 IP 為 192.168.1.100
。
總結
要唯一確定 iptables
規則,必須綜合考慮以下幾個元素:
- 表:規則所在的表
- 鏈:規則應用于的鏈
- 協議:例如
tcp
、udp
等 - 端口:協議所涉及的端口號
- 跳轉目標:規則匹配后應執行的操作
通過這些組合,你可以準確地描述和唯一確定 iptables
的每一條規則。