调试DNS解析与网络连接。适用于排查DNS故障、测试端口连通性、诊断防火墙规则、使用curl详细模式检查HTTP请求、配置/etc/hosts,或调试代理及证书问题。
DNS & 网络是一项面向实际任务的技能,主要用于调试 DNS 分辨率、 网络连接和 HTTP 问题;Covers dives/ nsookup、 端口测试、 防火墙规则、 卷曲诊断、 /etc/ hosts、 代理配置和证书。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
调试 DNS 解析、网络连通性及 HTTP 问题。涵盖 dig/nslookup、端口测试、防火墙规则、curl 诊断、/etc/hosts 配置、代理设置以及证书问题排查。
# 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 服务器
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(单位:秒)
# 检查 /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 — 本地 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
# 完整详细输出(含响应头、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 版本测试
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
# 列出所有规则 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
# 启用防火墙 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
# 查看状态 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。-w 格式化输出配合耗时变量,是诊断慢速 HTTP 请求的最快方式:DNS、连接、TLS、TTFB 各阶段耗时一目了然。dig 查看当前 TTL 值。/etc/hosts 修改立即生效(无 TTL、无传播延迟),可用于 DNS 切换前的域名迁移测试。nc 验证端口是否开放;再用 ss -tlnp 或 lsof -i 确认服务确实在监听该端口。mtr 比 traceroute 更适合排查丢包问题——它持续运行,并显示每一跳的丢包率。requests 及许多其他库**不会自动使用** HTTP_PROXY 环境变量。请查阅对应工具的代理文档确认支持方式。相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134万人学习
共49课时 | 82.5万人学习
最新文章