跳转至

Linux Network Command Guide

导言

我想写关于 linux 网络命令 ip iptables ufw 的相关文档来全面表述linux网络的构成和如何控制管理

lsof

  • lsof(list open files)是一个列出当前系统打开文件的命令。
  • 由于在linux环境下,任何事物都以文件的形式存在
  • 所以通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件

输出格式

$lsof -i
COMMAND       PID        USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
node        82138 shaojiemike   20u  IPv4 101994394      0t0  TCP localhost:34075->localhost:56220 (ESTABLISHED)
hugo      4042646 shaojiemike    9u  IPv4  99496788      0t0  TCP localhost:xtel (LISTEN)
ssh       4080263 shaojiemike    3u  IPv4 100792902      0t0  TCP snode6:40592->ec2-54-82-85-249.compute-1.amazonaws.com:ssh (ESTABLISHED)

$lsof
init          1        root  rtd       DIR                8,1     4096          2 /
init          1        root  txt       REG                8,1   150584     654127 /sbin/init

值得解释的参数:

  • COMMAND:进程的名称
  • FD:文件描述符,应用程序通过文件描述符识别该文件。
    • cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。
    • txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。
    • 数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。
    • 由于初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
    • u 表示该文件被打开并处于读取/写入模式,而不是只读 r 或只写 (w) 模式。
    • 大写的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。
    • mem memory-mapped file;
    • rtd root directory;
  • TYPE:文件类型
    • REG 和 DIR分别表示文件和目录。
    • CHR 和 BLK,分别表示字符和块设备;
    • UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

常见用法

  • 打开文件的进程lsof abc.txt
  • 进程打开的文件
    • 根据进程名lsof -c abc
    • 根据PIDlsof -c -p 1234
  • 当前目录下被打开的文件lsof +d /usr/local/
    • 允许向下递归目录lsof +d /usr/local/
  • 筛选和网络相关的lsof -i默认打印所有网络相关的
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  46 --> IPv4 or IPv6
  protocol --> TCP or UDP
  hostname --> Internet host name
  hostaddr --> IPv4地址
  service --> /etc/service中的 service name (可以不止一个)
  port --> 端口号 (可以不止一个)

常见用例

lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i [email protected]:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)

特殊端口替代符号

lsof -i :8080会用特殊的端口替换名称代替,常见的见文档

> sudo lsof -i  :8080
COMMAND      PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
qbittorre 102376 chivier    9u  IPv6 257158435      0t0  TCP *:http-alt (LISTEN)
常见端口号 替换名称
21 ftp
22 ssh
80 http
8080 http-alt
8090 http_alt_alt
443 https

top命令

提高刷新率

top 命令的默认刷新间隔是 3 秒,但你可以通过设置刷新间隔来让它更频繁地更新。

要将 top 的刷新间隔改为 0.5 秒,可以在 top 启动后按下 d 键(小写),然后输入新的时间间隔(单位为秒)。- ds: 设置更新间隔时间。

  1. 启动 top

    top
    

  2. 按下 d 键(小写)后,输入 0.5,然后按回车:

    0.5
    

这样,top 就会以 0.5 秒的间隔更新显示内容。

或者,你也可以在启动 top 时指定刷新间隔:

在命令行中直接指定刷新间隔为 0.5 秒:

top -d 0.5

  • -d 选项用来设置刷新间隔(单位:秒)。

一些重要的快捷键:

  • h 或 ?: 显示帮助信息。
  • Esc 或 q: 退出当前的界面。

全局命令:

  • Z: 切换颜色显示模式(打开/关闭)。有四个区域和8种数字颜色可选。
  • B: 切换加粗显示(打开/关闭)。
    • 排序字段的高亮 (x 键):当你按下 x 键时,top 会高亮显示当前排序的字段。这使得你能够清晰地看到系统当前最关注的资源(例如,CPU 或内存消耗最多的进程)。
    • 正在运行的任务的高亮 (y 键):按下 y 键时,top 会高亮显示正在运行的任务(即当前活跃的进程,通常在 top 中状态为R)。这有助于你迅速找到最消耗资源的任务,尤其是在系统负载较高时。非高亮的就是S(睡眠状态)或 I(等待 I/O)状态的任务。
  • E, e: 切换内存显示格式(TB/GB/MB/KB),E 为切换导航栏的内存,e 为切换各个任务的内存。

