DNS & Networking

Polar Sponsor
爱发电 赞助
.NET 9.0

调试DNS解析与网络连接。适用于排查DNS故障、测试端口连通性、诊断防火墙规则、使用curl详细模式检查HTTP请求、配置/etc/hosts,或调试代理及证书问题。

DNS & 网络

功能概述

DNS & 网络是一项面向实际任务的技能,主要用于调试 DNS 分辨率、 网络连接和 HTTP 问题;Covers dives/ nsookup、 端口测试、 防火墙规则、 卷曲诊断、 /etc/ hosts、 代理配置和证书。

核心要点

  • 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。

使用与执行

从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

DNS 与网络

调试 DNS 解析、网络连通性及 HTTP 问题。涵盖 dig/nslookup、端口测试、防火墙规则、curl 诊断、/etc/hosts 配置、代理设置以及证书问题排查。

适用场景

  • DNS 域名无法解析,或解析到错误的 IP 地址
  • 出现 “Connection refused” 或 “Connection timed out” 错误
  • 诊断防火墙或安全组规则
  • HTTP 请求因不明原因失败
  • 代理配置异常
  • SSL/TLS 证书错误
  • 测试服务之间的连通性

DNS 调试

查询 DNS 记录

# A 记录(IPv4 地址)
dig example.com
dig +short example.com

# 特定类型的记录
dig example.com MX        # 邮件服务器
dig example.com CNAME     # 别名
dig example.com TXT       # 文本记录(SPF、DKIM 等)
dig example.com NS        # 域名服务器
dig example.com AAAA      # IPv6 地址
dig example.com SOA       # 起始授权记录(Start of Authority)

# 查询指定 DNS 服务器
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com

# 追踪完整解析路径
dig +trace example.com

# 反向查询(IP → 主机名)
dig -x 93.184.216.34

# nslookup(更简单,全平台可用)
nslookup example.com
nslookup example.com 8.8.8.8    # 查询指定服务器
nslookup -type=MX example.com

# host(最简洁)
host example.com
host -t MX example.com

检查 DNS 传播状态

# 查询多个公共 DNS 服务器
for dns in 8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222; do
    echo -n "$dns: "
    dig +short @"$dns" example.com
done

# 检查 TTL(生存时间)
dig example.com | grep -E '^S+s+d+s+INs+A'
# 输出数字即为 TTL(单位:秒)

本地 DNS 问题

# 检查 /etc/resolv.conf(系统使用的 DNS 服务器)
cat /etc/resolv.conf

# 检查 /etc/hosts(本地覆盖规则)
cat /etc/hosts

# 刷新 DNS 缓存
# macOS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
# Linux(systemd-resolved):
sudo systemd-resolve --flush-caches
# Windows:
ipconfig /flushdns

# 检查 systemd-resolved 是否运行中(Linux)
resolvectl status

/etc/hosts 配置模式

# /etc/hosts — 本地 DNS 覆盖(无 TTL,即时生效)

# 将域名指向 localhost(用于开发)
127.0.0.1    myapp.local
127.0.0.1    api.myapp.local

# 屏蔽某域名
0.0.0.0      ads.example.com

# 测试迁移(DNS 切换前,将域名指向新服务器)
203.0.113.50    example.com
203.0.113.50    www.example.com

# 单个 IP 对应多个主机名
192.168.1.100   db.local redis.local cache.local

端口与连通性测试

测试端口是否开放

# nc(netcat)——最可靠的工具
nc -zv example.com 443
nc -zv -w 5 example.com 80    # 设置 5 秒超时

# 批量测试多个端口
for port in 22 80 443 5432 6379; do
    nc -zv -w 2 example.com $port 2>&1
done

# /dev/tcp(bash 内置,无需额外安装)
timeout 3 bash -c 'echo > /dev/tcp/example.com/443' && echo "Open" || echo "Closed"

# curl(同时验证 HTTP 层)
curl -sI -o /dev/null -w "%{http_code}" https://example.com

# 在 Docker 容器内测试
docker exec my-container nc -zv db 5432

网络路径诊断

# traceroute(显示网络跳转路径)
traceroute example.com

# mtr(持续运行的 traceroute,带统计信息;定位丢包最有效)
mtr example.com
mtr -r -c 20 example.com   # 报告模式,发送 20 个包

# ping
ping -c 5 example.com

