一、cURL 命令:命令行里的「全能网络工具」
cURL 是命令行下的网络请求工具,支持 HTTP/HTTPS/FTP 等数十种协议,核心用来发送网络请求、调试接口、下载资源,是开发 / 运维必备工具(Windows 需手动安装,Linux/macOS 默认自带)。
1. 核心原理
cURL 通过建立 TCP 连接,向目标服务器发送对应协议的请求报文(比如 HTTP 的 GET/POST),接收服务器返回的响应报文,最终将结果输出到终端(或保存到文件)。
2. 常用用法(高频场景 + 案例)
(1)基础 GET 请求(获取网页 / 接口内容)
bash
# 格式:curl 目标URL
curl https://www.baidu.com # 直接获取百度首页的HTML代码
curl https://api.github.com/users/octocat # 获取GitHub用户的接口数据
(2)POST 请求(提交数据,分 2 种场景)
- 场景 1:提交表单数据 (用
-d指定表单参数)
bash
curl -d "username=test&password=123456" http://example.com/login # 模拟登录表单提交
- 场景 2:提交 JSON 数据 (用
-H指定请求头为 JSON,-d传 JSON 字符串)
bash
curl -H "Content-Type: application/json" -d '{"name":"张三","age":20}' http://example.com/api/user
(3)下载文件(替代浏览器 / 下载工具)
bash
# 直接保存到当前目录(默认文件名)
curl https://example.com/file.zip
# 指定保存的文件名(用-o)
curl -o my_file.zip https://example.com/file.zip
# 断点续传(大文件必备,用-C -)
curl -C - -o my_file.zip https://example.com/file.zip
(4)查看响应头(调试接口必备)
用-I只获取服务器的响应头(包含状态码、内容类型、缓存策略等):
bash
curl -I https://www.baidu.com
# 输出示例:HTTP/1.1 200 OK、Content-Type: text/html、Server: BWS/1.1 等
(5)忽略 SSL 证书(调试自签证书的 HTTPS 接口)
如果目标 HTTPS 网站用的是自签证书,cURL 会报错,用-k忽略证书验证:
bash
curl -k https://localhost:8443 # 访问本地自签证书的HTTPS服务
二、Ping 命令
上一篇讲过基础用法,这里补充核心原理 和更多实用场景。
1. 核心原理
Ping 基于ICMP 协议(Internet 控制报文协议) 工作:
- 本地向目标 IP 发送「ICMP 回显请求报文」(类型 8);
- 目标 IP 收到后,返回「ICMP 回显应答报文」(类型 0);
- 本地计算「请求→应答」的时间差(往返延迟),统计丢包数;
- 数据包每经过 1 个路由器,
TTL(生存时间)值减 1,当 TTL=0 时,路由器返回「超时报文」,以此判断跳数。
2. 多种进阶用法
(1)指定 TTL(测试数据包能走多远)
用-i(Windows)/-t(Linux)指定 TTL 值,测试数据包在 TTL 耗尽前能到达哪个节点:
# Windows
ping -i 3 www.baidu.com # TTL=3,数据包最多经过3个路由器
# Linux
ping -t 3 www.baidu.com
(2)禁止域名解析(加快 Ping 速度)
用-n(Windows)/-n(Linux)跳过域名→IP 的解析步骤,直接 Ping IP(适合批量测试):
ping -n 4 www.baidu.com # 只Ping4次,且不解析域名
(3)检测 IP 段存活(批量 Ping 优化版)
Windows 下用for循环 + Ping,Linux 下用fping(需安装)更高效:
bash
# Windows:批量Ping 192.168.1.1-255,只显示存活的IP
for /L %i in (1,1,255) do @ping -n 1 -w 100 192.168.1.%i | findstr "TTL="
# Linux:用fping批量Ping,显示存活IP
fping -a -g 192.168.1.1/24 # -a:只显示存活,-g:指定网段
三、iptables:Linux 防火墙的「四表五链 + 过滤逻辑」
iptables 是Linux 系统的包过滤防火墙工具 ,核心用来控制进出服务器的数据包(允许 / 禁止 / 转发),基于「四表五链」的架构工作。具体见https://blog.csdn.net/m0_74186706/article/details/156645552?fromshare=blogdetail&sharetype=blogdetail&sharerId=156645552&sharerefer=PC&sharesource=m0_74186706&sharefrom=from_link
1. 核心运作原理:四表五链
iptables 的规则是 "表→链→规则" 的层级结构:
| 表名 | 核心功能 |
|---|---|
| filter | 默认表,负责数据包过滤(允许 / 禁止),最常用 |
| nat | 负责地址转换(如内网端口映射到外网、内网 IP 伪装成公网 IP) |
| mangle | 负责修改数据包(如修改 TTL、给数据包打标记、调整 TOS) |
| raw | 负责跳过连接跟踪(减少内核资源占用,提升大流量场景转发性能) |
| 链名 | 触发时机 |
|---|---|
| PREROUTING | 数据包进入网卡后,路由判断前触发(可做 DNAT 端口映射) |
| INPUT | 数据包目标是本机,进入本机进程前触发(入站过滤核心) |
| FORWARD | 数据包目标不是本机,转发到其他机器前触发(网关 / 路由器场景) |
| OUTPUT | 本机进程发送的数据包,路由判断前触发(出站过滤) |
| POSTROUTING | 数据包离开网卡前,路由判断后触发(可做 SNAT 地址伪装) |
2. iptables 常用规则命令(按使用场景分类)
(1)基础操作:规则查看 / 清空 / 默认策略
| 命令 | 功能说明 |
|---|---|
iptables -L |
查看 filter 表所有链的规则(默认表) |
iptables -L -n |
数字形式显示 IP / 端口(避免 DNS 解析,速度更快) |
iptables -L -v |
详细信息显示(含数据包统计、规则匹配次数) |
iptables -t nat -L |
查看 nat 表所有链的规则(指定表) |
iptables -F |
清空 filter 表所有链的规则 |
iptables -F INPUT |
清空 filter 表 INPUT 链的规则(最常用) |
iptables -t nat -F PREROUTING |
清空 nat 表 PREROUTING 链的规则 |
iptables -P INPUT ACCEPT |
设置 filter 表 INPUT 链默认策略为 "允许"(默认策略兜底未匹配的数据包) |
iptables -P INPUT DROP |
设置 INPUT 链默认策略为 "拒绝"(安全基线,需先开放必要端口) |
(2)filter 表核心:端口 / IP 过滤(最常用)
① 入站规则(INPUT 链)
# 允许回环接口(lo)通信(必须保留,本机进程间通信)
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接的后续数据包(如SSH登录后的数据传输)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放指定端口(TCP):22(SSH)、80(HTTP)、443(HTTPS)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 开放指定端口(UDP):53(DNS)
iptables -A INPUT -p udp --dport 53 -j ACCEPT
# 允许指定IP/网段访问本机:仅允许192.168.1.100访问22端口
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
# 禁止指定IP访问本机:拒绝10.0.0.0/8网段所有请求
iptables -A INPUT -s 10.0.0.0/8 -j DROP
# 禁止ping本机(ICMP协议)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
② 出站规则(OUTPUT 链)
# 禁止本机访问指定IP:拒绝本机ping 8.8.8.8
iptables -A OUTPUT -p icmp --icmp-type echo-request -d 8.8.8.8 -j DROP
# 禁止本机访问指定端口:拒绝本机访问外网22端口
iptables -A OUTPUT -p tcp --dport 22 -j DROP
③ 转发规则(FORWARD 链,网关 / 路由器场景)
# 开启Linux IP转发(必须先执行,否则FORWARD链无效)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# 允许内网192.168.1.0/24网段转发到外网
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
# 允许外网回应内网的数据包转发
iptables -A FORWARD -d 192.168.1.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
(3)nat 表核心:地址转换(端口映射 / IP 伪装)
① SNAT:内网 IP 伪装成公网 IP(POSTROUTING 链)
bash
# 内网192.168.1.0/24访问外网时,源IP替换为网关公网IP(eth0为外网网卡)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 2.2.2.2
# 动态IP场景(如拨号上网):用MASQUERADE自动获取外网IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
② DNAT:外网访问映射到内网(PREROUTING 链)
# 外网访问网关8080端口 → 转发到内网192.168.1.100:80(Nginx服务)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# 外网访问网关2222端口 → 转发到内网192.168.1.200:22(SSH)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.200:22
(4)mangle 表:数据包修改(小众但实用)
bash
# 修改所有入站数据包的TTL为128(防止TTL过小被丢弃)
iptables -t mangle -A PREROUTING -j TTL --ttl-set 128
# 给192.168.1.0/24的数据包打标记(标记值100,用于后续QoS控制)
iptables -t mangle -A PREROUTING -s 192.168.1.0/24 -j MARK --set-mark 100
(5)raw 表:关闭连接跟踪(高性能场景)
bash
# 对大流量网段10.0.0.0/8关闭连接跟踪(减少内核资源占用)
iptables -t raw -A PREROUTING -s 10.0.0.0/8 -j NOTRACK
iptables -t raw -A OUTPUT -d 10.0.0.0/8 -j NOTRACK
3. 规则持久化(避免重启失效)
默认情况下,iptables 规则仅存于内存,服务器重启后会丢失,需做持久化:
bash
# CentOS/RHEL 7+
yum install -y iptables-services
systemctl enable iptables
iptables-save > /etc/sysconfig/iptables # 保存规则
systemctl restart iptables # 重启生效
# Debian/Ubuntu
apt install -y iptables-persistent
iptables-save > /etc/iptables/rules.v4 # 保存IPv4规则
netfilter-persistent reload # 重载规则
总结
- iptables 默认操作
filter表,需通过-t指定其他表(nat/mangle/raw); - 核心常用场景:
filter表做端口 / IP 过滤,nat表做端口映射 / IP 伪装; - 规则遵循 "从上到下匹配、匹配即停止",默认策略兜底,且需持久化避免重启失效。
四、iperf:Linux 网络性能测试工具(带宽 / 时延 / 丢包率)
iperf 是一款开源的网络性能测试工具,核心用于测量 TCP/UDP 网络的带宽、时延抖动、丢包率等关键指标,是运维 / 网络调试中验证网络链路质量的必备工具,支持跨平台(Linux/Windows/Mac)。
1. 核心作用与适用场景
| 核心能力 | 典型使用场景 |
|---|---|
| 测试最大 TCP 带宽 | 验证服务器 / 网关的网络吞吐能力(如云服务器公网带宽是否达标) |
| 测试 UDP 丢包率 / 时延 | 排查音视频传输、游戏等实时性业务的网络丢包 / 卡顿问题 |
| 多线程 / 多连接测试 | 模拟高并发网络请求,验证网络设备(交换机 / 路由器)的并发处理能力 |
| 双向带宽测试 | 测试服务器上行 / 下行带宽是否对称(如运营商宽带 "上下行不对等" 排查) |
2. 安装方式(Linux 主流发行版)
bash
# CentOS/RHEL 7+
yum install -y iperf3 # 推荐用iperf3(iperf2的升级版,兼容大部分场景)
# Debian/Ubuntu
apt install -y iperf3
# 验证安装
iperf3 -v # 输出版本号即安装成功
3. 核心使用逻辑:客户端 - 服务器(C/S)模式
iperf 必须以 "服务器端 + 客户端" 配合使用:
- 服务器端(Server):在被测网络的一端启动,监听指定端口,接收客户端的测试数据包;
- 客户端(Client):在被测网络的另一端启动,向服务器端发送测试数据包,最终输出测试结果。
4. 常用测试命令(按场景分类)
(1)基础测试:TCP 带宽测试(最常用)
步骤 1:服务器端启动监听(以端口 5201 为例,iperf3 默认端口)
iperf3 -s # -s 表示以服务器模式启动
# 可选:指定端口(避免端口冲突)
iperf3 -s -p 8888 # -p 指定监听端口为8888
步骤 2:客户端发起 TCP 测试(向服务器发送数据包)
# 基础命令:测试客户端→服务器的下行带宽(默认测试10秒)
iperf3 -c 192.168.1.100 # -c 指定服务器IP,此处替换为实际服务器IP
# 常用参数扩展:
iperf3 -c 192.168.1.100 -p 8888 -t 30 -P 4
# -p:指定服务器端口(需和服务器端一致)
# -t:测试时长(单位秒,默认10秒,建议设30秒以上更准确)
# -P:并发线程数(模拟多连接,如4线程,更贴近真实业务场景)
测试结果解读(核心字段)
Connecting to host 192.168.1.100, port 5201
[ 5] local 192.168.1.200 port 54321 connected to 192.168.1.100 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-10.00 sec 113 MBytes 94.7 Mbits/sec 0 1.23 MBytes
# 核心解读:
# Transfer:测试期间总传输数据量(113 MB)
# Bitrate:实际测试带宽(94.7 Mbps,接近百兆网卡上限)
# Retr:重传次数(0表示无丢包,数值越大网络越差)
(2)反向测试:TCP 上行带宽测试
默认测试是 "客户端→服务器",反向测试可测 "服务器→客户端" 的上行带宽:
# 客户端执行反向测试
iperf3 -c 192.168.1.100 -R # -R 表示反向测试(Reverse)
(3)UDP 测试:丢包率 / 时延抖动(实时业务核心)
UDP 是无连接协议,适合测试实时性业务(如视频流)的网络质量:
# 服务器端仍用:iperf3 -s
# 客户端执行UDP测试
iperf3 -c 192.168.1.100 -u -b 100M -t 30
# -u:指定UDP协议(默认TCP)
# -b:指定发送带宽(如100M,表示以100Mbps速率发送)
# -t:测试时长30秒
UDP 测试结果解读(核心字段)
[ 5] local 192.168.1.200 port 43210 connected to 192.168.1.100 port 5201
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
[ 5] 0.00-30.00 sec 358 MBytes 99.9 Mbits/sec 0.003 ms 0/252746 (0%)
# 核心解读:
# Jitter:时延抖动(0.003 ms,越小越好,实时业务要求<10ms)
# Lost/Total:丢包数/总数据包数(0%表示无丢包,>1%需排查网络)
(4)进阶测试:持续带宽监控
如需长时间监控网络带宽波动,可加 -i 参数(间隔输出结果):
# 每2秒输出一次测试结果,总时长60秒
iperf3 -c 192.168.1.100 -t 60 -i 2
5. 关键参数速查表
| 参数 | 作用 | 示例 |
|---|---|---|
-s |
服务器模式 | iperf3 -s |
-c |
客户端模式,指定服务器 IP | iperf3 -c 192.168.1.100 |
-p |
指定端口(默认 5201) | iperf3 -s -p 8888 |
-t |
测试时长(秒,默认 10) | iperf3 -c 192.168.1.100 -t 30 |
-P |
并发线程数 | iperf3 -c 192.168.1.100 -P 4 |
-u |
使用 UDP 协议(默认 TCP) | iperf3 -c 192.168.1.100 -u |
-b |
UDP 发送带宽(默认 1 Mbps) | iperf3 -c 192.168.1.100 -u -b 100M |
-R |
反向测试(服务器→客户端) | iperf3 -c 192.168.1.100 -R |
-i |
间隔输出结果(秒) | iperf3 -c 192.168.1.100 -i 2 |
6. 常见问题与注意事项
- 测试结果远低于理论带宽 :
- 排查:是否为百兆网卡(理论上限 100 Mbps)、网线是否为超五类线、服务器 CPU / 内存是否瓶颈;
- 解决:用多线程(
-P)测试,避免单线程未跑满带宽。
- UDP 丢包率高 :
- 排查:网络链路是否拥堵、路由器 / 交换机是否开启 QoS 限流、MTU 值是否过大(可尝试调整 MTU);
- 端口不通 :
- 确保服务器端防火墙开放测试端口(如 5201):
iptables -A INPUT -p tcp --dport 5201 -j ACCEPT。
- 确保服务器端防火墙开放测试端口(如 5201):
五、tcpdump
tcpdump 是 Linux/Unix 系统下的命令行抓包工具,底层基于 libpcap 库,与 Wireshark 同源,更适合无图形界面的服务器场景,核心作用是捕获、过滤、分析网络数据包,以下是其详细用法。
一、前置条件(安装)
# CentOS/RHEL 系统
yum install tcpdump -y
# Ubuntu/Debian 系统
apt install tcpdump -y
二、基本语法结构
tcpdump [选项] [过滤规则]
- 选项:控制抓包的模式(如指定网卡、保存文件、显示格式)。
- 过滤规则:筛选目标数据包,语法与 Wireshark 高度兼容。
三、核心选项
| 选项 | 作用 | 示例 |
|---|---|---|
-i |
指定抓包的网卡,any 表示所有网卡 |
tcpdump -i eth0(抓 eth0 网卡)、tcpdump -i any(抓所有网卡) |
-c |
只抓取指定数量的包,抓完自动停止 | tcpdump -c 10(只抓 10 个包) |
-w |
将抓包结果保存为 .pcap 文件,可导入 Wireshark 分析 |
tcpdump -w test.pcap(保存到 test.pcap) |
-r |
读取已保存的 .pcap 文件,进行离线分析 |
tcpdump -r test.pcap |
-n |
不解析域名,直接显示 IP 地址,提升抓包速度 | tcpdump -n |
-nn |
不解析域名 + 不解析端口(显示端口号而非服务名,如 80 而非 http) | tcpdump -nn |
-v/-vv/-vvv |
显示更详细的数据包信息,v 越多内容越全 |
tcpdump -vv |
-A |
以 ASCII 码显示数据包内容,适合分析 HTTP 等文本协议 | tcpdump -A |
-X |
以十六进制 + ASCII 双格式显示内容,适合分析二进制数据 | tcpdump -X |
四、常用过滤规则(结合实战场景)
过滤规则是 tcpdump 的核心,支持按协议、IP、端口、TCP 标志位等维度筛选,以下是高频用法。
1. 按协议过滤
# 抓 ICMP 包(对应 ping 命令的数据包)
tcpdump -nn icmp
# 抓 TCP 包(对应 HTTP、SSH 等基于 TCP 的服务)
tcpdump -nn tcp
# 抓 UDP 包(对应 DNS、DHCP 等基于 UDP 的服务)
tcpdump -nn udp
# 抓 IPv6 包(对应 IPv6 网关、IPv6 网站通信)
tcpdump -nn ip6
2. 按 IP 过滤(贴合 192.168.3.73/192.168.2.1 场景)
# 抓源 IP 是 192.168.3.73 的所有包
tcpdump -nn src 192.168.3.73
# 抓目的 IP 是 192.168.2.1 的所有包
tcpdump -nn dst 192.168.2.1
# 抓 192.168.3.73 → 192.168.2.1 的双向通信包
tcpdump -nn src 192.168.3.73 and dst 192.168.2.1
# 抓 192.168.0.0/16 整个网段的包
tcpdump -nn net 192.168.0.0/16
3. 按端口过滤
# 抓 80 端口(HTTP)的包
tcpdump -nn port 80
# 抓源端口是 8080 的包
tcpdump -nn src port 8080
# 抓目的端口是 443(HTTPS)的包
tcpdump -nn dst port 443
# 抓 1-1000 范围内的端口包
tcpdump -nn portrange 1-1000
4. 按 TCP 标志位过滤(对应 SYN、FIN 等握手 / 断开包)
# 抓 SYN 包(TCP 建立连接的请求包)
tcpdump -nn 'tcp[tcpflags] & tcp-syn != 0'
# 抓 FIN 包(TCP 断开连接的请求包)
tcpdump -nn 'tcp[tcpflags] & tcp-fin != 0'
# 抓 SYN+ACK 包(TCP 连接的应答包)
tcpdump -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
5. 组合过滤(实战高频用法)
# 抓 192.168.3.73 发往 192.168.2.1 的 ICMP 包(ping 网关场景)
tcpdump -nn src 192.168.3.73 and dst 192.168.2.1 and icmp
# 抓 192.168.3.73 的 80 端口 TCP 包,排除 SSH(22 端口)
tcpdump -nn src 192.168.3.73 and tcp and port 80 and not port 22
# 抓非本地回环(127.0.0.1)的所有包
tcpdump -nn not src 127.0.0.1 and not dst 127.0.0.1
五、实战场景示例
1. 抓取本机 ping 百度的 ICMP 包
# 抓 192.168.3.73 发出的 ICMP 包,不解析域名,抓 10 个并保存
tcpdump -nn -c 10 -w ping_baidu.pcap icmp src 192.168.3.73
2. 抓取本机与网关的 TCP 通信包
# 抓 192.168.3.73 和 192.168.2.1 的 TCP 包,显示详细信息
tcpdump -nnvv src 192.168.3.73 and dst 192.168.2.1 and tcp
3. 离线分析保存的抓包文件
# 读取 ping_baidu.pcap,过滤目的 IP 为百度的包
tcpdump -nn -r ping_baidu.pcap dst 180.101.50.242
六、注意事项
tcpdump需要 root 权限 (普通用户需加sudo),否则无法抓取网络数据包;- 过滤规则中的特殊符号(如
&、|)需用单引号' '包裹,避免被 Shell 解析; - 抓包时优先使用
-n/-nn选项,减少 DNS 解析开销,提升抓包效率; - 保存的
.pcap文件可直接拖入 Wireshark,用图形界面进行更直观的分析。
