ifconfig 命令详解#

ifconfig(interface configure)是 Linux 系统中用于配置和显示网络接口信息的命令,是网络管理和故障排查的重要工具。虽然在新版本 Linux 中已被 ip 命令取代,但仍然被广泛使用。

入门#

基本用法#

# 显示所有网络接口信息
ifconfig

# 显示指定网络接口信息
ifconfig eth0

# 启用网络接口
sudo ifconfig eth0 up

# 禁用网络接口
sudo ifconfig eth0 down

# 为网络接口分配 IP 地址
sudo ifconfig eth0 192.168.1.100

常用选项#

选项说明
up启用网络接口
down禁用网络接口
netmask设置子网掩码
broadcast设置广播地址
add添加 IPv6 地址
del删除 IPv6 地址
-a显示所有接口(包括禁用的接口)
-s显示简短信息

基本示例#

# 查看所有网络接口
ifconfig

# 输出示例:
# eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
#         inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
#         inet6 fe80::a00:27ff:fe4e:66a1  prefixlen 64  scopeid 0x20<link>
#         ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)
#         RX packets 12345  bytes 1234567 (1.1 MiB)
#         RX errors 0  dropped 0  overruns 0  frame 0
#         TX packets 6789  bytes 789012 (770.5 KiB)
#         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

中级#

网络接口配置#

# 配置 IP 地址和子网掩码
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0

# 配置 IP 地址、子网掩码和广播地址
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255

# 添加虚拟 IP 地址
sudo ifconfig eth0:0 192.168.1.101

# 删除虚拟 IP 地址
sudo ifconfig eth0:0 down

# 修改 MAC 地址(需要先禁用接口)
sudo ifconfig eth0 down
sudo ifconfig eth0 hw ether 00:11:22:33:44:55
sudo ifconfig eth0 up

网络接口状态查看#

# 查看特定接口详细信息
ifconfig eth0

# 查看所有接口(包括禁用的)
ifconfig -a

# 查看简短信息
ifconfig -s

# 查看接口统计信息
ifconfig eth0 | grep -E "RX|TX"

# 查看接口 MTU
ifconfig eth0 | grep mtu

网络故障排查#

# 检查接口是否启用
ifconfig eth0 | grep UP

# 检查 IP 地址配置
ifconfig eth0 | grep inet

# 检查网络连接状态
ifconfig eth0 | grep RUNNING

# 检查错误统计
ifconfig eth0 | grep errors

# 重启网络接口
sudo ifconfig eth0 down
sudo ifconfig eth0 up

高级#

高级配置#

# 设置 MTU(最大传输单元)
sudo ifconfig eth0 mtu 9000

# 启用混杂模式
sudo ifconfig eth0 promisc

# 禁用混杂模式
sudo ifconfig eth0 -promisc

# 启用 allmulti 模式
sudo ifconfig eth0 allmulti

# 禁用 allmulti 模式
sudo ifconfig eth0 -allmulti

# 设置队列长度
sudo ifconfig eth0 txqueuelen 1000

IPv6 配置#

# 添加 IPv6 地址
sudo ifconfig eth0 add 2001:db8::1/64

# 删除 IPv6 地址
sudo ifconfig eth0 del 2001:db8::1/64

# 查看 IPv6 地址
ifconfig eth0 | grep inet6

网络接口监控#

#!/bin/bash
# 网络接口监控脚本

INTERFACE="eth0"
LOG_FILE="interface_monitor.log"

while true; do
    TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
    
    RX_BYTES=$(ifconfig $INTERFACE | grep "RX packets" | awk '{print $5}')
    TX_BYTES=$(ifconfig $INTERFACE | grep "TX packets" | awk '{print $5}')
    
    echo "$TIMESTAMP - RX: $RX_BYTES bytes, TX: $TX_BYTES bytes" >> $LOG_FILE
    
    sleep 60
done

大师#

网络性能分析#

#!/bin/bash
# 网络性能分析工具

INTERFACE="eth0"

