Skip to content

网络命令

网络配置

ifconfig - 网络接口配置

bash
ifconfig                        # 显示所有接口
ifconfig en0                    # 显示指定接口
ifconfig en0 up                 # 启用接口
ifconfig en0 down               # 禁用接口
ifconfig en0 192.168.1.100      # 设置 IP
ifconfig en0 192.168.1.100 netmask 255.255.255.0
ifconfig en0 inet6 add 2001:db8::1/64  # 添加 IPv6

networksetup - 网络设置

bash
networksetup -listallnetworkservices    # 列出网络服务
networksetup -listnetworkserviceorder   # 显示服务顺序
networksetup -getinfo "Wi-Fi"           # 获取服务信息
networksetup -setmanual "Wi-Fi" 192.168.1.100 255.255.255.0 192.168.1.1
networksetup -setdhcp "Wi-Fi"           # 设置 DHCP
networksetup -setdnsservers "Wi-Fi" 8.8.8.8 8.8.4.4
networksetup -setsearchdomains "Wi-Fi" example.com
networksetup -setairportpower en0 on    # 开启 Wi-Fi
networksetup -setairportpower en0 off   # 关闭 Wi-Fi
networksetup -listpreferredwirelessnetworks en0  # 列出已保存的 Wi-Fi
networksetup -removepreferredwirelessnetwork en0 "SSID"  # 删除 Wi-Fi

scutil - 系统配置

bash
scutil --dns                    # 查看 DNS 配置
scutil --proxy                  # 查看代理配置
scutil --nwi                    # 网络接口信息
scutil --host hostname          # 解析主机名
scutil --get LocalHostName      # 获取本地主机名
scutil --set LocalHostName newname  # 设置本地主机名
scutil --get ComputerName       # 获取计算机名
scutil --set ComputerName "New Name"  # 设置计算机名

网络诊断

ping - 测试连通性

bash
ping 8.8.8.8                    # 测试连通性
ping -c 5 8.8.8.8               # 发送5个包
ping -i 2 8.8.8.8               # 间隔2秒
ping -s 1000 8.8.8.8            # 指定包大小
ping -t 64 8.8.8.8              # 指定 TTL
ping -W 5000 8.8.8.8            # 超时时间5秒
ping -q 8.8.8.8                 # 安静模式
ping6 2001:db8::1               # IPv6

traceroute - 路由追踪

bash
traceroute 8.8.8.8              # 追踪路由
traceroute -n 8.8.8.8           # 不解析主机名
traceroute -I 8.8.8.8           # 使用 ICMP
traceroute -T 8.8.8.8           # 使用 TCP
traceroute -p 80 8.8.8.8        # 指定端口
traceroute -m 30 8.8.8.8        # 最大跳数
traceroute6 2001:db8::1         # IPv6

mtr - 网络诊断工具

bash
mtr 8.8.8.8                     # 实时追踪
mtr -r 8.8.8.8                  # 报告模式
mtr -c 10 8.8.8.8               # 发送10个包
mtr -n 8.8.8.8                  # 不解析主机名
mtr -T 8.8.8.8                  # 使用 TCP
mtr -u 8.8.8.8                  # 使用 UDP
mtr -p 80 8.8.8.8               # 指定端口

netstat - 网络统计

bash
netstat                         # 显示所有连接
netstat -a                      # 显示所有连接
netstat -n                      # 数字形式显示
netstat -p tcp                  # 只显示 TCP
netstat -p udp                  # 只显示 UDP
netstat -r                      # 显示路由表
netstat -s                      # 显示统计
netstat -i                      # 接口统计
netstat -an                     # 组合使用
netstat -an | grep LISTEN       # 查找监听端口
netstat -an | grep ESTABLISHED  # 查找已建立连接

lsof - 网络连接

bash
lsof -i                         # 所有网络连接
lsof -i :80                     # 指定端口
lsof -i TCP                     # TCP 连接
lsof -i UDP                     # UDP 连接
lsof -i :80 -i :443             # 多个端口
lsof -i @192.168.1.1            # 指定地址
lsof -i @192.168.1.1:80         # 指定地址和端口
lsof -nP -iTCP -sTCP:LISTEN     # 监听端口

nc - 网络工具

端口扫描

bash
nc -zv 192.168.1.1 80           # 扫描单个端口
nc -zv 192.168.1.1 20-80        # 扫描端口范围
nc -zv 192.168.1.1 80 443 8080  # 扫描多个端口
nc -zvn 192.168.1.1 80          # 不解析 DNS

传输数据

bash
nc -l 1234                      # 监听端口(服务端)
nc 192.168.1.1 1234             # 连接端口(客户端)

nc -l 1234 > received.txt       # 接收文件(服务端)
nc 192.168.1.1 1234 < file.txt  # 发送文件(客户端)

nc -l 1234 | tar xzf -          # 接收目录(服务端)
tar czf - dir/ | nc 192.168.1.1 1234  # 发送目录(客户端)

其他用法

bash
nc -u 192.168.1.1 1234          # UDP 模式
nc -l 1234 -k                   # 保持监听
echo "GET / HTTP/1.0\r\n\r\n" | nc 192.168.1.1 80  # HTTP 请求

curl - 数据传输

bash
curl https://example.com        # GET 请求
curl -I https://example.com     # 只获取头部
curl -i https://example.com     # 包含头部
curl -v https://example.com     # 详细输出
curl -X POST https://example.com    # POST 请求
curl -d "name=value" https://example.com
curl -d @data.json https://example.com
curl -H "Content-Type: application/json" https://example.com
curl -u user:pass https://example.com
curl -b "cookie=value" https://example.com
curl -c cookies.txt https://example.com
curl -L https://example.com     # 跟随重定向
curl -o file.txt https://example.com/file
curl -O https://example.com/file.txt
curl -C - -O https://example.com/file   # 断点续传
curl -x http://proxy:8080 https://example.com
curl --connect-timeout 10 https://example.com
curl -k https://example.com     # 忽略证书

