网络接口配置命令 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),可修改配置文件,但不推荐
- 在旧版 Linux 系统中,有线网卡名称为
3 ) 虚拟机网络接口的特殊性
- 虚拟接口
virbr0:由libvirtd服务生成,用于 NAT 模式,使虚拟机通过宿主机访问外部网络- 桥接模式:服务器中若使用桥接网卡(非 NAT),则无
virbr0接口
- 桥接模式:服务器中若使用桥接网卡(非 NAT),则无
- 删除方法:通过特定步骤移除
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(示例):
bashsudo 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:baship addr show # 显示接口信息 -
新旧工具对比:
net-tools 命令 iproute2 等效命令 ifconfigip addrrouteip routenetstatss(连接统计)
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 link 和 ip addr
两者均为 Linux 网络管理核心命令,前者侧重链路层(硬件/状态),后者专注 IP 地址管理
命令功能概述
ip link 和 ip 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 link和ip addr逐步取代传统ifconfig,功能更全面(如ip addr可显示 down 状态的网卡)
网络连接统计命令 netstat
命令归属与包管理
netstat命令属于net-tools软件包,用于统计网络信息。该包包含基础网络工具(如ifconfig、route等)- 新一代网络工具包iproute2(含
ip、ss命令)已逐步替代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 缩写)
-
连接状态分析:
bashnetstat -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,语法更高效:bashss -ta # 显示所有 TCP 连接 ss -s # 输出统计摘要
-
iproute2 替代命令 ss
与 netstat 对比:
ss属于iproute2包,功能类似netstat,但性能更优。- 示例:
ss -t显示 TCP 连接,输出格式与netstat -ta相似。 - 命令映射关系:
netstat -i→ip -s link(接口统计)。netstat -ta→ss -t(TCP 连接)。
接口操作(iproute2 语法):
bash
关闭接口
ip link set enp0s3 down
激活接口
ip link set enp0s3 up
NestJS 实现网络信息监控(TypeScript 代码)
1 ) 方案1
以下示例通过 NestJS 服务执行 ifconfig 和 netstat 命令,解析并返回结构化数据。
安装依赖:
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 - 命令等价:
ifconfig→ip link/addr,netstat→ss
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);