# 获取初始统计
RX_PACKETS_1=$(ifconfig $INTERFACE | grep "RX packets" | awk '{print $2}')
TX_PACKETS_1=$(ifconfig $INTERFACE | grep "TX packets" | awk '{print $2}')
RX_BYTES_1=$(ifconfig $INTERFACE | grep "RX packets" | awk '{print $5}')
TX_BYTES_1=$(ifconfig $INTERFACE | grep "TX packets" | awk '{print $5}')

sleep 60

# 获取结束统计
RX_PACKETS_2=$(ifconfig $INTERFACE | grep "RX packets" | awk '{print $2}')
TX_PACKETS_2=$(ifconfig $INTERFACE | grep "TX packets" | awk '{print $2}')
RX_BYTES_2=$(ifconfig $INTERFACE | grep "RX packets" | awk '{print $5}')
TX_BYTES_2=$(ifconfig $INTERFACE | grep "TX packets" | awk '{print $5}')

# 计算差值
RX_PACKETS_DIFF=$((RX_PACKETS_2 - RX_PACKETS_1))
TX_PACKETS_DIFF=$((TX_PACKETS_2 - TX_PACKETS_1))
RX_BYTES_DIFF=$((RX_BYTES_2 - RX_BYTES_1))
TX_BYTES_DIFF=$((TX_BYTES_2 - TX_BYTES_1))

# 计算速率
RX_RATE=$((RX_BYTES_DIFF / 60 / 1024))
TX_RATE=$((TX_BYTES_DIFF / 60 / 1024))

echo "Network Performance Analysis for $INTERFACE"
echo "==========================================="
echo "RX Packets: $RX_PACKETS_DIFF packets/min"
echo "TX Packets: $TX_PACKETS_DIFF packets/min"
echo "RX Rate: $RX_RATE KB/s"
echo "TX Rate: $TX_RATE KB/s"

多接口管理#

#!/bin/bash
# 多网络接口管理脚本

INTERFACES=("eth0" "eth1" "wlan0")

for INTERFACE in "${INTERFACES[@]}"; do
    echo "=== Interface: $INTERFACE ==="
    
    STATUS=$(ifconfig $INTERFACE 2>/dev/null | grep "UP" | wc -l)
    
    if [ $STATUS -eq 1 ]; then
        IP=$(ifconfig $INTERFACE | grep "inet " | awk '{print $2}')
        NETMASK=$(ifconfig $INTERFACE | grep "inet " | awk '{print $4}')
        BROADCAST=$(ifconfig $INTERFACE | grep "inet " | awk '{print $6}')
        
        echo "Status: UP"
        echo "IP Address: $IP"
        echo "Netmask: $NETMASK"
        echo "Broadcast: $BROADCAST"
    else
        echo "Status: DOWN"
    fi
    
    echo ""
done

网络接口备份与恢复#

#!/bin/bash
# 网络接口配置备份与恢复

BACKUP_DIR="/etc/network/backups"
mkdir -p $BACKUP_DIR

# 备份当前配置
backup_config() {
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    BACKUP_FILE="$BACKUP_DIR/interfaces_$TIMESTAMP.conf"
    
    ifconfig -a > $BACKUP_FILE
    echo "Configuration backed up to $BACKUP_FILE"
}

# 恢复配置
restore_config() {
    BACKUP_FILE=$1
    
    if [ ! -f "$BACKUP_FILE" ]; then
        echo "Backup file not found: $BACKUP_FILE"
        return 1
    fi
    
    # 解析备份文件并恢复配置
    while read -r line; do
        if [[ $line =~ ^([a-z0-9]+):.*inet ([0-9.]+) ]]; then
            INTERFACE="${BASH_REMATCH[1]}"
            IP="${BASH_REMATCH[2]}"
            
            ifconfig $INTERFACE $IP up
            echo "Restored $INTERFACE with IP $IP"
        fi
    done < "$BACKUP_FILE"
}

# 列出备份
list_backups() {
    echo "Available backups:"
    ls -lh $BACKUP_DIR/
}

case "$1" in
    backup)
        backup_config
        ;;
    restore)
        restore_config "$2"
        ;;
    list)
        list_backups
        ;;
    *)
        echo "Usage: $0 {backup|restore|list}"
        exit 1
        ;;