# 显示本地网络接口
ip addr show          # Linux
ifconfig              # macOS / 较旧 Linux

# 显示路由表
ip route show         # Linux
netstat -rn           # macOS
route -n              # Linux(较旧版本)

检查监听端口

# 查看哪些进程在监听哪些端口(Linux)
ss -tlnp
ss -tlnp | grep :8080

# macOS
lsof -i -P -n | grep LISTEN
lsof -i :8080

# 较旧 Linux
netstat -tlnp
netstat -tlnp | grep :8080

# 查看占用某端口的进程
lsof -i :3000
fuser 3000/tcp   # Linux

curl 诊断

详细请求分析

# 完整详细输出(含响应头、TLS 握手、耗时)
curl -v https://api.example.com/endpoint

# 显示各阶段耗时分解
curl -o /dev/null -s -w "
    DNS:        %{time_namelookup}s
    Connect:    %{time_connect}s
    TLS:        %{time_appconnect}s
    TTFB:       %{time_starttransfer}s
    Total:      %{time_total}s
    Status:     %{http_code}
    Size:       %{size_download} bytes
" https://api.example.com/endpoint

# 仅显示响应头
curl -sI https://api.example.com/endpoint

# 跟随重定向并显示每一步跳转
curl -sIL https://example.com

# 将域名强制解析为指定 IP(绕过 DNS)
curl --resolve example.com:443:203.0.113.50 https://example.com

# 指定网络接口发起请求
curl --interface eth1 https://example.com

常见 HTTP 问题调试

# 使用不同 HTTP 版本测试
curl --http1.1 https://example.com
curl --http2 https://example.com

# 使用特定 TLS 版本测试
curl --tlsv1.2 https://example.com
curl --tlsv1.3 https://example.com

# 忽略证书错误(仅限调试)
curl -k https://self-signed.example.com

# 自定义 Host 头(虚拟主机场景)
curl -H "Host: example.com" https://203.0.113.50/

# 测试 CORS 预检请求
curl -X OPTIONS -H "Origin: http://localhost:3000" 
     -H "Access-Control-Request-Method: POST" 
     -v https://api.example.com/endpoint

防火墙基础

iptables(Linux)

# 列出所有规则
sudo iptables -L -n -v

# 允许入站 80 端口
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 允许来自特定 IP 段的入站 SSH(22 端口)
sudo iptables -A INPUT -s 203.0.113.0/24 -p tcp --dport 22 -j ACCEPT

# 拒绝入站 3306 端口
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

# 保存规则(重启后仍生效)
sudo iptables-save > /etc/iptables/rules.v4

ufw(更简洁,Ubuntu/Debian 推荐)

# 启用防火墙
sudo ufw enable

# 允许/拒绝规则
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow from 203.0.113.0/24 to any port 22
sudo ufw deny 3306

# 查看状态
sudo ufw status verbose

# 重置所有规则
sudo ufw reset

macOS 防火墙

# 查看状态
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate

# 启用
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on

# 允许特定应用通过防火墙
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/bin/myapp

代理配置

环境变量

# 为大多数 CLI 工具设置代理
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
export NO_PROXY=localhost,127.0.0.1,.internal.example.com

# curl 专用(小写变量名同样有效)
export http_proxy=http://proxy.example.com:8080

# 带认证的代理
export HTTPS_PROXY=http://user:password@proxy.example.com:8080

通过代理测试

# curl 显式指定代理
curl -x http://proxy.example.com:8080 https://httpbin.org/ip

# SOCKS 代理
curl --socks5 localhost:1080 https://httpbin.org/ip

# 验证代理出口 IP(对比直连)
curl -x http://proxy:8080 https://httpbin.org/ip
curl https://httpbin.org/ip  # 直连对比

# 测试代理连通性
curl -v -x http://proxy:8080 https://example.com 2>&1 | grep -i "proxy|connect"

常见代理问题

# Node.js 的 fetch/undici 不遵守 HTTP_PROXY 环境变量
# 应使用 undici ProxyAgent,或 node-fetch 配合 http-proxy-agent

# Git 使用代理
git config --global http.proxy http://proxy:8080
git config --global https.proxy http://proxy:8080
# 移除代理:
git config --global --unset http.proxy

# npm 使用代理
npm config set proxy http://proxy:8080
npm config set https-proxy http://proxy:8080

