Linux小课堂: 网络接口与连接监控命令详解

网络接口配置命令 ifconfig

1 ) 网络接口识别

  • 有线连接标识:eth0(旧版)或 enp0s3(新版)表示有线网卡。在输出中,RX packets(接收包)和 TX packets(发送包)的数量为非零值(如 RX: 4853, TX: 4821),表明采用有线联网
    • 无线连接标识:wlan0 表示无线网卡。若其 RX/TX 值均为零,表明未使用无线连接
    • 本地回环:lo 接口的 RX/TX 包数(如 148)表示系统内部通信
  • 无线网卡标识为wl*(如wlan0

2 )新版网络接口命名规则

  • 原因:新版 Linux 使用 systemd 替代 init.d,导致接口命名改变
  • 示例:enp0s3 中:
    • en 表示以太网卡(Ethernet);

    • p0s3 表示 PCI 接口物理位置(总线号 0,插槽号 3

    • 命名规范:

      前缀 含义 示例
      en 以太网 enp0s3
      wl 无线网 wlp2s0
    • 自定义名称:可通过配置将 enp0s3 改为 eth0(不推荐)

  • 网络接口命名规则:
    • 在旧版 Linux 系统中,有线网卡名称为 eth0;新版系统(如 CentOS)改用 enp0s3
    • 若需恢复旧版命名(如 eth0),可修改配置文件,但不推荐

3 ) 虚拟机网络接口的特殊性

  • 虚拟接口 virbr0:由 libvirtd 服务生成,用于 NAT 模式,使虚拟机通过宿主机访问外部网络
    • 桥接模式:服务器中若使用桥接网卡(非 NAT),则无 virbr0 接口
  • 删除方法:通过特定步骤移除 virbr0(详见相关文档)

4 ) 关键参数解析

  • 包数: RX packets(接收包数)与 TX packets(发送包数),如 RX packets: 4853 表示接收 4853 个数据包
  • 流量统计:RX bytes: 10991 (10.0 MB) 表示接收流量为 10.0 MB
  • IP 地址:inet 后接 IPv4 地址(如 192.168.1.100),inet6 后接 IPv6 地址
  • 子网掩码:netmask 表示子网掩码,broadcast 表示广播地址
  • MAC 地址:ether 后接物理地址(如 08:00:27:3a:4c:5b
  • 流量统计:RX bytes(接收流量)与 TX bytes(发送流量),例如 10.0 MB 接收、182.1 KB 发送
  • lo 为本地回环接口,virbr0 为虚拟接口(由 NAT 模式生成,桥接模式不显示)

5 )接口配置操作

  • 激活/关闭接口:需 root 权限,格式为 ifconfig <接口名> <状态>

    bash 复制代码
    # 关闭有线接口  
    sudo ifconfig enp0s3 down  
    # 重新激活  
    sudo ifconfig enp0s3 up  
  • 手动设置 IP(示例):

    bash 复制代码
    sudo ifconfig enp0s3 192.168.10.15 netmask 255.255.255.0 broadcast 192.168.10.255  
  • 注意:错误配置可能导致网络故障,需网络知识支持

6 )ifconfig 替代工具:ip addr

  • 新版 Linux 默认安装 iproute2 包,提供 ip addr 命令,功能类似 ifconfig

    bash 复制代码
    ip addr show  # 显示接口信息  
  • 新旧工具对比:

    net-tools 命令 iproute2 等效命令
    ifconfig ip addr
    route ip route
    netstat ss(连接统计)

7 )手动配置 IP 地址(示例):

bash 复制代码
sudo ifconfig enp0s3 192.168.10.15 netmask 255.255.255.0 broadcast 192.168.10.255  

注意:错误配置可能导致网络故障,需网络知识支持

命令对比:

  • ifconfig 属于 net-tools 包(旧版),ip addr 属于 iproute2 包(新版)
  • 两者功能相似,但 iproute2 是未来趋势