wget - 文件下载

bash
wget https://example.com/file.txt
wget -O newname.txt https://example.com/file.txt
wget -c https://example.com/file.txt  # 断点续传
wget -r https://example.com/      # 递归下载
wget -np -r https://example.com/  # 不递归父目录
wget -nd -r https://example.com/  # 不创建目录
wget -A "*.jpg" -r https://example.com/
wget --limit-rate=100k https://example.com/file.txt
wget -t 5 https://example.com/file.txt
wget -T 30 https://example.com/file.txt

DNS 查询

dig - DNS 查询工具

bash
dig example.com                 # 查询 A 记录
dig @8.8.8.8 example.com        # 指定 DNS 服务器
dig example.com A               # 指定记录类型
dig example.com MX              # 查询 MX 记录
dig example.com NS              # 查询 NS 记录
dig example.com TXT             # 查询 TXT 记录
dig example.com CNAME           # 查询 CNAME 记录
dig -x 192.168.1.1              # 反向查询
dig +short example.com          # 简短输出
dig +trace example.com          # 追踪查询过程
dig +noall +answer example.com  # 只显示答案

nslookup - DNS 查询

bash
nslookup example.com            # 查询域名
nslookup example.com 8.8.8.8    # 指定 DNS 服务器
nslookup -type=MX example.com   # 指定记录类型
nslookup -type=any example.com  # 所有记录
nslookup 192.168.1.1            # 反向查询

host - DNS 查询

bash
host example.com                # 查询域名
host -t A example.com           # A 记录
host -t MX example.com          # MX 记录
host -t NS example.com          # NS 记录
host -t TXT example.com         # TXT 记录
host 192.168.1.1                # 反向查询
host example.com 8.8.8.8        # 指定 DNS 服务器

dscacheutil - DNS 缓存

bash
dscacheutil -q host -a name example.com  # 查询
dscacheutil -flushcache         # 清除 DNS 缓存

防火墙

pfctl - PF 防火墙

bash
sudo pfctl -s all               # 查看所有规则
sudo pfctl -s rules             # 查看规则
sudo pfctl -s nat               # 查看 NAT
sudo pfctl -s state             # 查看状态
sudo pfctl -e                   # 启用防火墙
sudo pfctl -d                   # 禁用防火墙
sudo pfctl -f /etc/pf.conf      # 加载配置
sudo pfctl -nf /etc/pf.conf     # 检查配置
sudo pfctl -F all               # 清除所有规则

/etc/pf.conf 配置示例

scrub in all

block in all
pass out all keep state

pass in inet proto tcp from any to any port 22
pass in inet proto tcp from any to any port 80
pass in inet proto tcp from any to any port 443

applicationfirewall - 应用防火墙

bash
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /Applications/app.app
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --remove /Applications/app.app

网络抓包

tcpdump - 抓包工具

bash
tcpdump                         # 抓取所有包
tcpdump -i en0                  # 指定接口
tcpdump -n                      # 不解析
tcpdump -nn                     # 不解析端口
tcpdump -c 100                  # 抓取100个包
tcpdump -w capture.pcap         # 保存到文件
tcpdump -r capture.pcap         # 读取文件
tcpdump host 192.168.1.1        # 指定主机
tcpdump src 192.168.1.1         # 源主机
tcpdump dst 192.168.1.1         # 目标主机
tcpdump port 80                 # 指定端口
tcpdump tcp port 80             # TCP 端口
tcpdump udp port 53             # UDP 端口
tcpdump -i en0 tcp port 80 -w http.pcap
tcpdump -A                      # ASCII 输出
tcpdump -X                      # 十六进制和 ASCII
tcpdump -v                      # 详细输出

其他网络命令

hostname - 主机名

bash
hostname                        # 显示主机名
hostname -f                     # FQDN
hostname -s                     # 短主机名
scutil --set HostName newname   # 设置主机名

arp - ARP 表

bash
arp -a                          # 显示 ARP 表
arp -n                          # 不解析
arp -d 192.168.1.1              # 删除条目
arp -s 192.168.1.1 00:11:22:33:44:55  # 添加条目
arp -d -a                       # 清除所有

route - 路由表

bash
netstat -r                      # 显示路由表
netstat -rn                     # 不解析
route -n get default            # 获取默认路由
sudo route add default 192.168.1.1  # 添加默认网关
sudo route delete default       # 删除默认网关
sudo route add -net 10.0.0.0/8 192.168.1.1  # 添加路由
sudo route delete -net 10.0.0.0/8  # 删除路由

airport - Wi-Fi 工具

bash
airport -I                      # 当前 Wi-Fi 信息
airport -s                      # 扫描 Wi-Fi
airport -z                      # 断开 Wi-Fi
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I

networkQuality - 网络质量测试

bash
networkQuality                  # 测试网络质量
networkQuality -s               # 简单测试
networkQuality -v               # 详细输出

网络故障排查

常用诊断流程

bash
ifconfig                        # 检查 IP 配置
ping 127.0.0.1                  # 测试本地回环
ping 192.168.1.1                # 测试网关
ping 8.8.8.8                    # 测试外网 IP
ping google.com                 # 测试 DNS
traceroute 8.8.8.8              # 追踪路由
nslookup google.com             # 检查 DNS
netstat -an                     # 检查端口

重置网络

bash
sudo ifconfig en0 down && sudo ifconfig en0 up
sudo route flush
sudo killall -HUP mDNSResponder  # 重启 DNS 服务
dscacheutil -flushcache          # 清除 DNS 缓存

下一步学习