# pip 使用代理
pip install --proxy http://proxy:8080 package-name

证书问题排查

# 检查服务器证书
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | 
  openssl x509 -noout -subject -issuer -dates

# 检查证书过期时间
echo | openssl s_client -connect example.com:443 2>/dev/null | 
  openssl x509 -noout -enddate

# 下载证书链
openssl s_client -showcerts -connect example.com:443 < /dev/null 2>/dev/null | 
  awk '/BEGIN CERT/,/END CERT/' > chain.pem

# 使用 CA 证书包校验证书有效性
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt server.pem

# 针对特定主机名(SNI)检查证书
openssl s_client -connect cdn.example.com:443 -servername cdn.example.com

# 常见错误:“certificate has expired”
# 检查服务器系统时间:
date
# 若系统时钟错误,证书将被判定为无效

快速诊断脚本

#!/bin/bash
# net-check.sh — 快速网络诊断脚本
TARGET="${1:?Usage: net-check.sh  [port]}"
PORT="${2:-443}"

echo "=== 网络检查:$TARGET:$PORT ==="

echo -n "DNS 解析: "
IP=$(dig +short "$TARGET" | head -1)
[[ -n "$IP" ]] && echo "$IP" || echo "FAILED"

echo -n "Ping: "
ping -c 1 -W 3 "$TARGET" > /dev/null 2>&1 && echo "OK" || echo "FAILED (可能被屏蔽)"

echo -n "端口 $PORT: "
nc -zv -w 5 "$TARGET" "$PORT" 2>&1 | grep -q "succeeded|open" && echo "OPEN" || echo "CLOSED/FILTERED"

if [[ "$PORT" == "443" || "$PORT" == "8443" ]]; then
    echo -n "TLS: "
    echo | openssl s_client -connect "$TARGET:$PORT" -servername "$TARGET" 2>/dev/null | 
      grep -q "Verify return code: 0" && echo "VALID" || echo "INVALID/ERROR"

    echo -n "证书过期时间: "
    echo | openssl s_client -connect "$TARGET:$PORT" 2>/dev/null | 
      openssl x509 -noout -enddate 2>/dev/null | sed 's/notAfter=//'
fi

echo "=== 完成 ==="

提示与技巧

  • dig +short 是命令行下最快检查 DNS 的方式。使用 @8.8.8.8 可绕过本地缓存。
  • nc -zv 是最简单的端口连通性测试。若未安装 netcat,可使用 bash 内置的 /dev/tcp。
  • curl 的 -w 格式化输出配合耗时变量,是诊断慢速 HTTP 请求的最快方式:DNS、连接、TLS、TTFB 各阶段耗时一目了然。
  • DNS 更改的生效时间取决于 TTL。在预期 DNS 变更生效前,先用 dig 查看当前 TTL 值。
  • /etc/hosts 修改立即生效(无 TTL、无传播延迟),可用于 DNS 切换前的域名迁移测试。
  • 调试 “connection refused” 时:首先用 nc 验证端口是否开放;再用 ss -tlnp 或 lsof -i 确认服务确实在监听该端口。
  • mtr 比 traceroute 更适合排查丢包问题——它持续运行,并显示每一跳的丢包率。
  • Node.js、Python requests 及许多其他库**不会自动使用** HTTP_PROXY 环境变量。请查阅对应工具的代理文档确认支持方式。

相关专题

更多
dns_probe_possible怎么解决
dns_probe_possible怎么解决

出现错误代码dns_probe_possible,这个错误提示意味着浏览器无法解析网站的域名。想了解更多错误代码的相关内容,可以阅读本专题下面的文章。

2024.01.05

2930

5

dns解析失败是什么原因
dns解析失败是什么原因

dns解析失败是网络问题、DNS服务器问题、域名拼写错误、DNS缓存问题、域名注册问题、防火墙或安全软件、域名服务器设置问题和DNS劫持等原因造成的。更多关于dns解析失败的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5359

8

dns故障如何解决
dns故障如何解决

dns故障解决办法:1、重启DNS服务器;2、检查网络连接,确保您的网络连接正常;3、清除DNS缓存;4、修改本地DNS设置;5、使用代理服务器;6、更新软件和驱动程序;7、检查系统日志;8、重装系统即可。

2023.10.20

1675

4

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

0

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134万人学习