8 )ip linkip addr

两者均为 Linux 网络管理核心命令,前者侧重链路层(硬件/状态),后者专注 IP 地址管理

命令功能概述
ip linkip addr 均属于 iproute2 工具集,用于配置网络接口。ip link 主要操作物理/虚拟网卡的状态与属性,如启用、禁用或修改 MAC 地址;ip addr 则负责 IP 地址的添加、删除与查看[2][3][4]。

核心用法对比

功能场景 ip link 常用命令 ip addr 常用命令
查看信息 ip link show(所有网卡状态) ip addr show(所有网卡 IP 信息)
ip link show eth0(指定网卡详情) ip addr show eth0(指定网卡 IP)
修改状态 ip link set eth0 up(启用网卡) -
ip link set eth0 down(禁用网卡) -
配置硬件属性 ip link set eth0 address 00:11:22:33:44:55(修改 MAC) -
管理 IP 地址 - ip addr add 192.168.1.100/24 dev eth0(添加 IP)
- ip addr del 192.168.1.100/24 dev eth0(删除 IP)
清空 IP 地址 - ip addr flush dev eth0(删除所有 IP)

临时配置需注意:命令行修改均为临时生效,重启 network 服务后失效;永久配置需编辑网卡文件(如 /etc/sysconfig/network-scripts/ifcfg-eth0

关键区别与使用建议

  • ip link 核心:链路层操作,如检查网线连接(LOWER_UP 状态)、修改 MTU 或 MAC 地址,适合硬件级调试
  • ip addr 核心:网络层配置,重点管理 IP 地址与子网掩码,常用于临时测试多 IP 场景(如高可用集群)
  • 替代关系:ip linkip addr 逐步取代传统 ifconfig,功能更全面(如 ip addr 可显示 down 状态的网卡)

网络连接统计命令 netstat

命令归属与包管理

  • netstat命令属于net-tools软件包,用于统计网络信息。该包包含基础网络工具(如ifconfigroute等)
  • 新一代网络工具包iproute2(含ipss命令)已逐步替代net-tools

通过包管理器可验证归属:

bash 复制代码
查询ifconfig所属包
which ifconfig             # 输出路径:/usr/sbin/ifconfig 
rpm -qf /usr/sbin/ifconfig # 显示包名:net-tools 
 
查询ip命令所属包 
which ip                   # 输出路径:/sbin/ip 
rpm -qf /sbin/ip           # 显示包名:iproute2 

常用参数与输出:

  • -i:接口统计信息(如 netstat -i):

    • RX-OK/TX-OK:成功接收/发送的包数
    • RX-ERR/TX-ERR:错误包数
    • RX-DRP/TX-DRP:丢弃包数(DRP 为 drop 缩写)。
    • RX-OVR/TX-OVR:过速丢失包数(OVR 为 overrun 缩写)
  • 连接状态分析:

    bash 复制代码
    netstat -ta  # 仅显示 TCP 连接  
    netstat -ua  # 仅显示 UDP 连接  
  • -ta:列出所有 TCP 连接(netstat -ta)。

  • -ua:列出所有 UDP 连接(netstat -ua)。

  • -n:以数字形式显示端口(如 443 替代 https

  • -lt:仅显示 LISTEN 状态的连接(netstat -lt

  • -s:总结性统计(如协议级流量数据)

连接状态与端口:

  • 状态含义:

    • ESTABLISHED:连接已建立。
    • TIME_WAIT:等待封包处理。
    • LISTEN:监听传入连接。
    • CLOSE_WAIT:远程终止连接。
  • 冒号后数字(如 :443)表示端口,常用端口及作用:

    端口 协议 用途
    80 HTTP 网页访问
    443 HTTPS 加密网页访问
    22 SSH 安全远程登录
    21 FTP 文件传输
    110 POP3 邮件接收
  • 数字显示端口:netstat -tun 强制以数字格式输出端口号

  • 过滤与统计命令

    • 监听端口:netstat -lt 列出所有 LISTEN 状态的连接
    • 汇总统计:netstat -s 显示协议级流量摘要(TCP/UDP/IP)
  • netstat 替代工具:ss

    • ss 命令(属 iproute2 包)功能类似 netstat,语法更高效:

      bash 复制代码
      ss -ta  # 显示所有 TCP 连接  
      ss -s   # 输出统计摘要  

iproute2 替代命令 ss

netstat 对比:

  • ss 属于 iproute2 包,功能类似 netstat,但性能更优。
  • 示例:ss -t 显示 TCP 连接,输出格式与 netstat -ta 相似。
  • 命令映射关系:
    • netstat -iip -s link(接口统计)。
    • netstat -tass -t(TCP 连接)。

接口操作(iproute2 语法):

bash 复制代码
关闭接口  
ip link set enp0s3 down  
 
激活接口  
ip link set enp0s3 up  

NestJS 实现网络信息监控(TypeScript 代码)

1 ) 方案1

以下示例通过 NestJS 服务执行 ifconfignetstat 命令,解析并返回结构化数据。

安装依赖:

bash 复制代码
npm install @nestjs/common @nestjs/core child_process  

服务代码 (network.service.ts):

typescript 复制代码
import { Injectable } from '@nestjs/common';  
import { exec } from 'child_process';  
import { promisify } from 'util';  
 
const execAsync = promisify(exec);  
 
@Injectable()  
export class NetworkService {  
  // 解析 ifconfig 输出  
  async getIfconfig(): Promise<any> {  
    try {  
      const { stdout } = await execAsync('ifconfig');  
      const interfaces = stdout.split('\n\n').filter(Boolean);  
      const result = {};  
 
      interfaces.forEach(intf => {  
        const nameMatch = intf.match(/^(\w+):/);  
        if (!nameMatch) return;  
 
        const name = nameMatch[1];  
        const inetMatch = intf.match(/inet (\d+\.\d+\.\d+\.\d+)/);  
        const netmaskMatch = intf.match(/netmask (\d+\.\d+\.\d+\.\d+)/);  
        const macMatch = intf.match(/ether ([\da-f:]+)/i);  
        const rxMatch = intf.match(/RX packets (\d+).*?bytes (\d+)/);  
        const txMatch = intf.match(/TX packets (\d+).*?bytes (\d+)/);  
 
        result[name] = {  
          ipv4: inetMatch ? inetMatch[1] : null,  
          netmask: netmaskMatch ? netmaskMatch[1] : null,  
          mac: macMatch ? macMatch[1] : null,  
          rx: rxMatch ? { packets: parseInt(rxMatch[1]), bytes: parseInt(rxMatch[2]) } : null,  
          tx: txMatch ? { packets: parseInt(txMatch[1]), bytes: parseInt(txMatch[2]) } : null,  
        };  
      });  
 
      return result;  
    } catch (error) {  
      throw new Error(`Failed to get ifconfig: ${error.message}`);  
    }  
  }  
 
  // 解析 netstat 输出  
  async getNetstat(options: { type?: 'tcp' | 'udp' } = {}): Promise<any[]> {  
    try {  
      const cmd = options.type ? `netstat -t${options.type === 'udp' ? 'u' : ''}a` : 'netstat -a';  
      const { stdout } = await execAsync(cmd);  
      const lines = stdout.split('\n').slice(2); // 跳过表头  
      const connections = [];  
 
      lines.forEach(line => {  
        const columns = line.trim().split(/\s+/);  
        if (columns.length < 6) return;  
 
        const [proto, recvQ, sendQ, localAddr, foreignAddr, state] = columns;  
        connections.push({  
          protocol: proto,  
          localAddress: localAddr,  
          foreignAddress: foreignAddr,  
          state: state || 'N/A',  
        });  
      });  
 
      return connections;  
    } catch (error) {  
      throw new Error(`Failed to get netstat: ${error.message}`);  
    }  
  }  
}  

控制器代码 (network.controller.ts):

typescript 复制代码
import { Controller, Get } from '@nestjs/common';  
import { NetworkService } from './network.service';  
 
@Controller('network')  
export class NetworkController {  
  constructor(private readonly networkService: NetworkService) {}  
 
  @Get('interfaces')  
  async getInterfaces() {  
    return this.networkService.getIfconfig();  
  }  
 
  @Get('connections')  
  async getConnections() {  
    return this.networkService.getNetstat({ type: 'tcp' });  
  }  
}  

模块注册 (app.module.ts):

typescript 复制代码
import { Module } from '@nestjs/common';  
import { NetworkController } from './network.controller';  
import { NetworkService } from './network.service';  
 
@Module({  
  controllers: [NetworkController],  
  providers: [NetworkService],  
})  
export class AppModule {}  

说明:

  • 服务通过 child_process 执行系统命令,解析后返回 JSON 格式的网络信息。
  • 接口:GET /network/interfaces 返回网卡详情;GET /network/connections 返回 TCP 连接。
  • 安全提示:生产环境需添加权限校验,避免命令注入风险。

核心总结

1 ) IP 与主机名:

  • 互联网设备通过 IP 地址(如 72.208.169.35)标识,主机名(如 github.com)便于记忆
  • host 命令实现 IP 与主机名互解析

2 ) 接口监控:

  • ifconfig 管理网络接口(实体/虚拟),ip addr 为新一代替代方案