导航栏:

  • l: 显示/隐藏平均负载(Load Average)。
  • t: 显示/隐藏任务和 CPU 信息。
  • m: 显示/隐藏内存使用情况。

CPU/NUMA 视图:

  • 0,1,2,3,4: 切换显示不同的 CPU/NUMA 信息视图。
    • 0 隐藏所以的0值,为空格。
    • 1/2/3 显示对应 CPU/NUMA 节点的信息,
    • 4 显示多个 CPU 纵向排列。

字段操作:

  • f: 调整显示的字段,包括添加、删除、排序。比如PPID,UID

查找和排序:

  • L, &: 查找当前显示的任务/进程,L 为查找,& 为查找下一个匹配项。
    • 类似搜索

排序和显示:

  • R: 切换排序顺序。
  • H: 显示/隐藏线程信息
  • C: 显示/隐藏坐标(某些任务显示的额外信息)。

切换显示内容:

  • c: 切换显示进程的命令行(显示参数)或进程名。
  • i: 显示/隐藏空闲进程

高亮显示:

  • x: 切换排序字段的高亮显示。
  • y: 切换正在运行的任务的高亮显示。
  • z: 切换颜色模式(显示任务时)。
  • b: 切换加粗或反转显示(仅在启用 xy 时有效)。

过滤进程:

  • u: 按用户过滤(显示当前用户的进程)。
  • U: 按任意用户过滤(显示指定用户的进程)。
  • o, O: 按其他条件进行过滤。
    • 按 o 键(小写),进入过滤条件输入模式。输入筛选条件:对于 PID 筛选,输入 pid=<进程ID>,然后按回车。
    • 取消筛选?
    • top -p 1234
    • Ctrl + O: 显示其他筛选器条件。

设置和显示:

  • n, #: 设置最大显示的任务数。默认是不限制。

进程管理:

  • k: 杀死(终止)选定进程。
  • r: 重设进程的优先级(renice)。

配置和视图设置:

  • W: 保存配置。
  • Y: 查看当前配置。
  • !: 合并 CPU(例如多个 CPU 显示)。
  • Ctrl + E: 设置时间缩放比例。

htop命令

  • 按键h?或者F1进说明界面,介绍快捷键hotkey
    • 注意大小写, 前面亮蓝色的F9 k代表F9k两按键都可以实现功能
    • u 可以指定用户的进程
    • H 显示或隐藏user线程
    • K 显示或隐藏kernel线程。 值得注意显示的PID,其实是PID或者TID(thread id)
    • e 可以打印环境变量
  • F5可以在两模式间切换
    • sort模式时,F6为SortBy可以选择排序方式
    • Tree模式时,F6为Collapse折叠子进程

常规设置以及解释

  • F2中布局设置如下(注意分成左右两大块)
    • "load average",它的意思是"系统的平均负荷",里面有三个数字,意思分别是1分钟、5分钟、15分钟内系统的平均负荷。当CPU完全空闲的时候,平均负荷为0;当CPU工作量饱和的时候,平均负荷为1。
    • 如果CPU每分钟最多处理100个进程,系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。
    • 多核或者多CPU情况:n个CPU的电脑,可接受的系统负荷最大为n
  • F2中Dispaly options 除开隐藏用户态线程,其他建议全部勾选
  • F2中Columns设置每个进程显示的内容
  • 建议添加
    • STARTTIME
    • PPID 父进程PID
    • NLWP Number of threads in the process
  • 根据情况添加
    • 分析程序时间 user_time & system_time
    • 程序数据占用大小 M_LRS The library size of the process
    • IO读取的数据和速率 IO_RATE(需要sudo才能采集)

常用参数解释

