一、概述
1.1 背景介紹
TCP/IP 網(wǎng)絡(luò)通信的本質(zhì)是進(jìn)程間通信。兩臺機(jī)器之間的數(shù)據(jù)傳輸,最終落到"某個 IP 地址的某個端口"這個粒度。端口號是傳輸層的概念,范圍 0-65535,其中 0-1023 為系統(tǒng)保留端口(Well-Known Ports),1024-49151 為注冊端口(Registered Ports),49152-65535 為動態(tài)端口(Ephemeral Ports)。
當(dāng)運維人員說"端口不通"時,實際可能指若干種完全不同的故障:
服務(wù)未監(jiān)聽:目標(biāo)端口上沒有進(jìn)程在監(jiān)聽,內(nèi)核直接返回 RST
防火墻攔截:數(shù)據(jù)包被 iptables/nftables/firewalld 規(guī)則丟棄或拒絕
安全策略阻斷:SELinux 阻止進(jìn)程綁定非標(biāo)準(zhǔn)端口
網(wǎng)絡(luò)路徑不可達(dá):中間路由設(shè)備、交換機(jī) ACL、云安全組阻斷
應(yīng)用層協(xié)議不匹配:TCP 連接建立成功但應(yīng)用層握手失敗
這五種情況的排查方法完全不同。如果不分層次地亂查,可能花幾個小時還找不到原因。
TCP 連接建立過程
理解端口不通的排查邏輯,首先需要理解 TCP 三次握手:
客戶端 服務(wù)端 | | | SYN (seq=x) | |------------------------------>| | | | SYN-ACK (seq=y, ack=x+1) | |<------------------------------| ? | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? | ?ACK (seq=x+1, ack=y+1) ? ? ?| ? |------------------------------>| | | | 連接建立完成 |
三次握手中任何一步出問題都會導(dǎo)致"端口不通"的表象,但根因截然不同:
| 階段 | 現(xiàn)象 | 常見原因 |
|---|---|---|
| SYN 發(fā)出后無響應(yīng) | 連接超時(通常 30-120 秒) | 防火墻 DROP、路由不可達(dá)、目標(biāo)主機(jī)宕機(jī) |
| SYN 發(fā)出后收到 RST | 連接立即被拒絕 | 端口未監(jiān)聽、防火墻 REJECT |
| SYN-ACK 已收到但 ACK 丟失 | 連接超時 | 客戶端出方向防火墻、NAT 問題 |
| 三次握手成功但隨后斷開 | 連接重置 | 應(yīng)用層拒絕、SSL/TLS 握手失敗 |
UDP 的特殊性
UDP 沒有連接建立過程,判斷"通不通"比 TCP 更復(fù)雜:
UDP 端口未監(jiān)聽時,內(nèi)核返回 ICMP Port Unreachable
如果防火墻丟棄了 ICMP 響應(yīng),客戶端無法區(qū)分"端口不通"和"數(shù)據(jù)包丟失"
UDP 探測的可靠方法是發(fā)送應(yīng)用層協(xié)議數(shù)據(jù)包并觀察是否有響應(yīng)
1.2 端口不通的七個排查層級
按照從近到遠(yuǎn)、從簡單到復(fù)雜的原則,端口不通的排查可以分為七個層級:
第一層:服務(wù)監(jiān)聽檢查(本機(jī)) ↓ 第二層:本地防火墻(iptables/nftables/firewalld) ↓ 第三層:SELinux 端口策略 ↓ 第四層:本機(jī)連通性測試(telnet/nc/curl) ↓ 第五層:網(wǎng)絡(luò)路徑排查(traceroute/mtr) ↓ 第六層:云安全組 / 網(wǎng)絡(luò) ACL ↓ 第七層:應(yīng)用層協(xié)議檢查
每一層只要確認(rèn)沒問題,就往下一層走。這種分層排查法避免了無頭蒼蠅式的排查。
1.3 適用場景
部署新服務(wù)后外部無法訪問
服務(wù)遷移后端口不通
網(wǎng)絡(luò)變更后部分端口受影響
容器化部署中的端口映射問題
跨云/跨機(jī)房的連通性故障
自動化巡檢中的端口健康檢查
1.4 環(huán)境要求
| 組件 | 版本要求 | 說明 |
|---|---|---|
| 操作系統(tǒng) | Ubuntu 24.04 LTS / Rocky Linux 9.5 | 內(nèi)核 6.12+ |
| iproute2 | 6.x | 提供 ss 命令 |
| nftables | 1.1.x | 新一代防火墻框架 |
| firewalld | 2.x | 高級防火墻管理 |
| nmap | 7.95+ | 端口掃描與探測 |
| ncat/nc | nmap 附帶 | 連通性測試 |
| mtr | 0.95+ | 網(wǎng)絡(luò)路徑分析 |
# Ubuntu 24.04 安裝必要工具 sudo apt install -y iproute2 nmap netcat-openbsd traceroute mtr-tiny tcpdump # Rocky Linux 9.5 安裝 sudo dnf install -y iproute nmap ncat traceroute mtr tcpdump
二、詳細(xì)步驟
2.1 準(zhǔn)備工作
在排查端口不通之前,先明確幾個關(guān)鍵信息:
# 確認(rèn)目標(biāo) IP 和端口 TARGET_IP="192.168.1.100" TARGET_PORT="8080" # 確認(rèn)本機(jī) IP ip addr show | grep"inet "| grep -v 127.0.0.1 # 確認(rèn)本機(jī)到目標(biāo)的基本網(wǎng)絡(luò)連通性 ping -c 3$TARGET_IP
如果 ping 不通,問題可能在更底層(網(wǎng)絡(luò)層),需要先解決 IP 可達(dá)性問題。但注意:ping 不通不代表端口不通——很多環(huán)境禁止 ICMP 但允許 TCP。
2.2 第一層:服務(wù)是否監(jiān)聽
這是最常見的原因,也是最先排查的。
使用 ss 命令(推薦)
# 查看所有 TCP 監(jiān)聽端口
ss -tlnp
# 查看特定端口是否在監(jiān)聽
ss -tlnp | grep":8080"
# 輸出示例
# LISTEN 0 4096 *:8080 *:* users:(("java",pid=12345,fd=88))
ss命令參數(shù)解釋:
-t:只顯示 TCP
-l:只顯示 LISTEN 狀態(tài)
-n:數(shù)字格式顯示端口(不做 DNS 解析)
-p:顯示進(jìn)程信息
監(jiān)聽地址的區(qū)別
# 查看監(jiān)聽地址 ss -tlnp | grep":8080"
監(jiān)聽地址有三種情況,含義完全不同:
| 監(jiān)聽地址 | 含義 | 外部是否可訪問 |
|---|---|---|
| 0.0.0.0:8080 | 監(jiān)聽所有 IPv4 地址 | 可以 |
| *:8080 或:::8080 | 監(jiān)聽所有地址(含 IPv6) | 可以 |
| 127.0.0.1:8080 | 只監(jiān)聽本地回環(huán) | 不可以 |
| 192.168.1.100:8080 | 只監(jiān)聽特定網(wǎng)卡 | 僅該網(wǎng)卡可達(dá) |
最常見的坑:應(yīng)用配置文件里 bind 地址寫了127.0.0.1或localhost,導(dǎo)致只能本機(jī)訪問。
# 典型的配置錯誤排查 # Nginx grep -r"listen"/etc/nginx/nginx.conf /etc/nginx/conf.d/ # MySQL grep"bind-address"/etc/mysql/mysql.conf.d/mysqld.cnf # Redis grep"bind"/etc/redis/redis.conf # Java 應(yīng)用的 application.yml grep -r"server.address"/path/to/app/
使用 netstat(兼容方案)
# 部分老系統(tǒng)還在用 netstat netstat -tlnp | grep":8080"
netstat已經(jīng)被ss取代,但在某些極簡容器鏡像中可能只有netstat。功能上兩者等價。
服務(wù)未監(jiān)聽的常見原因
| 原因 | 排查命令 | 解決方法 |
|---|---|---|
| 服務(wù)未啟動 |
systemctl status |
啟動服務(wù) |
| 服務(wù)啟動失敗 |
journalctl -u |
查看錯誤日志 |
| 端口被其他進(jìn)程占用 |
ss -tlnp | grep ": |
停止沖突進(jìn)程或更換端口 |
| 配置文件端口寫錯 | 檢查服務(wù)配置文件 | 修正端口配置 |
| bind 地址錯誤 | 檢查 bind/listen 配置 | 改為 0.0.0.0 |
2.3 第二層:本地防火墻
確認(rèn)服務(wù)已經(jīng)在監(jiān)聽后,下一步檢查本機(jī)防火墻是否放行了該端口。
firewalld(CentOS/Rocky Linux 默認(rèn))
# 查看 firewalld 是否運行 systemctl status firewalld # 查看當(dāng)前活動區(qū)域和規(guī)則 firewall-cmd --get-active-zones firewall-cmd --zone=public --list-all # 查看是否放行了特定端口 firewall-cmd --zone=public --query-port=8080/tcp # 放行端口(臨時,重啟失效) sudo firewall-cmd --zone=public --add-port=8080/tcp # 放行端口(永久) sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload # 放行服務(wù)(推薦方式,比端口號更語義化) sudo firewall-cmd --zone=public --add-service=http --permanent sudo firewall-cmd --reload
nftables(新一代框架)
Ubuntu 24.04 默認(rèn)使用 nftables 作為底層框架:
# 查看當(dāng)前規(guī)則集 sudo nft list ruleset # 查看特定鏈的規(guī)則 sudo nft list chain inet filter input # 添加放行規(guī)則 sudo nft add rule inet filter input tcp dport 8080 accept # 查看規(guī)則編號(用于刪除) sudo nft -a list chain inet filter input # 刪除指定規(guī)則 sudo nft delete rule inet filter input handle 15
iptables(傳統(tǒng)方式)
# 查看所有規(guī)則(帶行號) sudo iptables -L -n -v --line-numbers # 查看 INPUT 鏈 sudo iptables -L INPUT -n -v --line-numbers # 檢查是否有 DROP/REJECT 規(guī)則攔截了目標(biāo)端口 sudo iptables -L INPUT -n | grep -E"DROP|REJECT" # 添加放行規(guī)則(插入到 INPUT 鏈的第一條) sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT # 持久化規(guī)則 sudo netfilter-persistent save # Ubuntu/Debian sudo service iptables save # CentOS/RHEL
防火墻排查要點
# 快速判斷是否是防火墻問題的方法:臨時關(guān)閉防火墻測試 # 注意:僅在測試環(huán)境使用,生產(chǎn)環(huán)境禁止關(guān)閉防火墻 # 查看 iptables 規(guī)則計數(shù)器,確認(rèn)數(shù)據(jù)包是否命中了 DROP 規(guī)則 sudo iptables -L -n -v | grep -i drop # 實時監(jiān)控防火墻日志 sudo journalctl -f -t kernel | grep -i"iptables|nft|BLOCKED"
一個容易忽略的坑:Docker 會自動在 iptables 中創(chuàng)建 DOCKER 鏈和 NAT 規(guī)則。如果你在 Docker 宿主機(jī)上排查端口問題,需要同時檢查 DOCKER-USER 鏈:
# Docker 相關(guān)的 iptables 規(guī)則 sudo iptables -L DOCKER -n -v sudo iptables -L DOCKER-USER -n -v sudo iptables -t nat -L -n -v
2.4 第三層:SELinux 端口策略
在 Rocky Linux / CentOS 等開啟 SELinux 的系統(tǒng)上,即使防火墻放行了端口,SELinux 也可能阻止服務(wù)綁定非標(biāo)準(zhǔn)端口。
# 查看 SELinux 狀態(tài) getenforce # 輸出 Enforcing 表示開啟,Permissive 表示僅記錄不阻斷 # 查看 SELinux 允許的 HTTP 端口 semanage port -l | grep http_port_t # http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 # 如果需要 Nginx 監(jiān)聽 8080 端口 sudo semanage port -a -t http_port_t -p tcp 8080 # 查看 SELinux 拒絕日志 sudo ausearch -m avc -ts recent # 查看 audit.log 中的 SELinux 拒絕記錄 sudo grep"denied"/var/log/audit/audit.log | tail -10 # 生成允許策略(排查時使用) sudo ausearch -m avc -ts recent | audit2allow -w
SELinux 導(dǎo)致端口不通的典型特征:
ss -tlnp看不到服務(wù)在目標(biāo)端口監(jiān)聽
服務(wù)日志報 "Permission denied" 或 "Address already in use"(誤導(dǎo)性信息)
audit.log中有type=AVC msg=audit(...): avc: denied記錄
2.5 第四層:本機(jī)連通性測試
服務(wù)監(jiān)聽正常、防火墻已放行,接下來從其他機(jī)器測試連通性。
telnet
# 最基礎(chǔ)的 TCP 端口測試 telnet 192.168.1.100 8080 # 連接成功的輸出 # Trying 192.168.1.100... # Connected to 192.168.1.100. # Escape character is '^]'. # 連接失敗(被拒絕)的輸出 # Trying 192.168.1.100... # telnet: Unable to connect to remote host: Connection refused # 連接超時的輸出 # Trying 192.168.1.100... # (長時間無響應(yīng))
nc (netcat)
# TCP 端口測試(推薦,比 telnet 更靈活) nc -zv 192.168.1.100 8080 # 設(shè)置超時時間(避免長時間等待) nc -zv -w 5 192.168.1.100 8080 # 掃描端口范圍 nc -zv 192.168.1.100 8080-8090 # UDP 端口測試 nc -zuv -w 3 192.168.1.100 53 # 參數(shù)說明 # -z: 只掃描,不發(fā)送數(shù)據(jù) # -v: 詳細(xì)輸出 # -w: 超時時間(秒) # -u: UDP 模式
curl(HTTP/HTTPS 服務(wù))
# HTTP 服務(wù)測試
curl -v http://192.168.1.100:8080/health
# 只測試連通性,不關(guān)心響應(yīng)內(nèi)容
curl -o /dev/null -s -w"HTTP Code: %{http_code}
Time: %{time_total}s
"http://192.168.1.100:8080/
# HTTPS 服務(wù)測試(忽略證書驗證)
curl -vk https://192.168.1.100:443/
# 指定超時
curl --connect-timeout 5 --max-time 10 http://192.168.1.100:8080/
nmap(全面端口掃描)
# 掃描單個端口 nmap -p 8080 192.168.1.100 # 掃描多個端口 nmap -p 80,443,8080 192.168.1.100 # 掃描端口范圍 nmap -p 1-1024 192.168.1.100 # 掃描結(jié)果解讀 # PORT STATE SERVICE # 8080/tcp open http-proxy <-- 端口開放 # 8081/tcp closed ? tproxy ? ? ? <-- 端口關(guān)閉(RST) # 8082/tcp filtered unknown ? ? ?<-- 被防火墻過濾(DROP)
nmap 端口狀態(tài)含義:
| 狀態(tài) | 含義 | 對應(yīng)情況 |
|---|---|---|
| open | 端口開放 | 有服務(wù)監(jiān)聽且防火墻放行 |
| closed | 端口關(guān)閉 | 無服務(wù)監(jiān)聽但防火墻放行(返回 RST) |
| filtered | 被過濾 | 防火墻 DROP,無任何響應(yīng) |
| unfiltered | 未過濾 | ACK 掃描可達(dá)但無法確定開放/關(guān)閉 |
2.6 第五層:網(wǎng)絡(luò)路徑排查
從客戶端能 ping 通目標(biāo)但端口不通時,問題可能在中間路徑。
traceroute
# 基于 ICMP 的路由追蹤 traceroute 192.168.1.100 # 基于 TCP 的路由追蹤(穿透防火墻) sudo traceroute -T -p 8080 192.168.1.100 # 基于 UDP 的路由追蹤 traceroute -U -p 8080 192.168.1.100
mtr(推薦)
# 實時路由追蹤+丟包統(tǒng)計 mtr 192.168.1.100 # 基于 TCP 的 mtr sudo mtr --tcp -P 8080 192.168.1.100 # 報告模式(非交互) mtr -r -c 100 192.168.1.100 # 輸出示例 # Loss% Snt Last Avg Best Wrst StDev # 1. gateway 0.0% 100 0.5 0.6 0.3 2.1 0.3 # 2. 10.0.0.1 0.0% 100 1.2 1.3 0.8 3.5 0.4 # 3. ??? 100.0% 100 0.0 0.0 0.0 0.0 0.0 # 4. 192.168.1.1 0.0% 100 2.1 2.3 1.5 5.2 0.6 # 5. 192.168.1.100 0.0% 100 2.3 2.5 1.8 5.8 0.7
mtr 結(jié)果解讀:
某一跳 100% Loss 但后續(xù)正常:該設(shè)備不響應(yīng)探測包,不代表故障
某一跳開始 Loss 升高且后續(xù)持續(xù)高丟包:該跳可能是瓶頸
最后一跳丟包:目標(biāo)主機(jī)或其前面的設(shè)備有問題
tcpdump 輔助判斷
在目標(biāo)服務(wù)器上抓包,確認(rèn) SYN 包是否到達(dá):
# 在目標(biāo)服務(wù)器上抓包 sudo tcpdump -i any -nn port 8080 -c 20 # 如果能看到 SYN 包到達(dá)但沒有 SYN-ACK 響應(yīng),說明是本機(jī)防火墻或服務(wù)問題 # 如果完全看不到 SYN 包,說明數(shù)據(jù)包在到達(dá)目標(biāo)服務(wù)器之前就被攔截了 # 輸出示例(正常連接) # 1701.123456 IP 10.0.0.5.54321 > 192.168.1.100.8080: Flags [S], seq 123456 # 1701.123567 IP 192.168.1.100.8080 > 10.0.0.5.54321: Flags [S.], seq 789012, ack 123457 # 1701.124012 IP 10.0.0.5.54321 > 192.168.1.100.8080: Flags [.], ack 789013 # 輸出示例(SYN 到達(dá)但被 RST) # 1701.123456 IP 10.0.0.5.54321 > 192.168.1.100.8080: Flags [S], seq 123456 # 1701.123567 IP 192.168.1.100.8080 > 10.0.0.5.54321: Flags [R.], seq 0, ack 123457
2.7 第六層:云安全組 / 網(wǎng)絡(luò) ACL
在云環(huán)境中(AWS/阿里云/騰訊云),安全組是獨立于操作系統(tǒng)防火墻之外的網(wǎng)絡(luò)層控制。
# 阿里云 CLI 查看安全組規(guī)則 aliyun ecs DescribeSecurityGroupAttribute --SecurityGroupId sg-xxxxx # AWS CLI 查看安全組 aws ec2 describe-security-groups --group-ids sg-xxxxx # 騰訊云 CLI tccli cvm DescribeSecurityGroupPolicies --cli-unfold-argument --SecurityGroupId sg-xxxxx
云安全組排查要點:
| 檢查項 | 說明 |
|---|---|
| 入站規(guī)則 | 是否允許目標(biāo)端口的入站流量 |
| 出站規(guī)則 | 是否允許響應(yīng)流量的出站 |
| 協(xié)議類型 | TCP/UDP 是否匹配 |
| 源地址范圍 | 是否限制了客戶端 IP 段 |
| 規(guī)則優(yōu)先級 | 多條規(guī)則沖突時的優(yōu)先級 |
| 安全組關(guān)聯(lián) | 實例是否綁定了正確的安全組 |
常見的云安全組陷阱:
安全組默認(rèn)拒絕所有入站流量
修改安全組規(guī)則后不需要重啟實例,但生效可能有幾秒延遲
VPC 網(wǎng)絡(luò) ACL 和安全組是兩層控制,兩者都要放行
2.8 第七層:應(yīng)用層協(xié)議檢查
TCP 連接能建立但業(yè)務(wù)層面不通,問題在應(yīng)用層協(xié)議。
# HTTP 應(yīng)用層檢查 curl -v http://192.168.1.100:8080/api/health 2>&1 # 檢查返回狀態(tài)碼 # HTTP/1.1 200 OK -> 正常 # HTTP/1.1 502 Bad Gateway -> 后端服務(wù)不可達(dá) # HTTP/1.1 503 Service Unavailable -> 服務(wù)過載 # SSL/TLS 握手檢查 openssl s_client -connect 192.168.1.100:443 -servername example.com # 查看證書信息 openssl s_client -connect 192.168.1.100:443 2>/dev/null | openssl x509 -noout -dates -subject # gRPC 服務(wù)檢查 grpcurl -plaintext 192.168.1.100:9090 list # MySQL 連接測試 mysql -h 192.168.1.100 -P 3306 -u root -p -e"SELECT 1" # Redis 連接測試 redis-cli -h 192.168.1.100 -p 6379 ping
2.9 驗證與確認(rèn)
完成排查并修復(fù)后,做一次完整的驗證:
#!/bin/bash
# 端口連通性驗證腳本
# port_verify.sh
TARGET=$1
PORT=$2
echo"========== 端口連通性驗證 =========="
echo"目標(biāo):${TARGET}:${PORT}"
echo"時間:$(date '+%Y-%m-%d %H:%M:%S')"
echo"===================================="
# 1. DNS 解析
echo-e"
[1] DNS 解析"
host$TARGET2>/dev/null ||echo"非域名或解析失敗"
# 2. ICMP 連通性
echo-e"
[2] ICMP Ping"
ping -c 3 -W 2$TARGET2>/dev/null
if[ $? -ne 0 ];then
echo"ICMP 不通(可能被禁止)"
fi
# 3. TCP 端口測試
echo-e"
[3] TCP 端口測試"
nc -zv -w 5$TARGET$PORT2>&1
# 4. 路由追蹤
echo-e"
[4] TCP 路由追蹤"
sudo traceroute -T -p$PORT-m 15$TARGET2>/dev/null
echo-e"
========== 驗證完成 =========="
三、示例代碼和配置
3.1 完整的端口排查流程腳本
#!/bin/bash
# port_diagnose.sh - 端口不通問題自動診斷腳本
# 用法: ./port_diagnose.sh <目標(biāo)IP> <端口號>
set-euo pipefail
# 顏色定義
RED='?33[0;31m'
GREEN='?33[0;32m'
YELLOW='?33[1;33m'
NC='?33[0m'
TARGET_IP="${1:?用法: $0 <目標(biāo)IP> <端口號>}"
TARGET_PORT="${2:?用法: $0 <目標(biāo)IP> <端口號>}"
log_pass() {echo-e"${GREEN}[PASS]${NC}$1"; }
log_fail() {echo-e"${RED}[FAIL]${NC}$1"; }
log_warn() {echo-e"${YELLOW}[WARN]${NC}$1"; }
log_info() {echo-e"[INFO]$1"; }
echo"============================================"
echo" 端口連通性診斷工具"
echo" 目標(biāo):${TARGET_IP}:${TARGET_PORT}"
echo" 時間:$(date '+%Y-%m-%d %H:%M:%S')"
echo"============================================"
# 第一層:檢查是否為本機(jī)
IS_LOCAL=false
ifip addr show | grep -q"${TARGET_IP}";then
IS_LOCAL=true
log_info"目標(biāo) IP 是本機(jī)地址"
fi
# 第二層:如果是本機(jī),檢查服務(wù)監(jiān)聽
if$IS_LOCAL;then
echo-e"
--- 第一層:服務(wù)監(jiān)聽檢查 ---"
LISTEN_INFO=$(ss -tlnp | grep":${TARGET_PORT}"||true)
if[ -n"$LISTEN_INFO"];then
log_pass"端口${TARGET_PORT}有服務(wù)在監(jiān)聽"
echo" $LISTEN_INFO"
# 檢查監(jiān)聽地址
LISTEN_ADDR=$(echo"$LISTEN_INFO"| awk'{print $4}'| cut -d: -f1)
if["$LISTEN_ADDR"="127.0.0.1"];then
log_warn"服務(wù)僅監(jiān)聽 127.0.0.1,外部無法訪問"
fi
else
log_fail"端口${TARGET_PORT}沒有服務(wù)在監(jiān)聽"
log_info"可能原因:服務(wù)未啟動、配置端口不對、端口被占用"
fi
# 檢查防火墻
echo-e"
--- 第二層:防火墻檢查 ---"
ifcommand-v firewall-cmd &>/dev/null;then
ifsystemctl is-active --quiet firewalld;then
FW_RESULT=$(firewall-cmd --query-port=${TARGET_PORT}/tcp 2>/dev/null ||true)
if["$FW_RESULT"="yes"];then
log_pass"firewalld 已放行端口${TARGET_PORT}/tcp"
else
log_fail"firewalld 未放行端口${TARGET_PORT}/tcp"
fi
else
log_info"firewalld 未運行"
fi
fi
# 檢查 iptables
ifcommand-v iptables &>/dev/null;then
DROP_RULES=$(sudo iptables -L INPUT -n 2>/dev/null | grep -c"DROP|REJECT"||true)
if["$DROP_RULES"-gt 0 ];then
log_warn"iptables INPUT 鏈有${DROP_RULES}條 DROP/REJECT 規(guī)則"
else
log_pass"iptables INPUT 鏈無 DROP/REJECT 規(guī)則"
fi
fi
# 檢查 SELinux
echo-e"
--- 第三層:SELinux 檢查 ---"
ifcommand-v getenforce &>/dev/null;then
SELINUX_STATUS=$(getenforce)
if["$SELINUX_STATUS"="Enforcing"];then
log_warn"SELinux 處于 Enforcing 模式"
AVC_DENIED=$(sudo ausearch -m avc -ts recent 2>/dev/null | grep -c"denied"||true)
if["$AVC_DENIED"-gt 0 ];then
log_fail"發(fā)現(xiàn)${AVC_DENIED}條 SELinux 拒絕記錄"
fi
else
log_info"SELinux 狀態(tài):$SELINUX_STATUS"
fi
else
log_info"SELinux 未安裝"
fi
fi
# 第四層:連通性測試
echo-e"
--- 第四層:連通性測試 ---"
# TCP 測試
ifnc -zv -w 5"$TARGET_IP""$TARGET_PORT"2>&1 | grep -q"succeeded|Connected|open";then
log_pass"TCP 連接到${TARGET_IP}:${TARGET_PORT}成功"
else
log_fail"TCP 連接到${TARGET_IP}:${TARGET_PORT}失敗"
# 進(jìn)一步診斷
echo-e"
--- 第五層:網(wǎng)絡(luò)路徑分析 ---"
log_info"執(zhí)行路由追蹤..."
ifcommand-v mtr &>/dev/null;then
mtr -r -c 10 --tcp -P"$TARGET_PORT""$TARGET_IP"2>/dev/null ||
mtr -r -c 10"$TARGET_IP"2>/dev/null
else
traceroute -m 15"$TARGET_IP"2>/dev/null ||true
fi
fi
# nmap 掃描
echo-e"
--- 端口狀態(tài)掃描 ---"
ifcommand-v nmap &>/dev/null;then
NMAP_RESULT=$(nmap -p"$TARGET_PORT""$TARGET_IP"2>/dev/null | grep"^${TARGET_PORT}"||true)
if[ -n"$NMAP_RESULT"];then
log_info"nmap 結(jié)果:$NMAP_RESULT"
ifecho"$NMAP_RESULT"| grep -q"filtered";then
log_warn"端口被防火墻過濾(DROP),數(shù)據(jù)包未到達(dá)目標(biāo)"
fi
fi
fi
echo-e"
============================================"
echo" 診斷完成"
echo"============================================"
3.2 案例 1:firewalld 規(guī)則遺漏導(dǎo)致端口不通
場景:部署了一個新的 Java 應(yīng)用,監(jiān)聽 8080 端口,本機(jī) curl 正常,但外部訪問超時。
排查過程:
# 1. 確認(rèn)服務(wù)在監(jiān)聽
ss -tlnp | grep":8080"
# LISTEN 0 4096 *:8080 *:* users:(("java",pid=15234,fd=88))
# 結(jié)論:服務(wù)正常監(jiān)聽在所有接口
# 2. 本機(jī)測試
curl -s -o /dev/null -w"%{http_code}"http://127.0.0.1:8080/health
# 200
# 結(jié)論:本機(jī)訪問正常
# 3. 檢查防火墻
systemctl status firewalld
# Active: active (running)
firewall-cmd --zone=public --list-all
# public (active)
# target: default
# services: cockpit dhcpv6-client ssh
# ports:
# 結(jié)論:firewalld 運行中,未放行 8080 端口
# 4. 放行端口
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# 5. 驗證
firewall-cmd --zone=public --query-port=8080/tcp
# yes
# 從外部再次測試
# curl http://192.168.1.100:8080/health
# 200 OK
3.3 案例 2:SELinux 阻止非標(biāo)準(zhǔn)端口
場景:將 Nginx 的監(jiān)聽端口從 80 改為 9090 后,Nginx 啟動失敗。
# 1. 查看 Nginx 狀態(tài) sudo systemctl status nginx # nginx.service - The nginx HTTP and reverse proxy server # Active: failed # 2. 查看錯誤日志 sudo journalctl -u nginx --no-pager -n 20 # nginx: [emerg] bind() to 0.0.0.0:9090 failed (13: Permission denied) # 3. 檢查 SELinux getenforce # Enforcing # 4. 查看 SELinux 允許的 HTTP 端口 sudo semanage port -l | grep http_port_t # http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 # 結(jié)論:9090 不在允許列表中 # 5. 添加 9090 到 HTTP 端口類型 sudo semanage port -a -t http_port_t -p tcp 9090 # 6. 重啟 Nginx sudo systemctl start nginx sudo systemctl status nginx # Active: active (running) # 7. 驗證 ss -tlnp | grep":9090" # LISTEN 0 511 0.0.0.0:9090 0.0.0.0:* users:(("nginx",...))
3.4 案例 3:Docker 容器端口映射異常
場景:運行 Docker 容器時指定了-p 8080:80,但外部無法訪問 8080 端口。
# 1. 確認(rèn)容器運行狀態(tài) docker ps | grep myapp # abc123 myapp:latest "nginx -g ..." Up 5 minutes 0.0.0.0:8080->80/tcp myapp # 2. 檢查端口映射 docker port myapp # 80/tcp -> 0.0.0.0:8080 # 3. 容器內(nèi)部測試 dockerexecmyapp curl -s http://127.0.0.1:80/ # 正常響應(yīng) # 4. 宿主機(jī)測試 curl -s http://127.0.0.1:8080/ # 正常響應(yīng) # 5. 外部測試失敗,檢查 Docker 的 iptables 規(guī)則 sudo iptables -L DOCKER -n -v # Chain DOCKER (1 references) # pkts bytes target prot opt in out source destination # 125 6500 ACCEPT tcp -- !docker0 docker0 0.0.0.0/0 172.17.0.2 tcp dpt:80 # 6. 檢查 DOCKER-USER 鏈(用戶自定義規(guī)則會在這里) sudo iptables -L DOCKER-USER -n -v # Chain DOCKER-USER (1 references) # pkts bytes target prot opt in out source destination # 0 0 DROP all -- eth0 * 0.0.0.0/0 0.0.0.0/0 # 結(jié)論:DOCKER-USER 鏈有一條 DROP 規(guī)則阻止了所有從 eth0 進(jìn)入的流量 # 7. 修復(fù):刪除錯誤的 DROP 規(guī)則 sudo iptables -D DOCKER-USER -i eth0 -j DROP # 添加正確的規(guī)則(只允許特定端口) sudo iptables -I DOCKER-USER -i eth0 -p tcp --dport 80 -j ACCEPT sudo iptables -A DOCKER-USER -j RETURN # 8. 驗證 curl -s http://192.168.1.100:8080/ # 正常響應(yīng)
3.5 端口連通性批量檢測腳本
#!/bin/bash
# batch_port_check.sh - 批量端口檢測腳本
# 用法: ./batch_port_check.sh <配置文件>
# 配置文件格式: IP:端口:服務(wù)名(每行一個)
CONFIG_FILE="${1:?用法: $0 <配置文件>}"
TIMEOUT=5
TIMESTAMP=$(date'+%Y-%m-%d %H:%M:%S')
TOTAL=0
PASS=0
FAIL=0
RED='?33[0;31m'
GREEN='?33[0;32m'
NC='?33[0m'
echo"=========================================="
echo" 批量端口連通性檢測"
echo" 時間:${TIMESTAMP}"
echo"=========================================="
echo""
printf"%-20s %-8s %-15s %-10s
""目標(biāo)""端口""服務(wù)""狀態(tài)"
printf"%-20s %-8s %-15s %-10s
""----""----""----""----"
whileIFS=:read-r ip port service;do
# 跳過空行和注釋
[[ -z"$ip"||"$ip"=~ ^# ]] && continue
TOTAL=$((TOTAL + 1))
ifnc -zv -w$TIMEOUT"$ip""$port"&>/dev/null;then
printf"%-20s %-8s %-15s${GREEN}%-10s${NC}
""$ip""$port""$service""通"
PASS=$((PASS + 1))
else
printf"%-20s %-8s %-15s${RED}%-10s${NC}
""$ip""$port""$service""不通"
FAIL=$((FAIL + 1))
fi
done"$CONFIG_FILE"
echo?""
echo?"=========================================="
echo?" 檢測完成: 總計?${TOTAL}, 通過?${PASS}, 失敗?${FAIL}"
echo?"=========================================="
# 退出碼:有失敗則返回 1
[?$FAIL?-eq 0 ] &&?exit?0 ||?exit?1
配置文件示例:
# port_check.conf # 格式: IP:端口:服務(wù)名 192.168.1.100Nginx-HTTP 192.168.1.100Nginx-HTTPS 192.168.1.101MySQL 192.168.1.101Redis 192.168.1.102Prometheus 192.168.1.102Grafana 10.0.0.50App-Server-1 10.0.0.51App-Server-2
四、最佳實踐和注意事項
4.1 最佳實踐
防火墻規(guī)則管理規(guī)范
# 1. 使用服務(wù)名而非端口號(firewalld) # 推薦:語義化更強(qiáng) sudo firewall-cmd --add-service=http --permanent # 不推薦:端口號不直觀 sudo firewall-cmd --add-port=80/tcp --permanent # 2. 使用 rich rules 實現(xiàn)精細(xì)控制 # 只允許特定 IP 段訪問 MySQL sudo firewall-cmd --permanent --add-rich-rule=' rule family="ipv4" source address="10.0.0.0/24" port port="3306" protocol="tcp" accept' # 3. 防火墻規(guī)則版本化管理 # 導(dǎo)出當(dāng)前規(guī)則 sudo iptables-save > /etc/iptables/rules.v4.$(date +%Y%m%d) sudo nft list ruleset > /etc/nftables.conf.$(date +%Y%m%d) # 4. 變更前備份 sudo cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/public.xml.bak
端口變更 Checklist
| 序號 | 檢查項 | 負(fù)責(zé)人 | 完成 |
|---|---|---|---|
| 1 | 新端口在應(yīng)用配置中已修改 | 開發(fā) | |
| 2 | 操作系統(tǒng)防火墻已放行 | 運維 | |
| 3 | SELinux 策略已更新 | 運維 | |
| 4 | 云安全組/網(wǎng)絡(luò) ACL 已更新 | 運維 | |
| 5 | 負(fù)載均衡器后端端口已更新 | 運維 | |
| 6 | DNS 記錄已更新(如有) | 運維 | |
| 7 | 監(jiān)控探測端口已更新 | 運維 | |
| 8 | 文檔已更新 | 運維 | |
| 9 | 回滾方案已準(zhǔn)備 | 運維 |
安全加固建議
# 1. 只開放必要的端口,默認(rèn)拒絕所有
sudo firewall-cmd --set-default-zone=drop
sudo firewall-cmd --zone=drop --add-service=ssh --permanent
# 2. 限制 SSH 來源 IP
sudo firewall-cmd --permanent --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/8"
service name="ssh"
accept'
# 3. 定期審查開放端口
ss -tlnp | awk'NR>1 {print $4}'| sort -u
# 4. 關(guān)閉不需要的服務(wù)
sudo systemctldisable--now rpcbind
sudo systemctldisable--now avahi-daemon
4.2 注意事項
常見錯誤
| 錯誤現(xiàn)象 | 原因分析 | 解決方案 |
|---|---|---|
| firewall-cmd 規(guī)則添加后不生效 | 未加 --permanent 或未 reload | 加上 --permanent 并執(zhí)行 --reload |
| iptables 規(guī)則重啟后丟失 | 未持久化規(guī)則 | 使用 netfilter-persistent save |
| Docker 端口映射不通 | DOCKER-USER 鏈有 DROP 規(guī)則 | 檢查并修復(fù) DOCKER-USER 鏈 |
| telnet 超時但 ping 通 | 防火墻 DROP TCP 但放行 ICMP | 檢查防火墻 TCP 規(guī)則 |
| 本機(jī) curl 通但外部不通 | 服務(wù)綁定 127.0.0.1 | 修改 bind 地址為 0.0.0.0 |
| SELinux 拒絕非標(biāo)準(zhǔn)端口 | 端口不在 SELinux 策略中 | semanage port 添加端口 |
| nmap 顯示 filtered | 中間設(shè)備 DROP 數(shù)據(jù)包 | 檢查云安全組/網(wǎng)絡(luò) ACL |
| 端口狀態(tài)時通時斷 | 連接數(shù)超限或負(fù)載均衡問題 | 檢查 conntrack 表和負(fù)載均衡 |
兼容性注意事項
ss是iproute2包的組成部分,在所有現(xiàn)代 Linux 發(fā)行版中默認(rèn)安裝
netstat屬于net-tools包,在最小安裝中可能不存在
nftables是 iptables 的替代者,但 iptables 命令會自動轉(zhuǎn)換為 nftables 規(guī)則
firewalld 2.x 默認(rèn)使用 nftables 后端
Docker 仍然依賴 iptables 規(guī)則,即使系統(tǒng)使用 nftables
容器環(huán)境特殊注意
# Kubernetes 中的端口排查 # 1. 檢查 Service 端口映射 kubectl get svc -n# 2. 檢查 Endpoints kubectl get endpoints -n # 3. 檢查 Pod 端口 kubectl get pod -n -o jsonpath='{.spec.containers[*].ports}' # 4. 檢查 NetworkPolicy kubectl get networkpolicy -n # 5. 在 Pod 內(nèi)部測試 kubectlexec-it -n -- nc -zv
五、故障排查和監(jiān)控
5.1 故障排查
日志查看
# firewalld 日志 sudo journalctl -u firewalld -n 50 --no-pager # iptables 日志(需要先添加 LOG 規(guī)則) sudo iptables -I INPUT -p tcp --dport 8080 -j LOG --log-prefix"PORT8080: " sudo journalctl -k | grep"PORT8080" # SELinux 拒絕日志 sudo ausearch -m avc -ts recent sudo sealert -a /var/log/audit/audit.log # 內(nèi)核網(wǎng)絡(luò)棧日志 dmesg | grep -i"nf_conntrack|dropped|martian"
conntrack 表排查
# 查看連接跟蹤表大小 cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_max # 如果 count 接近 max,新連接會被丟棄 # 臨時增大連接跟蹤表 sudo sysctl -w net.netfilter.nf_conntrack_max=1048576 # 查看特定端口的連接跟蹤記錄 sudo conntrack -L -p tcp --dport 8080 2>/dev/null | head -20 # 清除特定連接 sudo conntrack -D -p tcp --dport 8080
常見問題排查表
| 問題 | 快速診斷命令 | 預(yù)期結(jié)果 |
|---|---|---|
| 服務(wù)是否監(jiān)聽 |
ss -tlnp | grep : |
看到 LISTEN 行 |
| 防火墻是否放行 |
firewall-cmd --query-port= |
yes |
| SELinux 是否阻止 | ausearch -m avc -ts recent | 無相關(guān)拒絕記錄 |
| 數(shù)據(jù)包是否到達(dá) |
tcpdump -i any port |
看到 SYN 包 |
| 路徑是否可達(dá) |
mtr --tcp -P |
最后一跳無丟包 |
| conntrack 是否滿 | cat /proc/sys/net/netfilter/nf_conntrack_count | 遠(yuǎn)小于 max 值 |
5.2 性能監(jiān)控
Blackbox Exporter 端口探測
Prometheus 的 blackbox_exporter 是端口連通性監(jiān)控的標(biāo)準(zhǔn)方案。
# blackbox.yml - blackbox_exporter 配置 modules: tcp_connect: prober:tcp timeout:5s tcp: preferred_ip_protocol:"ip4" tcp_connect_tls: prober:tcp timeout:5s tcp: preferred_ip_protocol:"ip4" tls:true tls_config: insecure_skip_verify:false http_2xx: prober:http timeout:10s http: valid_http_versions:["HTTP/1.1","HTTP/2.0"] valid_status_codes:[200,204] method:GET preferred_ip_protocol:"ip4" icmp_check: prober:icmp timeout:5s icmp: preferred_ip_protocol:"ip4"
# prometheus.yml - Prometheus 抓取配置 scrape_configs: -job_name:'blackbox-tcp' metrics_path:/probe params: module:[tcp_connect] static_configs: -targets: -'192.168.1.100:8080' -'192.168.1.101:3306' -'192.168.1.102:6379' relabel_configs: -source_labels:[__address__] target_label:__param_target -source_labels:[__param_target] target_label:instance -target_label:__address__ replacement:'blackbox-exporter:9115' -job_name:'blackbox-http' metrics_path:/probe params: module:[http_2xx] static_configs: -targets: -'http://192.168.1.100:80/health' -'https://192.168.1.100:443/health' relabel_configs: -source_labels:[__address__] target_label:__param_target -source_labels:[__param_target] target_label:instance -target_label:__address__ replacement:'blackbox-exporter:9115'
Prometheus 告警規(guī)則
# port_alerts.yml
groups:
-name:port_connectivity
rules:
-alert:PortUnreachable
expr:probe_success{job="blackbox-tcp"}==0
for:2m
labels:
severity:critical
annotations:
summary:"端口不可達(dá):{{ $labels.instance }}"
description:"目標(biāo){{ $labels.instance }}的端口連通性檢測失敗,已持續(xù) 2 分鐘"
-alert:PortHighLatency
expr:probe_duration_seconds{job="blackbox-tcp"}>1
for:5m
labels:
severity:warning
annotations:
summary:"端口響應(yīng)延遲高:{{ $labels.instance }}"
description:"目標(biāo){{ $labels.instance }}的 TCP 連接耗時超過 1 秒"
-alert:SSLCertExpiringSoon
expr:probe_ssl_earliest_cert_expiry-time()86400?*?30
? ? ? ??for:?1h
? ? ? ??labels:
? ? ? ? ??severity:?warning
? ? ? ??annotations:
? ? ? ? ??summary:?"SSL 證書即將過期:?{{ $labels.instance }}"
? ? ? ? ??description:?"證書將在?{{ $value | humanizeDuration }}?后過期"
? ? ??-?alert:?HTTPStatusError
? ? ? ??expr:?probe_http_status_code{job="blackbox-http"}?!=?200
? ? ? ??for:?3m
? ? ? ??labels:
? ? ? ? ??severity:?critical
? ? ? ??annotations:
? ? ? ? ??summary:?"HTTP 狀態(tài)異常:?{{ $labels.instance }}"
? ? ? ? ??description:?"HTTP 狀態(tài)碼:?{{ $value }}"
關(guān)鍵監(jiān)控指標(biāo)
| 指標(biāo)名稱 | 含義 | 正常范圍 | 告警閾值 |
|---|---|---|---|
| probe_success | 探測是否成功 | 1 | == 0 持續(xù) 2 分鐘 |
| probe_duration_seconds | 探測耗時 | < 0.1s | > 1s 持續(xù) 5 分鐘 |
| probe_dns_lookup_time_seconds | DNS 解析耗時 | < 0.05s | > 0.5s |
| probe_ssl_earliest_cert_expiry | SSL 證書過期時間 | > 30 天 | < 30 天 |
| node_netfilter_conntrack_entries | conntrack 條目數(shù) | < max 的 70% | > max 的 80% |
5.3 備份與恢復(fù)
防火墻規(guī)則備份
#!/bin/bash
# firewall_backup.sh - 防火墻規(guī)則備份腳本
BACKUP_DIR="/opt/backup/firewall"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p"$BACKUP_DIR"
# 備份 iptables 規(guī)則
ifcommand-v iptables-save &>/dev/null;then
sudo iptables-save >"${BACKUP_DIR}/iptables_${DATE}.rules"
sudo ip6tables-save >"${BACKUP_DIR}/ip6tables_${DATE}.rules"
echo"iptables 規(guī)則已備份"
fi
# 備份 nftables 規(guī)則
ifcommand-v nft &>/dev/null;then
sudo nft list ruleset >"${BACKUP_DIR}/nftables_${DATE}.conf"
echo"nftables 規(guī)則已備份"
fi
# 備份 firewalld 配置
if[ -d /etc/firewalld ];then
tar czf"${BACKUP_DIR}/firewalld_${DATE}.tar.gz"/etc/firewalld/
echo"firewalld 配置已備份"
fi
# 保留最近 30 天的備份
find"$BACKUP_DIR"-name"*.rules"-mtime +30 -delete
find"$BACKUP_DIR"-name"*.conf"-mtime +30 -delete
find"$BACKUP_DIR"-name"*.tar.gz"-mtime +30 -delete
echo"備份完成:${BACKUP_DIR}"
規(guī)則恢復(fù)
# 恢復(fù) iptables 規(guī)則 sudo iptables-restore < /opt/backup/firewall/iptables_20260313.rules # 恢復(fù) nftables 規(guī)則 sudo nft -f /opt/backup/firewall/nftables_20260313.conf # 恢復(fù) firewalld 配置 sudo tar xzf /opt/backup/firewall/firewalld_20260313.tar.gz -C / sudo firewall-cmd --reload
六、總結(jié)
6.1 技術(shù)要點回顧
端口不通問題需要分層排查:服務(wù)監(jiān)聽 → 防火墻 → SELinux → 網(wǎng)絡(luò)路徑 → 云安全組 → 應(yīng)用層
ss -tlnp是確認(rèn)服務(wù)監(jiān)聽的第一選擇,重點關(guān)注監(jiān)聽地址(0.0.0.0 vs 127.0.0.1)
防火墻排查需要同時檢查 firewalld/iptables/nftables,Docker 環(huán)境還要檢查 DOCKER-USER 鏈
SELinux 在 Enforcing 模式下會阻止非標(biāo)準(zhǔn)端口綁定,使用semanage port添加
nmap的端口狀態(tài)(open/closed/filtered)能精確反映問題所在層級
云環(huán)境需要額外檢查安全組和網(wǎng)絡(luò) ACL,這些是獨立于操作系統(tǒng)之外的控制
使用 blackbox_exporter 做端口連通性的持續(xù)監(jiān)控
6.2 進(jìn)階學(xué)習(xí)方向
eBPF 網(wǎng)絡(luò)追蹤:使用 bpftrace 追蹤內(nèi)核網(wǎng)絡(luò)棧中數(shù)據(jù)包的處理路徑,精確定位丟包位置
Kubernetes 網(wǎng)絡(luò)策略:NetworkPolicy、Calico/Cilium 網(wǎng)絡(luò)插件的端口控制機(jī)制
服務(wù)網(wǎng)格:Istio/Linkerd 環(huán)境中 sidecar 代理對端口通信的影響
零信任網(wǎng)絡(luò):基于身份而非 IP/端口的訪問控制架構(gòu)
6.3 參考資料
Linux man pages: ss(8), iptables(8), nft(8), firewall-cmd(1)
nmap 官方文檔: https://nmap.org/book/
Prometheus Blackbox Exporter: https://github.com/prometheus/blackbox_exporter
firewalld 官方文檔: https://firewalld.org/documentation/
Red Hat SELinux 管理指南: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux
附錄
A. 命令速查表
# 服務(wù)監(jiān)聽檢查 ss -tlnp # 查看所有 TCP 監(jiān)聽 ss -tlnp | grep":" # 查看特定端口 ss -ulnp # 查看所有 UDP 監(jiān)聽 # 防火墻操作 firewall-cmd --list-all # 查看當(dāng)前規(guī)則 firewall-cmd --add-port=8080/tcp --permanent # 添加端口 firewall-cmd --reload # 重載規(guī)則 sudo iptables -L -n -v # iptables 規(guī)則 sudo nft list ruleset # nftables 規(guī)則 # SELinux getenforce # 查看狀態(tài) semanage port -l | grep # 查看端口策略 semanage port -a -t -p tcp # 添加端口 # 連通性測試 nc -zv -w 5 # TCP 測試 nmap -p # 端口掃描 curl -v http:// : / # HTTP 測試 telnet # 基礎(chǔ)測試 # 路徑分析 mtr --tcp -P # TCP 路由追蹤 traceroute -T -p # TCP traceroute tcpdump -i any port -nn # 抓包確認(rèn) # conntrack conntrack -L -p tcp --dport # 查看連接跟蹤 conntrack -D -p tcp --dport # 清除連接 cat /proc/sys/net/netfilter/nf_conntrack_count # 當(dāng)前連接數(shù)
B. 配置參數(shù)詳解
firewalld 區(qū)域默認(rèn)行為
| 區(qū)域 | 默認(rèn)行為 | 適用場景 |
|---|---|---|
| drop | 丟棄所有入站,不響應(yīng) | 高安全需求 |
| block | 拒絕所有入站,返回 ICMP 拒絕 | 安全需求 |
| public | 只允許指定服務(wù) | 公網(wǎng)服務(wù)器 |
| external | NAT 轉(zhuǎn)發(fā) | 網(wǎng)關(guān)服務(wù)器 |
| dmz | 只允許指定服務(wù) | DMZ 區(qū)域 |
| work | 信任同事網(wǎng)絡(luò) | 辦公網(wǎng)絡(luò) |
| home | 信任家庭網(wǎng)絡(luò) | 家庭環(huán)境 |
| internal | 信任內(nèi)部網(wǎng)絡(luò) | 內(nèi)網(wǎng)服務(wù)器 |
| trusted | 允許所有流量 | 完全信任網(wǎng)絡(luò) |
nmap 常用掃描類型
| 參數(shù) | 掃描類型 | 原理 | 適用場景 |
|---|---|---|---|
| -sT | TCP Connect | 完整三次握手 | 普通用戶 |
| -sS | TCP SYN | 半開掃描 | 需要 root |
| -sU | UDP | 發(fā)送 UDP 包 | UDP 服務(wù) |
| -sA | TCP ACK | 判斷防火墻規(guī)則 | 防火墻檢測 |
| -sN | TCP Null | 不設(shè)置任何標(biāo)志 | 繞過簡單過濾 |
C. 術(shù)語表
| 術(shù)語 | 英文 | 解釋 |
|---|---|---|
| 三次握手 | Three-Way Handshake | TCP 建立連接的過程:SYN → SYN-ACK → ACK |
| 連接跟蹤 | Connection Tracking | 內(nèi)核記錄網(wǎng)絡(luò)連接狀態(tài)的機(jī)制(conntrack) |
| 有狀態(tài)防火墻 | Stateful Firewall | 能識別連接狀態(tài)的防火墻,只需放行首包 |
| 安全組 | Security Group | 云平臺的虛擬防火墻,控制實例級別的網(wǎng)絡(luò)訪問 |
| ACL | Access Control List | 網(wǎng)絡(luò)訪問控制列表,控制子網(wǎng)級別的流量 |
| BPF | Berkeley Packet Filter | 內(nèi)核數(shù)據(jù)包過濾框架,用于 tcpdump 等工具 |
| RST | Reset | TCP 連接重置標(biāo)志,表示拒絕連接 |
| DNAT | Destination NAT | 目標(biāo)地址轉(zhuǎn)換,用于端口映射/轉(zhuǎn)發(fā) |
| Well-Known Ports | 知名端口 | 0-1023 范圍內(nèi)的系統(tǒng)保留端口 |
| Ephemeral Ports | 臨時端口 | 49152-65535 范圍內(nèi)的動態(tài)分配端口 |
-
TCP
+關(guān)注
關(guān)注
8文章
1428瀏覽量
83629 -
端口
+關(guān)注
關(guān)注
4文章
1107瀏覽量
34001 -
網(wǎng)絡(luò)通信
+關(guān)注
關(guān)注
4文章
842瀏覽量
32618
原文標(biāo)題:「運維必備」端口連接異常排查全流程思路
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux系統(tǒng)CPU占用率100%的排查思路
科普小課堂|LCD 問題排查思路解析
ARM異常處理流程
Flink on YARN(下):常見問題與排查思路
Flink on YARN(下):常見問題與排查思路
全志A40i應(yīng)用筆記 | 3種常見的網(wǎng)卡軟件問題以及排查思路
數(shù)字芯片的設(shè)計流程思路和技術(shù)說明
端口連接異常排查全流程思路
評論