3 ) 连接分析:

  • netstat 统计活动连接(TCP/UDP),ss 提供更高效实现

4 ) 端口作用:

  • 端口是通信门户(如 80=HTTP、22=SSH),物理端口(如 RJ45)与虚拟端口并存

细节总结

1 ) 网络接口管理:

  • 命名逻辑:新版接口名(如 enp0s3)编码硬件位置,避免歧义
  • 虚拟接口:virbr0 是实现虚拟机 NAT 网络的核心组件
  • 关键操作:接口启停需 root 权限,IP 配置影响网络可达性

2 ) 连接与端口监控:

  • 状态机:TCP 连接状态(如 ESTABLISHED/TIME_WAIT)反映通信阶段
  • 端口协议:端口号与服务的绑定(如 443→HTTPS)是网络层寻址基础

3 ) 工具演进:

  • net-tools vs iproute2:后者更现代,支持更多功能(如 ss 替代 netstat
  • 命令等价:ifconfigip link/addrnetstatss

4 ) 代码补充说明:本文主要涉及系统命令,若需在 NestJS 中操作网络接口(如获取 IP),可使用 Node.js 的 os 模块:

ts 复制代码
import { networkInterfaces } from 'os';  

const nets = networkInterfaces();  
const enp0s3 = nets['enp0s3']?.find(info => info.family === 'IPv4');  
console.log('IP Address:', enp0s3?.address);  
相关推荐
徐sir(徐慧阳)3 小时前
搭建属于自己的网站HEXO静态页(二)发布网站到gihub
服务器·node.js·github·hexo
纳切威3 小时前
CentOS 10 系统安装
linux
apolloyhl3 小时前
Linux目录
linux
java_logo3 小时前
Docker 部署 Debian 全流程教程
linux·运维·docker·容器·debian
哈喽哈喽哈喽~3 小时前
推送文件到github ---服务器关键配置内容
运维·服务器·经验分享·github
❀͜͡傀儡师3 小时前
基于 docker compose 进行部署PandaWiki
运维·docker·容器
天上飞的粉红小猪3 小时前
linux的文件系统
linux·运维·服务器·1024程序员节
珊瑚礁的猪猪侠4 小时前
正则表达式入门到精通教程(Linux实操版)
linux·人工智能·正则表达式
czhc11400756634 小时前
JAVA1026 方法;类:抽象类、抽象类继承;接口、接口继承 Linux:Mysql
java·linux·mysql