网络工具与诊断:macOS 和 Linux 对照
从 Shell 命令手册迁出。按接口 → 路由 → DNS → TCP → HTTP 分层排查;命令均需先核对平台。
# 7. 网络工具
# 7.1 网络配置
# networksetup (macOS)
# 查询网络硬件端口
networksetup -listallhardwareports
# 查看网络服务
networksetup -listallnetworkservices
# 获取 Wi-Fi 信息
networksetup -getinfo Wi-Fi
# 设置 DNS
networksetup -setdnsservers Wi-Fi 8.8.8.8 8.8.4.4
# 查看代理端口, http
networksetup -getwebproxy Wi-Fi
# 查看代理端口, https
networksetup -getsecurewebproxy Wi-Fi
# 查看 SOCKS5 代理端口
networksetup -getsocksfirewallproxy Wi-Fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ifconfig
配置和显示网络接口(传统工具)
常用选项:
| 选项 | 说明 |
|---|---|
-a | 显示所有接口(包括未激活) |
-s(Linux net-tools) | 简短输出;不要用于 macOS 同名命令 |
up | 激活接口 |
down | 停用接口 |
netmask | 设置子网掩码 |
broadcast | 设置广播地址 |
示例:
# 显示所有接口
ifconfig
# 显示特定接口
ifconfig en0 # macOS 示例接口,先查硬件端口映射
ifconfig en1 # macOS 示例接口,不保证对应以太网
ifconfig eth0 # Linux 示例,实际可能为 enp0s… 等名称
ifconfig wlan0 # Linux Wi-Fi
# 显示简短信息
ifconfig -s # 仅 Linux net-tools
# 激活/停用接口
sudo ifconfig en0 up
sudo ifconfig en0 down
# 设置 IP 地址(临时)
sudo ifconfig en0 192.168.1.100 netmask 255.255.255.0
# 设置 MTU
sudo ifconfig en0 mtu 1500
# 查看 MAC 地址
ifconfig en0 | grep ether
# 查看 IP 地址
ifconfig en0 | grep inet
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
常见接口名称:
| 接口 | 系统 | 说明 |
|---|---|---|
en0 | macOS | 硬件网络接口,类型查 networksetup -listallhardwareports |
en1 | macOS | 硬件网络接口,编号不能固定推断类型 |
lo0 | macOS | 回环接口 |
eth0 | Linux | 以太网 |
wlan0 | Linux | 无线网卡 |
lo | Linux | 回环接口 |
# ip (Linux)
现代网络配置工具(推荐)
常用子命令:
| 命令 | 说明 |
|---|---|
ip addr | 管理 IP 地址 |
ip link | 管理网络接口 |
ip route | 管理路由表 |
ip neigh | 管理 ARP 缓存 |
ip tunnel | 管理隧道 |
ip rule | 管理路由策略 |
地址管理(ip addr):
# 显示所有接口
ip addr show
ip a
# 显示特定接口
ip addr show eth0
ip a s eth0
# 添加 IP 地址
sudo ip addr add 192.168.1.100/24 dev eth0
# 删除 IP 地址
sudo ip addr del 192.168.1.100/24 dev eth0
# 清空接口所有 IP
sudo ip addr flush dev eth0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
接口管理(ip link):
# 显示所有接口
ip link show
ip link
# 显示接口统计
ip -s link
ip -s link show eth0
# 启用/禁用接口
sudo ip link set eth0 up
sudo ip link set eth0 down
# 修改 MTU
sudo ip link set eth0 mtu 1500
# 修改 MAC 地址
sudo ip link set eth0 address 00:11:22:33:44:55
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
路由管理(ip route):
# 显示路由表
ip route show
ip r
# 显示特定网络的路由
ip route show 192.168.1.0/24
# 添加默认网关
sudo ip route add default via 192.168.1.1
# 添加静态路由
sudo ip route add 10.0.0.0/8 via 192.168.1.254
# 删除路由
sudo ip route del 10.0.0.0/8
# 查看到特定 IP 的路由
ip route get 8.8.8.8
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
邻居表管理(ip neigh):
# 显示 ARP 缓存
ip neigh show
ip n
# 添加静态 ARP 条目
sudo ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0
# 删除 ARP 条目
sudo ip neigh del 192.168.1.100 dev eth0
# 清空 ARP 缓存
sudo ip neigh flush dev eth0
2
3
4
5
6
7
8
9
10
11
12
实用技巧:
# 彩色输出
ip -c a
# JSON 格式输出
ip -j a
# 监控实时变化
ip monitor
# 查看接口统计(持续更新)
watch -n 1 'ip -s link show eth0'
# 快速查看本机 IP
ip -4 addr show scope global | grep inet
2
3
4
5
6
7
8
9
10
11
12
13
14
ifconfig vs ip
- ifconfig:传统工具,逐渐被淘汰
- ip:现代工具,功能更强大,推荐使用
- macOS 内置 ifconfig,通常无 ip;Linux 的 ip 来自 iproute2,ifconfig 来自可选 net-tools,精简系统可能没有后者
# 7.2 网络诊断
# ping
测试网络连通性
# 基本 ping
ping google.com
# 指定次数
ping -c 4 google.com
# 指定间隔
ping -i 2 google.com
# 只显示摘要
ping -c 10 -q google.com
2
3
4
5
6
7
8
9
10
11
ping vs dig
- ping:通常通过系统解析路径取得目标地址,可能受 hosts、系统缓存、分流解析影响
- dig:直接向指定/默认 DNS 服务器查询,通常不完整复现系统解析路径
- 二者都可能得到 CDN 地址;dig 不会自动绕过 CDN 找出源站。差异应检查 DNS 服务器、记录类型、缓存与查询时间
# netstat
以下选项表及主体示例为 Linux net-tools。macOS 同名参数含义不同(如 -p 是协议),不能只判断命令存在就套用;macOS 示例单列。
显示网络状态和统计信息
常用选项:
| 选项 | 说明 |
|---|---|
-a | 显示所有连接和监听端口 |
-n | 数字格式显示地址和端口 |
-t | 显示 TCP 连接 |
-u | 显示 UDP 连接 |
-l | 只显示监听端口 |
-p | 显示进程 ID 和程序名 |
-r | 显示路由表 |
-s | 显示统计信息 |
-i | 显示网络接口 |
-c | 持续输出 |
示例:
# 显示所有连接(数字格式)
netstat -an
# 显示所有 TCP 监听端口
netstat -tln
# 显示所有 TCP 连接(带进程)
sudo netstat -tanp
# 显示所有 UDP 连接
netstat -uln
# 查看路由表
netstat -r
netstat -rn # 数字格式
# 显示网络接口统计
netstat -i
# 显示协议统计
netstat -s
netstat -st # 只显示 TCP 统计
# 持续监控连接(每秒更新)
netstat -c
# 查找特定端口
netstat -an | grep :8080
# 统计各状态连接数
netstat -an | awk '/^tcp/ {print $6}' | sort | uniq -c
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
输出状态说明:
| 状态 | 说明 |
|---|---|
LISTEN | 监听中 |
ESTABLISHED | 已建立连接 |
TIME_WAIT | 等待关闭 |
CLOSE_WAIT | 等待关闭 |
SYN_SENT | 连接请求已发送 |
SYN_RECV | 收到连接请求 |
macOS 特定选项:
# 查看 TCP 详细信息(macOS;字段随系统版本变化,不保证输出进程名)
netstat -anvp tcp
# 查看每个协议的统计
netstat -s -p tcp
netstat -s -p udp
2
3
4
5
6
现代替代工具
Linux 上使用 iproute2 的 ss 命令;macOS 通常没有 ss,可用 lsof 查询进程/端口:
ss -tuln # 类似 netstat -tuln
ss -tanp # 类似 netstat -tanp
ss -s # 统计信息
2
3
# traceroute
下表为常见 Linux traceroute 实现;macOS 用 traceroute -P tcp -p 443 example.com 指定 TCP,不支持直接照搬 -T/-U。先核对本机 man traceroute。
追踪路由路径
常用选项:
| 选项 | 说明 |
|---|---|
-n | 不解析主机名(更快) |
-I | 使用 ICMP(需 root) |
-T | 使用 TCP SYN |
-U | 使用 UDP(默认) |
-p <port> | 指定端口 |
-m <hops> | 最大跳数 |
-q <queries> | 每跳查询次数 |
-w <timeout> | 等待超时时间(秒) |
示例:
# 基本追踪
traceroute google.com
# 不解析主机名(更快)
traceroute -n google.com
# 使用 ICMP(类似 Windows tracert)
sudo traceroute -I google.com
# 使用 TCP(适合防火墙环境)
sudo traceroute -T -p 443 google.com
# 设置最大跳数
traceroute -m 15 google.com
# 设置超时时间
traceroute -w 2 google.com
# 每跳只查询 1 次(更快)
traceroute -q 1 google.com
# 追踪到特定端口
traceroute -p 8080 example.com
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
输出解读:
traceroute to google.com (172.217.160.46), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.123 ms 1.089 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms 5.432 ms 5.321 ms
3 * * * # 超时或被防火墙阻止
2
3
4
- 第一列:跳数
- 第二列:主机名和 IP
- 后三列:三次探测的响应时间
* * *:超时或防火墙阻止
traceroute vs mtr
推荐使用 mtr(更强大):
brew install mtr # macOS
sudo apt install mtr # Ubuntu
sudo mtr google.com # 实时追踪
2
3
4
# 7.3 DNS 查询
# dig
DNS 查询工具(推荐)
# 基本查询
dig example.com
# 只显示答案
dig +short example.com
dig +noall +answer example.com
# 查询不同记录类型
dig A example.com # IPv4
dig AAAA example.com # IPv6
dig MX example.com # 邮件服务器
dig NS example.com # 域名服务器
dig TXT example.com # TXT 记录
# 指定 DNS 服务器
dig @8.8.8.8 example.com
dig @1.1.1.1 example.com
# 反向查询
dig -x 8.8.8.8
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# nslookup
交互式 DNS 查询
# 基本查询
nslookup example.com
# 指定 DNS 服务器
nslookup example.com 8.8.8.8
# 查询特定类型
nslookup -type=MX example.com
2
3
4
5
6
7
8
# 7.4 文件下载
# curl
强大的数据传输工具
常用选项:
| 选项 | 说明 |
|---|---|
-O | 保存为远程文件名 |
-o <file> | 保存到指定文件 |
-L | 跟随重定向 |
-I | 只获取 HTTP 头 |
-v | 显示详细信息 |
-s | 静默模式 |
-x | 使用代理 |
-u | HTTP 认证 |
-H | 添加 HTTP 头 |
-d | POST 数据 |
基本下载:
# 下载文件
curl -O https://example.com/file.zip
# 下载并重命名
curl -o myfile.zip https://example.com/file.zip
# 跟随重定向
curl -LO https://example.com/file.zip
# 断点续传
curl -C - -O https://example.com/largefile.zip
2
3
4
5
6
7
8
9
10
11
HTTP 请求:
# GET 请求
curl https://api.example.com/users
# 只获取 HTTP 头
curl -I https://example.com
# POST 请求(表单)
curl -X POST -d "key1=value1&key2=value2" https://example.com/api
# POST 请求(JSON)
curl -X POST \
-H "Content-Type: application/json" \
-d '{"name":"John","age":30}' \
https://api.example.com/users
# 添加认证头
curl -H "Authorization: Bearer token" https://api.example.com/data
# 使用代理
curl -x http://127.0.0.1:7890 https://google.com
# 测试代理是否工作
curl https://ipinfo.io # 不用代理
curl -x http://127.0.0.1:7890 https://ipinfo.io # 用代理
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
实战案例:
# 下载并执行脚本
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
# 安装 Vim 插件管理器
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# 测试 API 响应时间
curl -w "time_total: %{time_total}s\n" -o /dev/null -s https://example.com
2
3
4
5
6
7
8
9
# wget
非交互式下载工具
常用选项:
| 选项 | 说明 |
|---|---|
-O <file> | 指定文件名 |
-P <dir> | 指定目录 |
-c | 断点续传 |
-b | 后台下载 |
-q | 静默模式 |
-r | 递归下载 |
--limit-rate | 限速 |
示例:
# 基本下载
wget https://example.com/file.zip
# 断点续传
wget -c https://example.com/largefile.zip
# 后台下载
wget -b https://example.com/file.zip
# 限速下载(200KB/s)
wget --limit-rate=200k https://example.com/file.zip
# 递归下载网站
wget -r -np -k -p http://example.com
2
3
4
5
6
7
8
9
10
11
12
13
14
curl vs wget
- API 测试、单文件下载:用
curl - 镜像网站、批量下载:用
wget
# 7.5 端口扫描
# nc (netcat)
网络瑞士军刀
# 测试端口
nc -zv example.com 80
# 扫描端口范围
nc -zv example.com 20-100
# 监听端口(服务端)
nc -l 5000
# 连接服务器(客户端)
nc example.com 5000
# 文件传输
nc -l 5000 > received.txt # 接收端
nc server_ip 5000 < file.txt # 发送端
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 7.6 代理工具
# proxychains-ng
强制程序通过代理
安装:
brew install proxychains-ng # macOS
sudo apt install proxychains4 # Ubuntu
2
配置 (/etc/proxychains.conf):
dynamic_chain
proxy_dns
[ProxyList]
socks5 127.0.0.1 1080
http 127.0.0.1 8080
2
3
4
5
6
使用:
proxychains4 curl https://ipinfo.io
proxychains4 git clone https://github.com/user/repo.git
2
# 7.7 防火墙
# ufw (Ubuntu/Debian)
# 启用/禁用
sudo ufw enable
sudo ufw disable
# 查看状态
sudo ufw status
sudo ufw status verbose
# 查看带编号的列表 & 删除
sudo ufw status numbered
sudo ufw delete <id>
# 允许端口
sudo ufw allow 22/tcp
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
# 拒绝端口
sudo ufw deny 23/tcp
# 删除规则
sudo ufw delete allow 80/tcp
# 允许特定 IP
sudo ufw allow from 192.168.1.100
# 限制连接速率(防暴力破解)
sudo ufw limit ssh
# 设置默认策略
sudo ufw default deny incoming
sudo ufw default allow outgoing
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# iptables (Linux)
# 查看规则
sudo iptables -L -v -n
# 允许端口
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 拒绝 IP
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
# 清空规则
sudo iptables -F
# 保存规则
# Bash:pipefail 检查导出端失败;重定向由当前 shell 执行,需 sudo tee 写受限路径。
# 操作前另外保存当前规则到用户可写备份文件,确认 /etc/iptables 目录存在。
(set -o pipefail; sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null)
# 恢复规则
sudo iptables-restore < /etc/iptables/rules.v4
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
防火墙选择
- 新手:用
ufw(简单易用) - 高级:用
iptables(功能强大)
# 7.8 网络工具速查
# DNS 缓存刷新(macOS)
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# 查看 DNS 服务器
scutil --dns | grep 'nameserver' # macOS
cat /etc/resolv.conf # Linux
# 查看网络连接
netstat -an | grep ESTABLISHED
ss -tuln # Linux;macOS 可用 lsof -nP -iTCP -sTCP:LISTEN
2
3
4
5
6
7
8
9
10
11
# 7.9 macOS 网络状态查看
一站式查看 Mac 当前网络情况
# IP 地址
# 查看本机局域网 IP(Wi-Fi)
ipconfig getifaddr en0
# 查看所有接口的 IP
ifconfig | grep "inet " | grep -v 127.0.0.1
# 查看公网 IP
curl -s ifconfig.me
curl -s ipinfo.io # 含地理位置、运营商等详细信息
curl -s ip.sb # 简洁输出
2
3
4
5
6
7
8
9
10
# Wi-Fi 信息
# 查看当前 Wi-Fi 连接详情(SSID、信号强度 RSSI、信道、速率等)
# 先查看本机 wdutil help;权限及字段可见性随版本、隐私授权而变
sudo wdutil info
# 历史方法:airport 在新版系统已弃用或不可用,不按固定大版本保证存在
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
# 扫描附近 Wi-Fi 网络
# 不使用 sudo wdutil scan:本机帮助无 scan 子命令。
# 附近网络扫描可在“无线诊断”App 的窗口 → 扫描中查看(以本机 UI 为准)。
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s # 旧版
# 查看 Wi-Fi 网络配置
networksetup -getinfo Wi-Fi
2
3
4
5
6
7
8
9
10
11
12
13
14
# 网络服务与接口
# 查看所有网络服务(按优先级排列)
networksetup -listnetworkserviceorder
# 查看网络接口状态摘要
scutil --nwi
# 查看路由表
netstat -rn
# 查看默认网关
route -n get default | grep gateway
2
3
4
5
6
7
8
9
10
11
# DNS 与代理
# 查看 DNS 配置
scutil --dns | grep 'nameserver'
networksetup -getdnsservers Wi-Fi
# 查看代理设置
scutil --proxy # scutil(System Configuration Utility)
networksetup -getwebproxy Wi-Fi # HTTP 代理
networksetup -getsecurewebproxy Wi-Fi # HTTPS 代理
networksetup -getsocksfirewallproxy Wi-Fi # SOCKS 代理
2
3
4
5
6
7
8
9
# 连接与流量监控
# 查看当前活跃连接
netstat -an | grep ESTABLISHED
# 查看所有 TCP 监听端口
lsof -nP -iTCP -sTCP:LISTEN
# 实时监控网络流量(macOS 内置,按 q 退出)
nettop
# 只看指定进程的网络流量
nettop -p 1234 # 先 pgrep -fl 查进程,选定单个 PID;不要把多行 PID 直接拼到 -p 后
# 查看网络接口流量统计
netstat -ib
2
3
4
5
6
7
8
9
10
11
12
13
14
# 网络质量测试
# 网络质量测试(macOS 12 Monterey+,类似 speedtest)
networkQuality
networkQuality -v # 详细输出(含上下行带宽、RTT、RPM)
networkQuality -s # 顺序测试上下行;与默认并发测试测量场景不同,不能一概称更准确
networkQuality -I en0 # 指定接口测试
2
3
4
5
# 防火墙状态
# 查看应用防火墙状态
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
# 查看防火墙详细设置
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps
2
3
4
5
# 一键网络诊断脚本
#!/bin/bash
# mac_network_check.sh - macOS 网络状态快速诊断
echo "===== 网络接口 ====="
ifconfig | grep -E "^[a-z]|inet " | grep -v "127.0.0.1"
echo ""
echo "===== 局域网 IP ====="
ipconfig getifaddr "${NET_INTERFACE:-en0}" 2>/dev/null || echo "指定接口未取得 IPv4,不能据此判断 Wi-Fi 连接状态"
echo ""
echo "===== 公网 IP ====="
curl -s --connect-timeout 3 ifconfig.me || echo "无法获取公网 IP"
echo ""
echo "===== 默认网关 ====="
route -n get default 2>/dev/null | grep gateway
echo ""
echo "===== DNS 服务器 ====="
scutil --dns | grep 'nameserver' | head -5
echo ""
echo "===== 网络连通性 ====="
# macOS -W 单位毫秒;Linux 常见实现按秒,不能直接复制同一数值。
ping -c 2 -W 2000 8.8.8.8 > /dev/null 2>&1 && echo "本次 ICMP 探测成功" || echo "本次 ICMP 探测失败;继续检查 DNS、TCP 和 HTTP"
echo ""
echo "===== 活跃连接数 ====="
netstat -an | grep ESTABLISHED | wc -l | tr -d ' '
echo ""
echo "===== 监听端口 ====="
lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | awk 'NR>1 {print $1, $9}' | sort -u
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 分层排查与平台边界
| 层次 | macOS | Linux | 结果能说明什么 |
|---|---|---|---|
| 接口 | networksetup -listallhardwareports、ifconfig | ip addr、ip link | 先确认实际接口,en0/en1、eth0/wlan0 均仅为示例 |
| 路由 | route -n get default | ip route、ip route get 目标IP | 默认路由存在不等于目的服务可访问 |
| DNS | scutil --dns、dscacheutil -q host -a name example.com;另用 dig | 系统解析器查询与 dig 对照 | 将系统解析和直接 DNS 查询分开验证 |
| ICMP | ping -c 2 -W 2000 目标IP | 常见 iputils:ping -c 2 -W 2 目标IP | 不响应可能是策略禁 ICMP,不能单凭一次失败判定断网 |
| TCP | nc -zv example.com 443 | nc -zv example.com 443(实现参数需核对) | 建连成功不代表 TLS/HTTP 正常 |
| HTTP/TLS | curl -v --connect-timeout 5 --max-time 15 https://example.com/ | 同左 | 看证书、状态码、响应;检查系统与程序各自代理设置 |
示例中的公网服务和私网地址是说明用途,按实际受控目标替换;只读诊断与修改配置分开运行。iptables/ufw 更改需保留现有规则与远程管理连接的恢复途径;sudo 不会提升右侧 shell 重定向权限。保存规则前可在 Bash 中执行 sudo iptables-save > "$HOME/iptables-before.rules" 并检查退出码;恢复时同样区分读取权限和命令权限。不要盲目运行“清空规则”作为排错步骤。
平台依据以本机 man ping、man netstat、man traceroute、man networksetup、wdutil help 为准;Linux 参数参考 iproute2 项目 (opens new window)、iputils ping (opens new window)。