esac

无敌#

企业级网络接口管理#

#!/bin/bash
# 企业级网络接口管理系统

CONFIG_FILE="/etc/network_manager/config.conf"
LOG_FILE="/var/log/network_manager.log"
STATE_DIR="/var/run/network_manager"

mkdir -p $STATE_DIR

# 加载配置
source $CONFIG_FILE

# 初始化接口状态
init_interface() {
    local INTERFACE=$1
    local STATE_FILE="$STATE_DIR/$INTERFACE.state"
    
    ifconfig $INTERFACE up
    
    if [ $? -eq 0 ]; then
        echo "UP" > $STATE_FILE
        log_message "$INTERFACE initialized successfully"
    else
        echo "DOWN" > $STATE_FILE
        log_message "ERROR: Failed to initialize $INTERFACE"
    fi
}

# 监控接口状态
monitor_interface() {
    local INTERFACE=$1
    local STATE_FILE="$STATE_DIR/$INTERFACE.state"
    
    while true; do
        CURRENT_STATUS=$(ifconfig $INTERFACE 2>/dev/null | grep "UP" | wc -l)
        SAVED_STATUS=$(cat $STATE_FILE)
        
        if [ $CURRENT_STATUS -ne $SAVED_STATUS ]; then
            if [ $CURRENT_STATUS -eq 1 ]; then
                log_message "ALERT: $INTERFACE is now UP"
                echo "UP" > $STATE_FILE
            else
                log_message "ALERT: $INTERFACE is now DOWN"
                echo "DOWN" > $STATE_FILE
                
                # 尝试恢复接口
                ifconfig $INTERFACE up
            fi
        fi
        
        sleep $MONITOR_INTERVAL
    done
}

# 记录日志
log_message() {
    local MESSAGE=$1
    local TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[$TIMESTAMP] $MESSAGE" >> $LOG_FILE
}

# 主程序
main() {
    log_message "Network Manager started"
    
    for INTERFACE in "${MANAGED_INTERFACES[@]}"; do
        init_interface $INTERFACE
        monitor_interface $INTERFACE &
    done
    
    wait
}

main

智能网络接口切换#

#!/bin/bash
# 智能网络接口切换系统

PRIMARY_INTERFACE="eth0"
SECONDARY_INTERFACE="wlan0"
GATEWAY="192.168.1.1"
CHECK_INTERVAL=30

# 检查网络连接
check_connectivity() {
    local INTERFACE=$1
    
    ping -I $INTERFACE -c 1 -W 2 $GATEWAY > /dev/null 2>&1
    return $?
}

# 切换到备用接口
switch_to_secondary() {
    log_message "Switching to secondary interface: $SECONDARY_INTERFACE"
    
    ifconfig $PRIMARY_INTERFACE down
    ifconfig $SECONDARY_INTERFACE up
    
    # 更新路由表
    ip route del default via $GATEWAY dev $PRIMARY_INTERFACE 2>/dev/null
    ip route add default via $GATEWAY dev $SECONDARY_INTERFACE
    
    log_message "Switched to $SECONDARY_INTERFACE"
}

# 切换到主接口
switch_to_primary() {
    log_message "Switching to primary interface: $PRIMARY_INTERFACE"
    
    ifconfig $SECONDARY_INTERFACE down
    ifconfig $PRIMARY_INTERFACE up
    
    # 更新路由表
    ip route del default via $GATEWAY dev $SECONDARY_INTERFACE 2>/dev/null
    ip route add default via $GATEWAY dev $PRIMARY_INTERFACE
    
    log_message "Switched to $PRIMARY_INTERFACE"
}

