網絡接口配置命令 ifconfig
1 ) 網絡接口識別
- 有線連接標識:
eth0(舊版)或enp0s3(新版)表示有線網卡。在輸出中,RX packets(接收包)和 TX packets(發送包)的數量為非零值(如 RX: 4853, TX: 4821),表明採用有線聯網
- 無線連接標識:
wlan0表示無線網卡。若其 RX/TX 值均為零,表明未使用無線連接 - 本地迴環:
lo接口的 RX/TX 包數(如 148)表示系統內部通信
- 無線網卡標識為
wl*(如wlan0)
- 參考:Predictable Network Interface Names
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 <接口名> <狀態>:
# 關閉有線接口
sudo ifconfig enp0s3 down
# 重新激活
sudo ifconfig enp0s3 up
- 手動設置 IP(示例):
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:
ip addr show # 顯示接口信息
- 新舊工具對比:
|
net-tools 命令
|
iproute2 等效命令
|
|
|
|
|
|
|
|
|
|
7 )手動配置 IP 地址(示例):
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 地址
|
-
|
|
|
-
|
|
|
|
清空 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
通過包管理器可驗證歸屬:
查詢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 縮寫)
- 連接狀態分析:
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,語法更高效:
ss -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 語法):
關閉接口
ip link set enp0s3 down
激活接口
ip link set enp0s3 up
NestJS 實現網絡信息監控(TypeScript 代碼)
1 ) 方案1
以下示例通過 NestJS 服務執行 ifconfig 和 netstat 命令,解析並返回結構化數據。
安裝依賴:
npm install @nestjs/common @nestjs/core child_process
服務代碼 (network.service.ts):
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):
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):
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 模塊:
import { networkInterfaces } from 'os';
const nets = networkInterfaces();
const enp0s3 = nets['enp0s3']?.find(info => info.family === 'IPv4');
console.log('IP Address:', enp0s3?.address);