START     PID    PPID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
  • PRIORITY
    • Kernel's internal priority for the process
  • NICE
    • Nice value (the higher the value,the more it lets other processes take priority)
    • 所以F7 Nice- 调高优先级,F8 Nice+ 降低优先级
  • PROCESSOR
    • Id of the CPU the process last executed on
  • M_SIZE
    • Total program size in virtual memory
    • 进程占用的虚拟内存值
  • M_RESIDENT
    • Resident set size,size of the text and data sections,plus stack usage
    • 进程占用的物理内存值
  • M_SHARE
    • Size of the process's shared pages
    • 进程占用的共享内存值
  • PERCENT_CPU
    • Percentage of the CPU time the process used in the last sampling (0~n)
  • PERCENT_MEM
    • Percentage of the memory the process is using, based on resident memory size
    • 该进程占用的物理内存和总内存的百分比
  • TIME
    • Total time the process has spent in user and system time
  • Status:
    • R: running;
    • S: sleeping;
    • T: traced/stopped;
    • Z: zombie;
    • D: disk sleep

常见用法

  • 先使用F4查找到进程名对应的PID,然后退出F4查找,直接输入pid可以知道其是否是僵尸进程

ip rule 与 ip route

传统路由

传统路由是基于目的地址来路由,如route命令。但是已经不再被使用。

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         0.0.0.0         0.0.0.0         U     0      0        0 warp
default         202.38.73.254   0.0.0.0         UG    0      0        0 eno0
  • 显示所有的流量都走名为warp的wireguard虚拟网卡。如果第一条wg的路由规则,所有流量原本应该走网关202.38.73.254
  • 参数基本说明
  • Metric 路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的 (Linux内核不再使用)
  • Ref 是路由项引用次数 (Linux内核不再使用)
  • 相关Flags含义:
    • U 路由是活动的
    • G 需要经过网关
    • ! 拒绝路由
    • n 表示该路由是一个主机路由(而不是网络路由)
$ route -6
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
[::]/0                         [::]                       !n   -1  1     0 lo

[::]/0                         2001:da8:d800:730::1       UG   1024 65     0 eno0
ip6-localhost/128              [::]                       Un   0   57     0 lo

以上是ipv6的相关输出

ip ro命令 ip route 命令

ip ro命令是ip route命令的缩写,默认显示的是ip route show table main也就是main 路由表

注意每个路由表的内容,如果满足几个路由规则,路由的优先级是按照匹配前缀最长的路由。而不是按照第一行优先于第二行。

root@tsjOp ~  [03:02:19]
> ip ro
default via 114.214.235.254 dev eth1  src 114.214.233.141
10.0.233.2 dev wg1 scope link
10.0.233.3 dev wg1 scope link
10.0.233.4 dev wg1 scope link
10.0.233.5 dev wg1 scope link
10.0.233.6 dev wg1 scope link
10.0.233.7 dev wg1 scope link
114.214.232.0/22 dev eth1 scope link  src 114.214.233.141
192.168.31.0/24 dev br-lan scope link  src 192.168.31.1

对于目的地址为10.0.233.2的信包,虽然也匹配default规则,但是32位全匹配10.0.233.2 dev wg1 scope link,所以最终选择wg1.

ip rule指令

Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除; llist 列表)

SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型]
            [ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]

ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换]
          [ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]

[ flowid CLASSID ]

TABLE_ID := [ local | main | default | new | NUMBER ]

查看指定ip的路由

root@tsjOp ~  [01:46:08]
> ip route get 20.205.243.166
20.205.243.166 via 114.214.235.254 dev eth1  src 114.214.233.141
root@tsjOp ~  [01:48:07]
> ip route show to match 20.205.243.166
default via 114.214.235.254 dev eth1  src 114.214.233.141

iptables

Linux 网络管理机制

在命令的学习和实践中,逐步学习。Linux系统是如何管理网络的。

node5 problem

$ ip route show table default
Error: ipv4: FIB table does not exist.
Dump terminated

参考文献

https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html

https://zhuanlan.zhihu.com/p/144585950