# 主监控循环
main() {
    local CURRENT_INTERFACE=$PRIMARY_INTERFACE
    
    while true; do
        if check_connectivity $CURRENT_INTERFACE; then
            log_message "Current interface $CURRENT_INTERFACE is working"
            
            # 如果当前是备用接口,尝试切换回主接口
            if [ "$CURRENT_INTERFACE" = "$SECONDARY_INTERFACE" ]; then
                if check_connectivity $PRIMARY_INTERFACE; then
                    switch_to_primary
                    CURRENT_INTERFACE=$PRIMARY_INTERFACE
                fi
            fi
        else
            log_message "Current interface $CURRENT_INTERFACE is not working"
            
            # 切换到备用接口
            if [ "$CURRENT_INTERFACE" = "$PRIMARY_INTERFACE" ]; then
                if check_connectivity $SECONDARY_INTERFACE; then
                    switch_to_secondary
                    CURRENT_INTERFACE=$SECONDARY_INTERFACE
                else
                    log_message "ERROR: Both interfaces are down"
                fi
            fi
        fi
        
        sleep $CHECK_INTERVAL
    done
}

main

网络接口性能优化#

#!/bin/bash
# 网络接口性能优化工具

optimize_interface() {
    local INTERFACE=$1
    
    echo "Optimizing interface: $INTERFACE"
    
    # 设置 MTU
    sudo ifconfig $INTERFACE mtu 9000
    
    # 增加队列长度
    sudo ifconfig $INTERFACE txqueuelen 10000
    
    # 禁用 TCP 时间戳
    echo 0 | sudo tee /proc/sys/net/ipv4/tcp_timestamps
    
    # 启用 TCP 窗口缩放
    echo 1 | sudo tee /proc/sys/net/ipv4/tcp_window_scaling
    
    # 调整 TCP 缓冲区大小
    echo "4096 87380 16777216" | sudo tee /proc/sys/net/ipv4/tcp_rmem
    echo "4096 65536 16777216" | sudo tee /proc/sys/net/ipv4/tcp_wmem
    
    # 启用 TCP 快速打开
    echo 3 | sudo tee /proc/sys/net/ipv4/tcp_fastopen
    
    # 禁用 TCP 慢启动
    echo 1 | sudo tee /proc/sys/net/ipv4/tcp_no_metrics_save
    
    echo "Interface $INTERFACE optimized"
}

# 批量优化多个接口
optimize_all_interfaces() {
    INTERFACES=("eth0" "eth1" "wlan0")
    
    for INTERFACE in "${INTERFACES[@]}"; do
        if [ -d "/sys/class/net/$INTERFACE" ]; then
            optimize_interface $INTERFACE
        fi
    done
}

# 恢复默认设置
restore_defaults() {
    local INTERFACE=$1
    
    echo "Restoring defaults for interface: $INTERFACE"
    
    sudo ifconfig $INTERFACE mtu 1500
    sudo ifconfig $INTERFACE txqueuelen 1000
    
    echo "Defaults restored for $INTERFACE"
}

case "$1" in
    optimize)
        optimize_interface "$2"
        ;;
    optimize-all)
        optimize_all_interfaces
        ;;
    restore)
        restore_defaults "$2"
        ;;
    *)
        echo "Usage: $0 {optimize|optimize-all|restore}"
        exit 1
        ;;
esac

最佳实践#

  1. 使用 ip 命令替代:在新版本 Linux 中,优先使用 ip 命令替代 ifconfig
  2. 配置持久化:使用网络配置文件(如 /etc/network/interfaces)使配置持久化
  3. 备份配置:在进行重要配置更改前,先备份当前配置
  4. 监控接口状态:定期监控网络接口状态,及时发现和解决问题
  5. 合理设置 MTU:根据网络环境设置合适的 MTU 值
  6. 安全考虑:修改 MAC 地址等操作需要谨慎,避免违反网络策略
  7. 日志记录:记录重要的配置更改和事件,便于故障排查
  8. 测试配置:在生产环境应用配置前,先在测试环境验证

注意事项#

  • ifconfig 在某些 Linux 发行版中已被弃用,建议使用 ip 命令
  • 修改网络接口配置需要 root 权限
  • 修改网络配置可能导致网络连接中断
  • 在远程服务器上修改网络配置时要格外小心
  • 某些网络配置更改可能需要重启网络服务
  • 虚拟接口(如 eth0:0)的配置方法与物理接口不同
  • 不同 Linux 发行版的网络配置文件位置可能不同
  • 注意网络安全策略,避免违反组织规定