curl、ping、iptables、iperf、tcpdump解析

一、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 控制报文协议) 工作:

  1. 本地向目标 IP 发送「ICMP 回显请求报文」(类型 8);
  2. 目标 IP 收到后,返回「ICMP 回显应答报文」(类型 0);
  3. 本地计算「请求→应答」的时间差(往返延迟),统计丢包数;
  4. 数据包每经过 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              # 重载规则

总结

  1. iptables 默认操作 filter 表,需通过 -t 指定其他表(nat/mangle/raw);
  2. 核心常用场景:filter 表做端口 / IP 过滤,nat 表做端口映射 / IP 伪装;
  3. 规则遵循 "从上到下匹配、匹配即停止",默认策略兜底,且需持久化避免重启失效。

四、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. 常见问题与注意事项
  1. 测试结果远低于理论带宽
    • 排查:是否为百兆网卡(理论上限 100 Mbps)、网线是否为超五类线、服务器 CPU / 内存是否瓶颈;
    • 解决:用多线程(-P)测试,避免单线程未跑满带宽。
  2. UDP 丢包率高
    • 排查:网络链路是否拥堵、路由器 / 交换机是否开启 QoS 限流、MTU 值是否过大(可尝试调整 MTU);
  3. 端口不通
    • 确保服务器端防火墙开放测试端口(如 5201):iptables -A INPUT -p tcp --dport 5201 -j ACCEPT

五、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

六、注意事项

  1. tcpdump 需要 root 权限 (普通用户需加 sudo),否则无法抓取网络数据包;
  2. 过滤规则中的特殊符号(如 &|)需用单引号 ' ' 包裹,避免被 Shell 解析;
  3. 抓包时优先使用 -n/-nn 选项,减少 DNS 解析开销,提升抓包效率;
  4. 保存的 .pcap 文件可直接拖入 Wireshark,用图形界面进行更直观的分析。

0voice · GitHub

相关推荐
じ☆冷颜〃4 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
风送雨4 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
芯盾时代5 小时前
石油化工行业网络风险解决方案
网络·人工智能·信息安全
线束线缆组件品替网5 小时前
Weidmüller 工业以太网线缆技术与兼容策略解析
网络·人工智能·电脑·硬件工程·材料工程
以太浮标6 小时前
华为eNSP模拟器综合实验之-BFD联动配置解析
运维·网络·华为·信息与通信
ICT系统集成阿祥7 小时前
OSPF邻居建立失败完整排查指南
网络·网络协议
liulilittle8 小时前
OPENPPP2 Code Analysis One
网络·c++·网络协议·信息与通信·通信
叫致寒吧8 小时前
k8s操作(三)
网络·容器·kubernetes
sww_10269 小时前
Netty原理分析
java·网络