目录
[1. ip 命令](#1. ip 命令)
[2. netstat 和 ss 命令](#2. netstat 和 ss 命令)
[使用 ss 命令查看端口占用](#使用 ss 命令查看端口占用)
[3. ping 命令](#3. ping 命令)
[4. traceroute 命令](#4. traceroute 命令)
[5. tcpdump 命令](#5. tcpdump 命令)
在 Linux 系统中,网络配置和故障排查是系统管理员的常见任务。Linux 提供了丰富的命令行工具来帮助管理网络、监控性能、诊断问题,以及优化网络设置。本文将详细介绍一系列关键的 Linux 网络命令,并通过实际例子来展示它们的用法和功能。
1. ip
命令
ip
命令是用来显示和操作路由、设备、策略路由和隧道的工具,是旧的 ifconfig
、route
、arp
等命令的替代品。
查看和配置网络接口
-
查看所有接口的 IP 地址:
ip addr show
或简写为:
ip a
-
查看特定接口的详细信息:
ip addr show dev eth0
这里
eth0
是网络接口的名称,根据实际情况替换。 -
启用和禁用网络接口:
ip link set eth0 up # 启用 eth0 ip link set eth0 down # 禁用 eth0
-
添加或删除 IP 地址:
ip addr add 192.168.1.100/24 dev eth0 # 添加 IP 地址 ip addr del 192.168.1.100/24 dev eth0 # 删除 IP 地址
管理路由表
-
查看路由表:
ip route show
或简写为:
ip r
-
添加和删除路由:
ip route add 192.168.2.0/24 via 192.168.1.1 dev eth0 # 添加路由 ip route del 192.168.2.0/24 # 删除路由
2. netstat
和 ss
命令
netstat
命令用于显示网络连接、路由表、接口统计等信息,而 ss
是 netstat
的更强大和快速的替代品。
查看网络连接
-
使用
netstat
查看所有连接:netstat -a
-
使用
ss
查看所有 TCP 连接:ss -t -a
-
查看所有监听端口:
ss -t -l
显示详细统计信息
-
使用
netstat
查看接口统计:netstat -i
-
使用
ss
查看 TCP 连接的统计:ss -ti
查看某个端口被什么进程占用
当你需要查看某个端口被哪个进程占用时,netstat
可以提供详细的信息,包括服务的 PID 和进程名称。
要使用 netstat
查看某个特定端口(例如 80 端口)被哪个进程占用,你可以使用以下命令:
netstat -tulnp | grep :80
详解各个选项参数
-t
(TCP): 这个选项指示netstat
显示 TCP 协议的连接。-u
(UDP): 这个选项指示netstat
显示 UDP 协议的连接。-l
(Listening): 这个选项让netstat
仅列出处在监听状态的套接字,这对于查找哪个进程在监听某个端口非常有用。-n
(Numeric): 通常,netstat
会显示服务名称(如http
)和主机名(如localhost
)。使用-n
选项,netstat
会直接使用 IP 地址和端口号,避免域名解析带来的延迟和不必要的 DNS 查找。-p
(Program): 最重要的选项之一,它显示每个套接字关联的进程 ID 和程序名。这对于确定哪个程序绑定了某个端口至关重要。
示例
假设你想找出哪个进程监听了 TCP 80 端口(通常是 HTTP 服务),你可以运行:
netstat -tulnp | grep :80
输出可能类似于:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1316/nginx: master
tcp6 0 0 :::80 :::* LISTEN 1316/nginx: master
这里,1316/nginx: master
表示 PID 为 1316 的进程(nginx
的主进程)正在监听端口 80。
注意事项
- 权限 :运行
netstat -p
需要足够的权限(通常是 root 权限),因为查看系统上所有用户的进程信息需要管理员权限。 - 过时的
netstat
:在一些较新的 Linux 发行版中,netstat
被ss
命令替代了。如果你发现netstat
不可用或希望使用更现代的工具,可以使用ss
命令作为替代。
使用 ss
命令查看端口占用
ss
是另一个非常有用的工具,用于显示类似的信息。使用 ss
查看被占用的端口,可以执行:
ss -tulnp | grep :80
其中选项的含义与 netstat
类似,ss
命令通常更快,更推荐在现代系统上使用。
3. ping
命令
ping
命令是网络管理员用来测试网络连接的一个非常基础和强大的工具。它利用 ICMP (Internet Control Message Protocol) 协议发送回显请求消息到目标主机,并监听回显应答来检测两个主机间的连通性。
基本用法
最基本的 ping
命令只需要一个参数,即目标主机的地址,可以是 IP 地址或者域名:
ping google.com
或者直接使用 IP 地址:
ping 8.8.8.8
这将持续发送 ICMP Echo Request 消息到目标地址,并显示每次回显应答的详细信息,包括往返时间(RTT)。
常用选项
ping
命令有许多选项,可以用来修改命令的行为或输出的详细程度。以下是一些常用的选项:
-
-c count
: 停止发送报文的数量。使用这个选项可以指定发送多少个 ICMP 请求后停止。例如,发送 4 个 ICMP Echo 请求后停止:ping -c 4 google.com
-
-i interval
: 设置连续 Echo 请求之间的间隔秒数。默认是 1 秒,但可以设置更短的时间来进行更快速的检测。例如,每 0.5 秒发送一个请求:ping -i 0.5 google.com
-
-t ttl
: 设置 IP Time To Live 域。这个选项可以用来测试网络层的特定路径,因为 TTL 值决定了数据包能通过的最大网络跳数。例如,设置 TTL 为 5:ping -t 5 google.com
-
-W timeout
: 设置等待每次回显回复的超时时间(以秒为单位)。这个选项可以用来判断网络延迟和丢包率。例如,设置超时为 2 秒:ping -W 2 google.com
-
-s packetsize
: 设置 ICMP 数据包的数据大小(以字节为单位)。默认是 56 字节的数据,加上 8 字节的 ICMP 头,因此默认 ICMP 请求是 64 字节。例如,发送数据大小为 120 字节的 ICMP 请求:ping -s 120 google.com
-
-q
: 安静输出。只显示摘要行,包含丢包信息和平均、最小、最大 RTT。ping -q -c 5 google.com
-
-v
: 详细输出模式。显示 ICMP 消息的详细信息,对于调试很有帮助。 -
-f
: 快速发送模式。发送请求的速度非常快,不等待回应,也不显示单个的回应时间,通常用于压力测试。ping -f localhost
-
-D
: 使用绝对时间戳显示输出。ping -D google.com
-
-A
: 自适应模式。动态调整间隔时间,根据网络响应时间自适应调整发送数据包的间隔。ping -A google.com
-
-n
: 数字输出。直接使用数字 IP 地址而不进行 DNS 解析。ping -n 8.8.8.8
-
-m pmtudisc_opt
: 设置 Path MTU Discovery (PMTU) 选项。可以是do
(开启 PMTU Discovery),dont
(关闭),或want
(开启,但不设置 DF 标志)。ping -m do google.com
-
-4
: 强制使用 IPv4。 -
-6
: 强制使用 IPv6。
实际应用示例
让我们看几个 ping
命令的实际应用示例:
-
检测网络连通性 :发送 5 个 ICMP 请求到
google.com
并显示结果。ping -c 5 google.com
-
快速检测本地网络:快速发送大量 ICMP 请求到本地路由器。
ping -f -c 100 192.168.1.1
-
检测网络延迟 :测量到
google.com
的平均往返时间。ping -c 10 google.com
-
查找网络路径问题:逐步增加 TTL 值来查看数据包的路径。
for i in {1..10}; do ping -c 1 -t $i google.com; done
这些示例和选项展示了 ping
命令的多样性和实用性,使其成为网络诊断和性能评估的重要工具。
4. traceroute
命令
traceroute
是一个非常有用的网络诊断工具,它用于显示数据包从一个主机传输到另一个主机所经过的路径。这个命令可以帮助你识别网络连接中的延迟瓶颈和故障位置。traceroute
利用 ICMP 和 UDP 数据包的生存时间(TTL)字段来确定网络中每一跳(即每一个路由器)的路径。
基本工作原理
traceroute
通过发送一系列小的数据包到目标主机来工作。每个数据包的 TTL 值从 1 开始递增。每当数据包经过一个路由器,其 TTL 值会减 1,当 TTL 值减到 0 时,路由器会丢弃这个数据包并发送一个 ICMP "Time Exceeded" 消息回发送者。traceroute
使用这些消息来识别所有到目标的路径上的路由器。
使用traceroute
基本语法:
traceroute [options] <destination>
<destination>
可以是 IP 地址或域名,指示traceroute
的目的地。
常用选项
-n
: 不对地址进行 DNS 名称解析,直接显示 IP 地址。-m <max_ttl>
: 设置最大生存时间(TTL),即最多经过的路由器数量,默认通常为 30。-q <nqueries>
: 设置每一跳发送的查询数,默认为 3。-f <first_ttl>
: 设置第一个使用的 TTL 值,默认为 1。这可以用来开始跟踪从一个高于 1 的 TTL 值,有助于跳过前面已知的路由器。-I
: 使用 ICMP 回显请求代替 UDP 数据报进行探测。-T
: 使用 TCP SYN 而不是 UDP 数据报进行探测,常用于诊断不响应 UDP 的服务器。-p <port>
: 设置 UDP 发送到的目标端口号或 TCP SYN 发送到的目标端口号,默认值通常为 33434。-i <interface>
: 使用指定的网络接口发送数据包。-w <waittime>
: 设置等待每次回应的最大时间(秒)。-z <pausemsecs>
: 设置发送数据包之间的等待时间(毫秒),用于限制traceroute
的发送速率。
示例
-
基本用法 :显示从本机到
google.com
的路由路径。traceroute google.com
-
使用 ICMP 而不是 UDP:使用 ICMP 请求来进行跟踪。
traceroute -I google.com
-
设置最大 TTL:显示路由路径,其中每一跳的 TTL 最大为 20。
traceroute -m 20 google.com
-
不解析名称:以纯 IP 形式显示路径。
traceroute -n google.com
-
改变查询次数:每跳只发送 1 个查询包。
traceroute -q 1 google.com
-
使用 TCP SYN:使用 TCP SYN 包进行 traceroute,对某些服务器来说,这种方式可能会绕过防火墙的限制。
traceroute -T -p 80 google.com
-
详细输出 :一些
traceroute
版本支持-v
选项以提供更详细的输出。traceroute -v google.com
-
指定源接口:从特定网络接口发送数据包。
traceroute -i eth0 google.com
-
调整发送间隔:设置每次发送数据包的间隔为 0.5 秒。
traceroute -z 500 google.com
注意事项
- 网络安全设施如防火墙和 NAT 设备可能会影响
traceroute
的结果,有时会导致部分路径不显示或显示为星号(*
)。 traceroute
的输出需要一定的网络知识来正确解读,特别是在复杂的网络环境中。- 某些路由器配置为不发送 ICMP "Time Exceeded" 消息,这会导致
traceroute
无法显示这些路由器。
通过熟练使用 traceroute
和其各种选项,你可以有效地诊断网络连接问题,从而更快地解决网络故障或性能瓶颈。
traceroute google.com
5. tcpdump
命令
tcpdump
是一个强大的命令行网络分析工具,用于捕获和分析网络上的数据包。它可以展示网络接口上所有的传入和传出的数据包的头信息,并且支持基于各种条件的过滤,使得用户可以更加精确地定位感兴趣的数据包。
基本工作原理
tcpdump
使用 pcap (Packet Capture) 库来捕获网络数据包。当你运行 tcpdump
,它会把网络接口设置为混杂模式,这样它就可以监听所有通过该接口的数据包,而不仅仅是发往本机的数据包。
基本语法
tcpdump [options] [filter-expression]
options
: 控制tcpdump
行为的命令行选项。filter-expression
: 定义了一个过滤表达式,用来指定哪些数据包会被捕获。
常用选项
以下是一些常用的 tcpdump
选项:
-i <interface>
: 指定要监听的网络接口。例如,eth0
、lo
(回环接口) 等。-n
: 不解析主机名,使用 IP 地址显示。-v, -vv, -vvv
: 增加输出的详细程度。-v
表示稍微详细,-vv
更详细,-vvv
最详细。-c <count>
: 捕获指定数量的数据包然后停止。-s <size>
: 设置捕获的数据包的部分大小(字节)。默认是捕获 96 字节,使用-s 0
可以捕获完整的数据包。-w <file>
: 将捕获的数据包写入文件而不是打印出来。-r <file>
: 从文件中读取数据包,通常与-w
选项配合使用。-A
: 以 ASCII 格式打印每个数据包(不包括链路层的头),便于阅读。-X
: 以十六进制和 ASCII 格式打印每个数据包的数据部分,包括链路层的头。-q
: 快速输出,仅打印较少的协议信息。-t
: 在输出中不包括时间戳。-e
: 在输出中包括数据链路层的头信息。-E
: 使用提供的密钥解密 IPsec 流量。
常用过滤表达式
过滤表达式用来定义哪些数据包会被 tcpdump
捕获。它们基于一组逻辑规则,这些规则可以根据协议、端口号、主机地址等属性来定义。
src <host>
: 源地址是<host>
的数据包。dst <host>
: 目标地址是<host>
的数据包。host <host>
: 源或目标地址是<host>
的数据包。net <network>
: 属于<network>
网络的数据包。src port <port>
: 源端口是<port>
的数据包。dst port <port>
: 目标端口是<port>
的数据包。port <port>
: 源或目标端口是<port>
的数据包。proto <protocol>
: 协议是<protocol>
的数据包,例如icmp
、tcp
、udp
。tcp
,udp
,icmp
:TCP
/UDP
/ICMP
协议的数据包。
示例
-
捕获所有经过 eth0 接口的数据包:
tcpdump -i eth0
-
捕获所有到达或离开某个特定 IP 的数据包:
tcpdump host 192.168.1.1
-
捕获所有目标端口为 80 的 TCP 数据包:
tcpdump -i eth0 'tcp dst port 80'
-
捕获所有源端口为 23 的数据包:
tcpdump 'src port 23'
-
仅捕获 ICMP 数据包:
tcpdump icmp
-
捕获所有经过 lo 接口的数据包并且不解析主机名:
tcpdump -n -i lo
-
捕获 100 个 TCP 数据包后停止:
tcpdump -c 100 tcp
-
以详细模式捕获数据包:
tcpdump -vvv -i eth0
-
将捕获的数据包写入文件:
tcpdump -w packets.pcap
-
从文件读取数据包:
tcpdump -r packets.pcap
-
捕获 TCP 数据包并显示每个数据包的数据部分:
tcpdump -X tcp
-
显示所有经过 eth0,目的地或源地为 192.168.1.1 的 TCP 数据包:
tcpdump -i eth0 -n 'tcp and (src host 192.168.1.1 or dst host 192.168.1.1)'
-
捕获源 IP 是 10.0.0.1 并且目标端口是 22 的数据包:
tcpdump -n 'src host 10.0.0.1 and dst port 22'
-
捕获所有非 ICMP 数据包:
tcpdump 'not icmp'
-
使用更复杂的表达式:
tcpdump 'src net 192.168.1.0/24 and dst port 443'
注意事项
- 运行
tcpdump
可能需要管理员权限。 tcpdump
可能不会显示真实的网络速度,因为它在用户空间处理数据包,而不是在内核空间。- 大量的数据包捕获和处理可能会对系统性能造成影响。
- 在高速网络或捕获大量数据时,考虑使用更高效的工具如
Wireshark
或使用专用的网络分析硬件。
这些命令和工具的组合提供了强大的网络管理和优化能力,帮助管理员监控、配置和优化 Linux 系统的网络性能。每个工具都有其特定的使用场景和优势,了解并熟练使用这些工具是提高网络管理效率和效果的关键。