【第6章】网络管理
网络排障从下往上走:ping 测连通、ifconfig/netstat 看本机网卡与连接、dig/host/nslookup 查 DNS 解析、ssh/telnet 验端口与登录,yum 则管软件包。
dig
dig - 功能最全的 DNS 查询与排障工具,输出结构化、适合脚本
常用命令
dig example.com查询 A 记录,输出完整应答(QUESTION/ANSWER/AUTHORITY 各段)dig +short example.com只输出解析结果 IP,最常用、适合脚本取值dig example.com MX查询 MX 记录(同理可查 AAAA / NS / TXT / CNAME / SOA)dig @8.8.8.8 example.com指定 DNS 服务器查询,对比不同 DNS 的解析结果dig -x 93.184.216.34反向解析:IP 查 PTR 记录dig +trace example.com从根服务器开始逐级迭代查询,排查解析链路在哪一层出问题dig example.com +noall +answer只显示 ANSWER 段,输出干净dig +short example.com @8.8.8.8 @114.114.114.114结合多次查询对比国内外 DNS 污染/分区解析dig example.com ANY +tcp用 TCP 查询(应答过大被截断出现flags: tc时改用)dig +dnssec example.com查询时请求 DNSSEC 签名记录watch -n1 'dig +short example.com'持续观察解析变化(切换 DNS 后验证生效)
语法格式
dig [@server] [name] [type] [class] [+query-option...] [-option...]
OPTIONS
@server指定要查询的 DNS 服务器(IP 或域名)-x <ip>反向解析 PTR 记录的简写-p <端口>指定 DNS 服务器端口(默认 53)+short精简输出,只给结果+trace从根开始迭代跟踪整条解析链+noall +answer关闭所有段落输出后只开 ANSWER 段+tcp使用 TCP 而非 UDP 查询+time=<秒>/+tries=<次>设置超时与重试次数+norecurse关闭递归标志,直接问权威服务器
备注
- 部分精简系统默认不带 dig:CentOS/RHEL 装
bind-utils,Debian/Ubuntu 装dnsutils;macOS 自带 - 与 nslookup 一样,dig 只查 DNS、不读
/etc/hosts - ANSWER 段中域名后的数字是剩余 TTL(秒),排查「改了解析为什么没生效」时先看它
host
host - 轻量级 DNS 查询工具,输出简洁,适合快速确认解析
常用命令
host example.com查询域名的 A/AAAA/MX 记录,一行一条结果host example.com 8.8.8.8指定 DNS 服务器查询host -t mx example.com查询 MX 记录(同理-t txt/-t ns/-t cname/-t soa)host 93.184.216.34反向解析:IP 查对应域名(PTR)host -a example.com查询 ANY 类型并显示完整应答报文(等价-v -t ANY)host -v example.com详细模式,输出类似 dig 的分段报文host -C example.com对比各权威 NS 上的 SOA 记录是否一致(排查主从同步)host -W 2 example.com设置 2 秒超时,避免脚本里长时间卡住
语法格式
host [-aCdlriTvw] [-t type] [-W time] [-R number] name [server]
OPTIONS
-t <type>指定查询记录类型:A / AAAA / MX / NS / TXT / CNAME / SOA / PTR / ANY-a等价于-v -t ANY,输出全部记录-v详细输出模式-C检查各权威名称服务器的 SOA 一致性-4/-6强制仅用 IPv4 / IPv6 传输查询-T使用 TCP 查询(默认 UDP)-W <秒>等待应答的超时时间-R <次数>UDP 查询重试次数-r关闭递归查询
备注
- host 与 dig、nslookup 同属 bind-utils(Debian 系为 dnsutils)套件:快速看结果用 host,深度排障用 dig
- 同样只查 DNS,不读
/etc/hosts;要验证系统实际解析顺序(含 hosts)可用getent hosts example.com
ifconfig
ifconfig - 查看与配置网络接口(IP 地址、掩码、启停等)
常用命令
ifconfig查看所有已启用(UP)网络接口的信息ifconfig -a查看所有接口,包括未启用的ifconfig eth0只查看 eth0 接口的信息ifconfig eth0 up启用 eth0 接口ifconfig eth0 down禁用 eth0 接口ifconfig eth0 192.168.1.100 netmask 255.255.255.0为 eth0 临时设置 IP 与子网掩码(重启失效)ifconfig eth0 mtu 1400修改接口 MTUifconfig eth0 hw ether 00:11:22:33:44:55修改接口 MAC 地址(需先 down 掉接口)ifconfig eth0:1 192.168.1.101给 eth0 添加一个别名子接口(虚拟 IP)ifconfig eth0 promisc开启混杂模式(抓包场景常用,-promisc关闭)
语法格式
ifconfig [-a] [-v] [-s] [interface]
ifconfig interface [address [netmask mask]] [options...]
OPTIONS
-a显示所有接口,包括 DOWN 状态的-s显示简短的统计列表(类似netstat -i)-v详细模式,显示更多错误信息up启用指定接口down禁用指定接口netmask <mask>设置子网掩码mtu <n>设置最大传输单元hw ether <mac>设置硬件 MAC 地址promisc / -promisc开启 / 关闭混杂模式
备注
- Linux 上 ifconfig 属于 net-tools 包,已被 iproute2 取代:查看用
ip addr、启停用ip link set eth0 up/down、配 IP 用ip addr add 192.168.1.100/24 dev eth0;不少精简发行版(如 CentOS 7+ minimal、部分容器镜像)默认不带 ifconfig - macOS/BSD 的 ifconfig 参数风格不同:如
ifconfig en0 inet 192.168.1.100 netmask 255.255.255.0,且没有-s统计模式;macOS 查看 Wi-Fi 接口通常是en0 - ifconfig 修改的配置都是临时的,重启即失效;持久化需写网络配置文件(如 netplan、NetworkManager、/etc/sysconfig/network-scripts/)
netstat
netstat - 查看网络连接、监听端口、路由表与网络接口统计
常用命令
netstat -lnpt查看正在监听的 TCP 端口及对应进程(Linux,需 root 看全)netstat -an显示所有连接与监听端口(数字形式,不做域名反解,速度快)netstat -ant只看 TCP 连接(Linux;macOS 写法netstat -anp tcp)netstat -anv | grep 8080查找占用 8080 端口的连接(macOS 加 -v 显示 pid)netstat -rn查看路由表(排查网关、静态路由问题)netstat -i查看网络接口的收发包统计netstat -s按协议汇总统计(TCP 重传、UDP 丢包等)netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c统计各连接状态数量(排查 TIME_WAIT / CLOSE_WAIT 堆积)
语法格式
netstat [-anvlrsi] [-p protocol|program]
OPTIONS
-a显示所有 socket(含监听中的)-n以数字形式显示地址和端口,不做反向解析-l只显示监听中的端口(Linux)-pLinux:显示占用的进程 pid/name;macOS:-p tcp/udp指定协议-t/-u只看 TCP / UDP(Linux)-r显示路由表-i显示网络接口统计-s按协议显示汇总统计
备注
- macOS 与 Linux 参数差异很大:Linux 查端口占用用
netstat -lnpt,macOS 用netstat -anv | grep <port>或直接lsof -i :<port> - Linux 新系统推荐用
ss(参数风格相同,速度更快);查进程占用端口lsof -i通常更直接 - macOS 本机还可用
nettop -P -m tcp实时查看各进程的网络流量
nslookup
nslookup - 查询 DNS 域名解析记录的交互式/命令行工具
常用命令
nslookup example.com查询域名的 A/AAAA 记录(走系统默认 DNS)nslookup example.com 8.8.8.8指定用 8.8.8.8 作为 DNS 服务器查询(排查「是不是本地 DNS 的问题」)nslookup -type=mx example.com查询邮件交换 MX 记录nslookup -type=txt example.com查询 TXT 记录(SPF、域名验证等)nslookup -type=ns example.com查询权威名称服务器 NS 记录nslookup -type=cname www.example.com查询 CNAME 别名记录nslookup 93.184.216.34反向解析:由 IP 查 PTR 记录对应的域名nslookup -debug example.com输出完整应答报文,查看 TTL 等细节nslookup直接回车进入交互模式,可用server 8.8.8.8、set type=mx连续查询,exit退出
语法格式
nslookup [-option ...] [name | -] [server]
OPTIONS
-type=<记录类型>指定查询类型:A / AAAA / MX / NS / TXT / CNAME / SOA / PTR / ANY-query=<记录类型>同-type=-debug显示详细的请求与应答报文-port=<端口>指定 DNS 服务器端口(默认 53)-timeout=<秒>设置查询超时时间-retry=<次数>设置重试次数-vc强制使用 TCP 查询(默认 UDP)-norecurse关闭递归查询,只问服务器自己知道的答案
备注
- 结果中的
Non-authoritative answer表示答案来自缓存/递归服务器而非权威服务器,属正常现象 - nslookup 不读取
/etc/hosts,只查 DNS——用它验证「hosts 绑定为什么不生效」会得出错误结论 - 脚本和精细排障更推荐
dig(输出结构化、可+short);nslookup 胜在 Linux/macOS/Windows 三平台都自带
ping
ping - 发送 ICMP ECHO 请求测试主机连通性、延迟与丢包
常用命令
ping example.com持续 ping 目标(Linux 默认不停,Ctrl+C 结束并输出丢包率/延迟统计)ping -c 4 example.com只发 4 个包后自动停止并给出统计(脚本常用)ping -c 100 -i 0.2 10.0.0.5快速发 100 个包、间隔 0.2 秒,测丢包率ping -c 4 -W 1 10.0.0.5每个包最多等 1 秒应答,避免不通时长时间等待ping -s 1472 -M do 10.0.0.5指定包大小且禁止分片,探测路径 MTU(1472+28=1500)ping -I eth1 10.0.0.5指定从 eth1 网卡/源地址发包(多网卡排障)ping -4 example.com/ping -6 example.com强制走 IPv4 / IPv6ping -f 10.0.0.5flood 模式极限压测链路(需 root,慎用)ping -D -c 10 10.0.0.5每行带 Unix 时间戳,方便和日志对时ping -a 10.0.0.5收到应答时响铃(等机器重启上线时挂着)
语法格式
ping [options] destination
OPTIONS
-c <count>发送指定数量的包后停止-i <秒>发包间隔(默认 1 秒,小于 0.2 需 root)-W <秒>单个包等待应答的超时时间-w <秒>整个 ping 过程的总时限-s <字节>ICMP 数据部分大小(默认 56,加头共 64 字节显示)-I <接口|地址>指定发包的网卡或源 IP-t <ttl>设置 TTL 值-q安静模式,只输出最后统计-D每行输出前加时间戳
备注
- macOS/BSD 参数不同:超时是
-t(Linux 的-t是 TTL)、间隔统计用-i;macOS 无-w/-W同义项,注意脚本移植 - ping 不通不代表主机宕机:很多服务器/防火墙禁 ICMP,此时应改用
nc -zv或 telnet 测具体 TCP 端口 - 结果里重点看三项:丢包率(packet loss)、平均延迟(avg)、抖动(mdev/stddev);跨公网 mdev 大说明链路不稳
ssh
ssh - 加密远程登录与远程执行命令,兼具端口转发/隧道能力
常用命令
ssh [email protected]以 user 身份登录远程主机ssh -p 2222 user@host指定非默认端口登录ssh -i ~/.ssh/id_ed25519 user@host指定私钥登录(配合ssh-keygen -t ed25519生成、ssh-copy-id user@host上传公钥后即可免密)ssh user@host 'df -h && uptime'不进交互 shell,直接在远端执行命令并返回输出ssh -L 13306:127.0.0.1:3306 user@host本地端口转发:访问本机 13306 即等于访问远端的 3306(打洞连内网数据库)ssh -R 8080:127.0.0.1:80 user@host远程端口转发:把本机 80 暴露到远端的 8080(内网穿透)ssh -D 1080 user@host动态转发:在本地开一个 SOCKS5 代理,流量经远端出去ssh -J jumpuser@jumphost user@target经跳板机一跳直达目标机(多级可逗号串联)ssh -N -f -L 13306:127.0.0.1:3306 user@host只做隧道不开 shell,并放入后台常驻ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 user@host首次连接不询问指纹且 5 秒超时(自动化脚本常用)ssh -v user@host调试模式,排查连不上/密钥不生效(-vvv更详细)ssh -t user@host 'sudo systemctl restart nginx'强制分配终端,供远端 sudo 交互输密码
语法格式
ssh [-46AfgNnqTtvXY] [-i identity_file] [-J destination] [-L address]
[-o option] [-p port] [-R address] [-D address] destination [command]
OPTIONS
-p <port>指定远程端口(默认 22)-i <file>指定私钥文件-J <jump>指定跳板机(ProxyJump)-L <本地端口:目标主机:目标端口>本地端口转发-R <远端端口:目标主机:目标端口>远程端口转发-D <端口>动态 SOCKS5 代理转发-N不执行远程命令,纯做端口转发-f认证完成后转入后台运行-t强制分配伪终端(远端跑交互程序时用)-o <option>以key=value形式传配置项(如ConnectTimeout=5)-v详细调试输出,可叠加至-vvv
备注
- 常用主机建议写进
~/.ssh/config(Host/HostName/User/Port/IdentityFile/ProxyJump),之后ssh 别名一键直达;私钥权限必须 600、~/.ssh目录 700,否则会被拒绝使用 - 长连接易断可在 config 加
ServerAliveInterval 60保活;复用连接加ControlMaster auto可让第二次连接秒开 - 远端主机重装后指纹变化会报
REMOTE HOST IDENTIFICATION HAS CHANGED,用ssh-keygen -R host清掉旧记录再连
telnet
telnet - 明文远程登录协议客户端,如今主要用来测试 TCP 端口连通性
常用命令
telnet 192.168.1.10 3306测试目标主机 3306 端口是否可达(最高频用法:能进入空白屏/看到 banner 即端口通)telnet example.com 80连上 Web 端口后可手工发送GET / HTTP/1.1+Host: example.com+ 两次回车,裸测 HTTPtelnet smtp.example.com 25连接 SMTP 手工发EHLO,排查邮件服务telnet 10.0.0.5 6379连接 Redis 后可直接敲PING验证服务存活telnet -4 host 22强制走 IPv4 连接(-6强制 IPv6)echo quit | telnet 192.168.1.10 3306非交互式探测端口,适合脚本(配合超时:timeout 3 telnet ...)- 连接后按
Ctrl+]回到 telnet 提示符,输入quit退出(连接卡死时的正确退出方式)
语法格式
telnet [-4] [-6] [-a] [-l user] [-e escapechar] [host [port]]
OPTIONS
-4强制使用 IPv4-6强制使用 IPv6-a尝试自动登录(发送当前用户名)-l <user>指定登录用户名-e <char>设置逃逸字符(默认Ctrl+])-E禁用逃逸字符-b <addr>指定本地源地址-d开启调试输出
备注
- telnet 协议全程明文(含密码),远程登录早已被 ssh 全面取代,仅保留端口探测用途
- 很多新系统默认不装 telnet:更现代的替代是
nc -zv host port(netcat 探测)或curl -v telnet://host:port;纯 bash 也可timeout 3 bash -c 'echo > /dev/tcp/host/port' && echo open - 「端口通但服务不响应」和「端口不通」在 telnet 表现不同:立即
Connection refused是端口没监听,长时间卡住多半是防火墙丢包
yum
yum - RHEL/CentOS 系发行版的包管理器,自动处理依赖的安装、升级与卸载
常用命令
yum install nginx安装软件包(自动解决依赖,-y跳过确认)yum remove nginx卸载软件包yum update升级所有可更新的包;yum update nginx只升级指定包yum search keyword按关键词搜索包名与描述yum info nginx查看包的版本、大小、仓库来源等详细信息yum list installed列出已安装的包;yum list available nginx*列出仓库中可安装的包yum provides */nslookup反查某个文件/命令由哪个包提供(装缺失命令时非常好用)yum clean all && yum makecache清空并重建本地缓存(换源后必做)yum repolist查看当前启用的仓库列表yum history查看事务历史;yum history undo <ID>回滚某次安装/升级yum groupinstall "Development Tools"安装软件包组(如编译工具链)yum localinstall ./xxx.rpm安装本地 rpm 包并自动从仓库解决依赖
语法格式
yum [options] <command> [package ...]
OPTIONS
-y所有交互提问自动回答 yes-q静默模式,减少输出-v详细模式--enablerepo=<repo>临时启用指定仓库(如 epel)--disablerepo=<repo>临时禁用指定仓库--nogpgcheck跳过 GPG 签名校验(内网自建源常用,注意安全)--downloadonly --downloaddir=<dir>只下载 rpm 不安装(离线部署场景)--exclude=<package>更新时排除指定包(如--exclude=kernel*)
备注
- RHEL/CentOS 8+ 及 Fedora 已用 dnf 取代 yum,
yum只是 dnf 的软链接,常用子命令完全兼容 - 仓库配置在
/etc/yum.repos.d/*.repo;第三方常用 EPEL 源(yum install epel-release) - CentOS 7/8 已 EOL,官方源下线后需将 repo 中的 mirrorlist 换成 vault.centos.org 或国内镜像归档地址,否则 yum 全部报 404