linux ifconfig命令 (interface configuration)

命令简介

ifconfig 是一个用于配置和显示网络接口参数的传统网络管理工具。它可以用来配置网络接口的IP地址、子网掩码、广播地址等,也可以用来启用或禁用网络接口。虽然现代Linux系统推荐使用ip命令,但ifconfig在许多系统管理和脚本中仍然广泛使用。

注意:在较新的Linux发行版中,ifconfig已被视为过时工具,推荐使用ip命令。但它仍然在很多脚本和系统管理员的工作中广泛使用。

基本语法

# 基本格式
ifconfig [接口] [选项] [地址]

# 常用格式
ifconfig                          # 显示所有网络接口
ifconfig eth0                     # 显示特定接口
ifconfig eth0 192.168.1.100       # 配置IP地址
ifconfig eth0 up                  # 启用接口
ifconfig eth0 down                # 禁用接口

ifconfig 与 ip 命令对比

功能 ifconfig 命令 ip 命令
显示接口信息 ifconfig ip addr showip a
启用接口 ifconfig eth0 up ip link set eth0 up
禁用接口 ifconfig eth0 down ip link set eth0 down
配置IP地址 ifconfig eth0 192.168.1.100 ip addr add 192.168.1.100/24 dev eth0
删除IP地址 ifconfig eth0 0.0.0.0 ip addr del 192.168.1.100/24 dev eth0
显示路由表 route -n ip route showip r
添加默认网关 route add default gw 192.168.1.1 ip route add default via 192.168.1.1
显示ARP表 arp -a ip neigh show
状态 传统工具,逐步淘汰 现代工具,推荐使用
功能完整性 基本功能 功能更完整和强大

常用选项

选项 描述
-a 显示所有接口,包括未激活的
-s 显示简短信息(摘要)
-v 详细模式
up 启用网络接口
down 禁用网络接口
netmask 子网掩码 设置子网掩码
broadcast 广播地址 设置广播地址
pointopoint 地址 设置点对点连接地址
mtu 大小 设置最大传输单元(MTU)
hw 类型 地址 设置硬件(MAC)地址
arp 启用ARP协议
-arp 禁用ARP协议
promisc 启用混杂模式
-promisc 禁用混杂模式
multicast 启用多播
allmulti 启用接收所有多播包
metric N 设置接口度量值

安装ifconfig

在一些较新的Linux发行版中,ifconfig可能没有预装,需要手动安装net-tools包:

# 1. 检查是否已安装
which ifconfig
# 或
ifconfig --help 2>/dev/null || echo "ifconfig未安装"

# 2. Debian/Ubuntu
sudo apt-get update
sudo apt-get install net-tools

# 3. RHEL/CentOS
sudo yum install net-tools
# 或
sudo dnf install net-tools

# 4. Arch Linux
sudo pacman -S net-tools

# 5. openSUSE
sudo zypper install net-tools

# 6. Alpine Linux
sudo apk add net-tools

# 7. 验证安装
ifconfig
# 应该显示网络接口信息

# 8. 查看ifconfig版本
ifconfig --version
# 输出示例:net-tools 2.10-alpha

# 9. 相关工具
# net-tools包含的其他有用工具:
# - arp: 管理ARP缓存
# - route: 管理路由表
# - netstat: 网络统计信息
# - rarp: 反向地址解析协议
# - hostname: 显示或设置主机名
# - nameif: 基于MAC地址命名接口
# - plipconfig: 配置PLIP接口
# - slattach: 串行线接口连接

# 10. 从源码编译(不推荐)
wget https://sourceforge.net/projects/net-tools/files/net-tools-2.10.tar.xz
tar -xf net-tools-2.10.tar.xz
cd net-tools-2.10
./configure
make
sudo make install

实际示例

示例1:基本网络接口管理

使用ifconfig进行基本的网络接口管理:

# 1. 显示所有活动接口
ifconfig
# 输出示例:
# eth0: flags=4163  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
#        ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)
#        RX packets 123456  bytes 123456789 (117.7 MiB)
#        RX errors 0  dropped 0  overruns 0  frame 0
#        TX packets 98765  bytes 98765432 (94.1 MiB)
#        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 2. 显示所有接口(包括未激活的)
ifconfig -a
# 显示所有网络接口,包括未启用的

# 3. 显示特定接口
ifconfig eth0
# 只显示eth0接口的信息

# 4. 显示简短信息
ifconfig -s
# 输出示例:
# Iface   MTU   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
# eth0   1500  123456      0      0 0         98765      0      0      0 BMRU
# lo    65536    1234      0      0 0          1234      0      0      0 LRU

# 5. 启用网络接口
sudo ifconfig eth0 up
# 或
sudo ifup eth0

# 6. 禁用网络接口
sudo ifconfig eth0 down
# 或
sudo ifdown eth0

# 7. 配置IP地址
sudo ifconfig eth0 192.168.1.100
# 设置eth0的IP地址为192.168.1.100

# 8. 配置IP地址和子网掩码
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# 同时设置IP和子网掩码

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

# 10. 为接口添加多个IP地址
sudo ifconfig eth0:0 192.168.1.101
sudo ifconfig eth0:1 192.168.1.102
# 创建虚拟接口 eth0:0, eth0:1

# 11. 删除IP地址
sudo ifconfig eth0 0.0.0.0
# 清除eth0的所有IP地址

# 12. 删除虚拟接口
sudo ifconfig eth0:0 down
# 或
sudo ifconfig eth0:0 0.0.0.0

# 13. 设置MAC地址
sudo ifconfig eth0 hw ether 00:11:22:33:44:55
# 注意:需要先禁用接口
sudo ifconfig eth0 down
sudo ifconfig eth0 hw ether 00:11:22:33:44:55
sudo ifconfig eth0 up

# 14. 设置MTU(最大传输单元)
sudo ifconfig eth0 mtu 9000
# 设置MTU为9000字节(用于Jumbo frames)

# 15. 启用/禁用ARP
sudo ifconfig eth0 arp      # 启用ARP
sudo ifconfig eth0 -arp     # 禁用ARP

# 16. 启用/禁用混杂模式
sudo ifconfig eth0 promisc  # 启用混杂模式(监听所有流量)
sudo ifconfig eth0 -promisc # 禁用混杂模式

# 17. 查看接口统计信息
ifconfig eth0
# 查看RX/TX数据包统计

# 18. 重置接口统计
sudo ifconfig eth0 0
# 重置统计计数器

# 19. 检查接口状态
ifconfig eth0 | grep "flags"
# 输出示例:UP, BROADCAST, RUNNING, MULTICAST 表示接口正常

# 20. 验证网络连接
ping -c 3 8.8.8.8
# 测试网络连通性

示例2:高级网络配置

使用ifconfig进行高级网络配置:

#!/bin/bash
# 高级网络配置脚本

# 1. 配置静态IP地址
configure_static_ip() {
    local iface=$1
    local ip=$2
    local netmask=$3
    local gateway=${4:-""}

    echo "配置静态IP: $iface -> $ip/$netmask"

    # 禁用接口
    sudo ifconfig $iface down

    # 配置IP地址
    sudo ifconfig $iface $ip netmask $netmask

    # 启用接口
    sudo ifconfig $iface up

    # 配置网关(如果需要)
    if [ -n "$gateway" ]; then
        echo "配置默认网关: $gateway"
        sudo route add default gw $gateway
    fi

    echo "配置完成"
}

# 2. 配置DHCP
configure_dhcp() {
    local iface=$1

    echo "配置DHCP: $iface"

    # 释放当前IP
    sudo dhclient -r $iface

    # 获取新IP
    sudo dhclient $iface

    # 显示新配置
    ifconfig $iface
}

# 3. 创建虚拟局域网(VLAN)
create_vlan() {
    local base_iface=$1
    local vlan_id=$2
    local ip=$3
    local netmask=$4

    local vlan_iface="${base_iface}.${vlan_id}"

    echo "创建VLAN: $vlan_iface -> $ip/$netmask"

    # 加载VLAN模块
    sudo modprobe 8021q

    # 创建VLAN接口
    sudo vconfig add $base_iface $vlan_id

    # 配置IP地址
    sudo ifconfig $vlan_iface $ip netmask $netmask up

    echo "VLAN创建完成"
}

# 4. 创建网桥
create_bridge() {
    local br_name=$1
    shift
    local interfaces=("$@")

    echo "创建网桥: $br_name"

    # 安装网桥工具
    if ! command -v brctl &> /dev/null; then
        sudo apt-get install bridge-utils || sudo yum install bridge-utils
    fi

    # 创建网桥
    sudo brctl addbr $br_name

    # 添加接口到网桥
    for iface in "${interfaces[@]}"; do
        echo "添加接口到网桥: $iface"
        sudo brctl addif $br_name $iface
    done

    # 启用网桥
    sudo ifconfig $br_name up

    echo "网桥创建完成"
}

# 5. 创建绑定接口(Bonding)
create_bond() {
    local bond_iface=$1
    local mode=$2
    shift 2
    local slave_ifaces=("$@")

    echo "创建绑定接口: $bond_iface (模式: $mode)"

    # 加载绑定模块
    sudo modprobe bonding mode=$mode

    # 创建绑定接口
    sudo ifconfig $bond_iface 0.0.0.0 up

    # 配置绑定参数
    echo "$mode" | sudo tee /sys/class/net/$bond_iface/bonding/mode

    # 添加从属接口
    for iface in "${slave_ifaces[@]}"; do
        echo "添加从属接口: $iface"
        echo "+$iface" | sudo tee /sys/class/net/$bond_iface/bonding/slaves
    done

    echo "绑定接口创建完成"
}

# 6. 创建IP隧道
create_tunnel() {
    local tunnel_iface=$1
    local local_ip=$2
    local remote_ip=$3
    local tunnel_ip=$4

    echo "创建IP隧道: $tunnel_iface"

    # 创建GRE隧道
    sudo ip tunnel add $tunnel_iface mode gre local $local_ip remote $remote_ip ttl 255

    # 配置隧道IP
    sudo ifconfig $tunnel_iface $tunnel_ip up

    echo "IP隧道创建完成"
}

# 7. 配置网络别名(多个IP)
configure_aliases() {
    local base_iface=$1
    local network=$2
    local start_ip=$3
    local count=$4

    echo "为 $base_iface 配置 $count 个别名IP"

    for i in $(seq 0 $((count-1))); do
        ip_octet=$((start_ip + i))
        alias_ip="${network}.${ip_octet}"
        alias_iface="${base_iface}:${i}"

        echo "配置别名: $alias_iface -> $alias_ip"
        sudo ifconfig $alias_iface $alias_ip up
    done
}

# 8. 网络诊断工具
network_diagnostics() {
    local iface=$1

    echo "=== 网络诊断: $iface ==="
    echo ""

    # 接口状态
    echo "1. 接口状态:"
    ifconfig $iface

    echo ""

    # 路由表
    echo "2. 路由表:"
    route -n | grep $iface

    echo ""

    # ARP缓存
    echo "3. ARP缓存:"
    arp -a

    echo ""

    # 网络统计
    echo "4. 网络统计:"
    netstat -i

    echo ""

    # 连通性测试
    echo "5. 连通性测试:"
    ping -c 2 -I $iface 8.8.8.8
}

# 9. 保存网络配置
save_network_config() {
    local iface=$1
    local config_file="/etc/network/interfaces.d/$iface"

    echo "保存网络配置: $iface -> $config_file"

    # 获取当前配置
    local ip=$(ifconfig $iface | grep "inet " | awk '{print $2}')
    local netmask=$(ifconfig $iface | grep "inet " | awk '{print $4}')
    local broadcast=$(ifconfig $iface | grep "inet " | awk '{print $6}')

    # 创建配置文件
    cat > /tmp/$iface.cfg << EOF
# 网络接口配置: $iface
auto $iface
iface $iface inet static
    address $ip
    netmask $netmask
    broadcast $broadcast
EOF

    # 保存配置
    sudo cp /tmp/$iface.cfg $config_file
    echo "配置已保存到: $config_file"
}

# 10. 恢复网络配置
restore_network_config() {
    local iface=$1
    local config_file="/etc/network/interfaces.d/$iface"

    if [ -f "$config_file" ]; then
        echo "恢复网络配置: $iface"
        sudo ifdown $iface
        sudo ifup $iface
    else
        echo "配置文件不存在: $config_file"
    fi
}

# 主菜单
main_menu() {
    while true; do
        clear
        echo "=== 高级网络配置工具 ==="
        echo ""
        echo "1. 配置静态IP"
        echo "2. 配置DHCP"
        echo "3. 创建VLAN"
        echo "4. 创建网桥"
        echo "5. 创建绑定接口"
        echo "6. 创建IP隧道"
        echo "7. 配置网络别名"
        echo "8. 网络诊断"
        echo "9. 保存配置"
        echo "10. 恢复配置"
        echo "0. 退出"
        echo ""

        read -p "请选择操作: " choice

        case $choice in
            1)
                read -p "接口名: " iface
                read -p "IP地址: " ip
                read -p "子网掩码: " netmask
                read -p "网关(可选): " gateway
                configure_static_ip "$iface" "$ip" "$netmask" "$gateway"
                ;;
            2)
                read -p "接口名: " iface
                configure_dhcp "$iface"
                ;;
            3)
                read -p "基础接口: " base_iface
                read -p "VLAN ID: " vlan_id
                read -p "IP地址: " ip
                read -p "子网掩码: " netmask
                create_vlan "$base_iface" "$vlan_id" "$ip" "$netmask"
                ;;
            4)
                read -p "网桥名: " br_name
                echo "输入要添加到网桥的接口(用空格分隔):"
                read -p "接口: " interfaces_input
                IFS=' ' read -r -a interfaces <<< "$interfaces_input"
                create_bridge "$br_name" "${interfaces[@]}"
                ;;
            5)
                read -p "绑定接口名: " bond_iface
                read -p "绑定模式(1-6): " bond_mode
                echo "输入从属接口(用空格分隔):"
                read -p "接口: " slaves_input
                IFS=' ' read -r -a slaves <<< "$slaves_input"
                create_bond "$bond_iface" "$bond_mode" "${slaves[@]}"
                ;;
            6)
                read -p "隧道接口名: " tunnel_iface
                read -p "本地IP: " local_ip
                read -p "远程IP: " remote_ip
                read -p "隧道IP: " tunnel_ip
                create_tunnel "$tunnel_iface" "$local_ip" "$remote_ip" "$tunnel_ip"
                ;;
            7)
                read -p "基础接口: " base_iface
                read -p "网络地址(如192.168.1): " network
                read -p "起始IP(如100): " start_ip
                read -p "别名数量: " count
                configure_aliases "$base_iface" "$network" "$start_ip" "$count"
                ;;
            8)
                read -p "接口名: " iface
                network_diagnostics "$iface"
                ;;
            9)
                read -p "接口名: " iface
                save_network_config "$iface"
                ;;
            10)
                read -p "接口名: " iface
                restore_network_config "$iface"
                ;;
            0)
                echo "退出"
                exit 0
                ;;
            *)
                echo "无效选择"
                ;;
        esac

        echo ""
        read -p "按回车键继续..."
    done
}

# 运行主菜单
main_menu

示例3:网络故障排查

使用ifconfig进行网络故障排查:

#!/bin/bash
# 网络故障排查脚本

LOG_FILE="/var/log/network-troubleshoot.log"

# 记录日志
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 检查网络接口状态
check_interfaces() {
    log "检查网络接口状态..."

    echo "=== 网络接口状态 ===" | tee -a "$LOG_FILE"
    ifconfig -a | tee -a "$LOG_FILE"

    # 检查DOWN状态的接口
    local down_ifaces=$(ifconfig -a | grep "flags=" | grep -v "UP" | awk -F: '{print $1}')

    if [ -n "$down_ifaces" ]; then
        log "发现DOWN状态的接口: $down_ifaces"

        for iface in $down_ifaces; do
            log "尝试启用接口 $iface..."
            sudo ifconfig $iface up
            sleep 2

            if ifconfig $iface | grep -q "UP"; then
                log "接口 $iface 已成功启用"
            else
                log "警告: 无法启用接口 $iface"
            fi
        done
    fi
}

# 检查IP配置
check_ip_config() {
    log "检查IP配置..."

    echo "=== IP地址配置 ===" | tee -a "$LOG_FILE"
    ifconfig | grep -A 1 "flags" | tee -a "$LOG_FILE"

    # 检查是否有IP地址
    local interfaces_without_ip=$(ifconfig | awk '/flags/ {iface=$1} /inet / {iface=""} END {if(iface) print iface}')

    if [ -n "$interfaces_without_ip" ]; then
        log "发现没有IP地址的接口: $interfaces_without_ip"

        for iface in $interfaces_without_ip; do
            log "尝试为 $iface 配置DHCP..."
            sudo dhclient $iface
        done
    fi
}

# 检查网络连接
check_connectivity() {
    log "检查网络连接..."

    # 测试本地回环
    if ping -c 2 -W 1 127.0.0.1 >/dev/null 2>&1; then
        log "✓ 本地回环连接正常"
    else
        log "✗ 本地回环连接失败"
    fi

    # 测试网关连接
    local gateway=$(route -n | grep "^0.0.0.0" | awk '{print $2}' | head -1)

    if [ -n "$gateway" ]; then
        if ping -c 2 -W 1 $gateway >/dev/null 2>&1; then
            log "✓ 网关 $gateway 连接正常"
        else
            log "✗ 网关 $gateway 不可达"
        fi
    fi

    # 测试DNS服务器
    if grep -q "nameserver" /etc/resolv.conf 2>/dev/null; then
        local dns_server=$(grep "nameserver" /etc/resolv.conf | head -1 | awk '{print $2}')

        if [ -n "$dns_server" ]; then
            if ping -c 2 -W 1 $dns_server >/dev/null 2>&1; then
                log "✓ DNS服务器 $dns_server 可达"

                # 测试DNS解析
                if nslookup google.com $dns_server >/dev/null 2>&1; then
                    log "✓ DNS解析正常"
                else
                    log "✗ DNS解析失败"
                fi
            else
                log "✗ DNS服务器 $dns_server 不可达"
            fi
        fi
    fi

    # 测试外部网络
    if ping -c 2 -W 1 8.8.8.8 >/dev/null 2>&1; then
        log "✓ 外部网络连接正常 (8.8.8.8)"
    else
        log "✗ 外部网络连接失败"
    fi
}

# 检查路由表
check_routing() {
    log "检查路由表..."

    echo "=== 路由表 ===" | tee -a "$LOG_FILE"
    route -n | tee -a "$LOG_FILE"

    # 检查默认路由
    if ! route -n | grep -q "^0.0.0.0"; then
        log "警告: 没有默认路由"

        # 尝试添加默认路由
        local gateway=$(ifconfig | grep "inet " | grep -v "127.0.0.1" | awk '{print $2}' | sed 's/\.[0-9]*$/.1/')

        if [ -n "$gateway" ]; then
            log "尝试添加默认路由: $gateway"
            sudo route add default gw $gateway
        fi
    fi
}

# 检查网络统计信息
check_network_stats() {
    log "检查网络统计信息..."

    echo "=== 网络接口统计 ===" | tee -a "$LOG_FILE"
    ifconfig | grep -A 6 "flags" | grep -E "(RX|TX)" | tee -a "$LOG_FILE"

    # 检查错误和丢包
    local problematic_ifaces=$(ifconfig | awk '/flags/ {iface=$1} /errors|dropped/ {if($2>0 || $4>0) print iface}')

    if [ -n "$problematic_ifaces" ]; then
        log "发现有问题接口: $problematic_ifaces"

        for iface in $problematic_ifaces; do
            log "重置接口 $iface..."
            sudo ifconfig $iface down
            sleep 1
            sudo ifconfig $iface up
        done
    fi
}

# 检查DNS配置
check_dns() {
    log "检查DNS配置..."

    echo "=== DNS配置 ===" | tee -a "$LOG_FILE"
    cat /etc/resolv.conf 2>/dev/null | tee -a "$LOG_FILE" || echo "无/etc/resolv.conf文件" | tee -a "$LOG_FILE"
}

# 检查网络服务
check_network_services() {
    log "检查网络服务..."

    # 检查NetworkManager
    if systemctl is-active NetworkManager >/dev/null 2>&1; then
        log "NetworkManager正在运行"
    fi

    # 检查network服务
    if systemctl is-active network >/dev/null 2>&1; then
        log "network服务正在运行"
    fi

    # 检查systemd-networkd
    if systemctl is-active systemd-networkd >/dev/null 2>&1; then
        log "systemd-networkd正在运行"
    fi
}

# 修复常见网络问题
fix_common_issues() {
    log "尝试修复常见网络问题..."

    # 1. 刷新ARP缓存
    log "刷新ARP缓存..."
    sudo ip neigh flush all

    # 2. 刷新路由缓存
    log "刷新路由缓存..."
    sudo ip route flush cache

    # 3. 重启网络服务
    if systemctl is-active NetworkManager >/dev/null 2>&1; then
        log "重启NetworkManager..."
        sudo systemctl restart NetworkManager
    elif systemctl is-active network >/dev/null 2>&1; then
        log "重启network服务..."
        sudo systemctl restart network
    fi

    # 4. 重启网络接口
    log "重启网络接口..."
    for iface in $(ifconfig -a | grep "flags=" | awk -F: '{print $1}' | grep -v lo); do
        log "重启接口 $iface..."
        sudo ifconfig $iface down
        sleep 1
        sudo ifconfig $iface up
    done

    # 5. 刷新DHCP租约
    if command -v dhclient >/dev/null 2>&1; then
        log "刷新DHCP租约..."
        for iface in $(ifconfig -a | grep "flags=" | grep "UP" | awk -F: '{print $1}' | grep -v lo); do
            sudo dhclient -r $iface
            sudo dhclient $iface
        done
    fi
}

# 生成诊断报告
generate_report() {
    log "生成网络诊断报告..."

    local report_file="/tmp/network-diagnostic-$(date +%Y%m%d-%H%M%S).txt"

    {
        echo "=== 网络诊断报告 ==="
        echo "生成时间: $(date)"
        echo "主机名: $(hostname)"
        echo ""

        echo "1. 系统信息:"
        echo "内核版本: $(uname -r)"
        echo "发行版: $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
        echo ""

        echo "2. 网络接口状态:"
        ifconfig -a
        echo ""

        echo "3. 路由表:"
        route -n
        echo ""

        echo "4. DNS配置:"
        cat /etc/resolv.conf 2>/dev/null || echo "无配置"
        echo ""

        echo "5. 连接测试:"
        echo "本地回环: $(ping -c 1 -W 1 127.0.0.1 >/dev/null 2>&1 && echo '正常' || echo '失败')"
        echo "外部网络: $(ping -c 1 -W 1 8.8.8.8 >/dev/null 2>&1 && echo '正常' || echo '失败')"
        echo "DNS解析: $(nslookup google.com 8.8.8.8 >/dev/null 2>&1 && echo '正常' || echo '失败')"

    } > "$report_file"

    log "诊断报告已生成: $report_file"
    cat "$report_file"
}

# 主函数
main() {
    log "=== 开始网络故障排查 ==="

    # 检查是否以root运行
    if [ "$EUID" -ne 0 ]; then
        log "需要root权限运行此脚本"
        log "请使用: sudo $0"
        exit 1
    fi

    # 执行检查
    check_interfaces
    check_ip_config
    check_connectivity
    check_routing
    check_network_stats
    check_dns
    check_network_services

    # 询问是否修复
    read -p "是否尝试自动修复网络问题? (y/N): " fix_choice
    if [[ $fix_choice =~ ^[Yy]$ ]]; then
        fix_common_issues

        # 重新检查
        log "=== 修复后重新检查 ==="
        check_connectivity
    fi

    # 生成报告
    generate_report

    log "=== 故障排查完成 ==="
}

# 运行主函数
main

示例4:从ifconfig迁移到ip命令

ifconfig到ip命令的迁移指南:

#!/bin/bash
# ifconfig到ip命令迁移指南

# 1. 显示网络接口信息
echo "=== 显示网络接口信息 ==="
echo "ifconfig:"
ifconfig
echo ""
echo "等效的ip命令:"
ip addr show
# 或简写
ip a

# 2. 显示特定接口信息
echo ""
echo "=== 显示特定接口信息 ==="
echo "ifconfig eth0:"
ifconfig eth0
echo ""
echo "等效的ip命令:"
ip addr show dev eth0
# 或
ip a show eth0

# 3. 启用网络接口
echo ""
echo "=== 启用网络接口 ==="
echo "ifconfig eth0 up"
echo "等效的ip命令:"
echo "ip link set eth0 up"

# 4. 禁用网络接口
echo ""
echo "=== 禁用网络接口 ==="
echo "ifconfig eth0 down"
echo "等效的ip命令:"
echo "ip link set eth0 down"

# 5. 配置IP地址
echo ""
echo "=== 配置IP地址 ==="
echo "ifconfig eth0 192.168.1.100"
echo "等效的ip命令:"
echo "ip addr add 192.168.1.100/24 dev eth0"

# 6. 配置IP地址和子网掩码
echo ""
echo "=== 配置IP地址和子网掩码 ==="
echo "ifconfig eth0 192.168.1.100 netmask 255.255.255.0"
echo "等效的ip命令:"
echo "ip addr add 192.168.1.100/24 dev eth0"

# 7. 删除IP地址
echo ""
echo "=== 删除IP地址 ==="
echo "ifconfig eth0 0.0.0.0"
echo "等效的ip命令:"
echo "ip addr del 192.168.1.100/24 dev eth0"

# 8. 设置MAC地址
echo ""
echo "=== 设置MAC地址 ==="
echo "ifconfig eth0 hw ether 00:11:22:33:44:55"
echo "等效的ip命令:"
echo "ip link set dev eth0 address 00:11:22:33:44:55"

# 9. 设置MTU
echo ""
echo "=== 设置MTU ==="
echo "ifconfig eth0 mtu 1500"
echo "等效的ip命令:"
echo "ip link set dev eth0 mtu 1500"

# 10. 显示路由表
echo ""
echo "=== 显示路由表 ==="
echo "route -n"
echo "等效的ip命令:"
echo "ip route show"
# 或简写
echo "ip r"

# 11. 添加默认路由
echo ""
echo "=== 添加默认路由 ==="
echo "route add default gw 192.168.1.1"
echo "等效的ip命令:"
echo "ip route add default via 192.168.1.1"

# 12. 添加静态路由
echo ""
echo "=== 添加静态路由 ==="
echo "route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254"
echo "等效的ip命令:"
echo "ip route add 10.0.0.0/8 via 192.168.1.254"

# 13. 删除路由
echo ""
echo "=== 删除路由 ==="
echo "route del -net 10.0.0.0 netmask 255.0.0.0"
echo "等效的ip命令:"
echo "ip route del 10.0.0.0/8"

# 14. 显示ARP表
echo ""
echo "=== 显示ARP表 ==="
echo "arp -a"
echo "等效的ip命令:"
echo "ip neigh show"

# 15. 添加ARP条目
echo ""
echo "=== 添加ARP条目 ==="
echo "arp -s 192.168.1.100 00:11:22:33:44:55"
echo "等效的ip命令:"
echo "ip neigh add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent"

# 16. 删除ARP条目
echo ""
echo "=== 删除ARP条目 ==="
echo "arp -d 192.168.1.100"
echo "等效的ip命令:"
echo "ip neigh del 192.168.1.100 dev eth0"

# 17. 显示网络统计
echo ""
echo "=== 显示网络统计 ==="
echo "netstat -i"
echo "等效的ip命令:"
echo "ip -s link"

# 18. 显示特定接口统计
echo ""
echo "=== 显示特定接口统计 ==="
echo "ifconfig eth0"
echo "等效的ip命令:"
echo "ip -s link show eth0"

# 19. 迁移脚本示例
echo ""
echo "=== 自动迁移脚本示例 ==="
cat > /tmp/ifconfig-to-ip-migration.sh << 'EOF'
#!/bin/bash
# ifconfig到ip命令迁移助手

# 函数:转换ifconfig命令到ip命令
convert_ifconfig_to_ip() {
    local ifconfig_cmd="$1"

    echo "原ifconfig命令: $ifconfig_cmd"
    echo "转换结果:"

    case "$ifconfig_cmd" in
        # 显示所有接口
        "ifconfig"|"ifconfig -a")
            echo "ip addr show"
            ;;

        # 显示特定接口
        ifconfig\ *)
            local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
            echo "ip addr show dev $iface"
            ;;

        # 启用接口
        *"ifconfig"*" up"*)
            local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
            echo "ip link set $iface up"
            ;;

        # 禁用接口
        *"ifconfig"*" down"*)
            local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
            echo "ip link set $iface down"
            ;;

        # 配置IP地址
        *"ifconfig"*"netmask"*)
            local iface=$(echo "$ifconfig_cmd" | awk '{print $2}')
            local ip=$(echo "$ifconfig_cmd" | awk '{print $3}')
            local netmask=$(echo "$ifconfig_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="netmask") print $(i+1)}')

            # 转换子网掩码为CIDR
            local cidr=$(ipcalc -b "$ip/$netmask" 2>/dev/null | grep "Netmask:" | awk '{print $2}' | cut -d'/' -f2)

            if [ -n "$cidr" ]; then
                echo "ip addr add $ip/$cidr dev $iface"
            else
                echo "# 需要计算CIDR: $ip/$netmask"
            fi
            ;;

        # 默认情况
        *)
            echo "# 无法自动转换,请手动转换"
            ;;
    esac
    echo ""
}

# 函数:转换route命令到ip命令
convert_route_to_ip() {
    local route_cmd="$1"

    echo "原route命令: $route_cmd"
    echo "转换结果:"

    case "$route_cmd" in
        # 显示路由表
        "route"|"route -n")
            echo "ip route show"
            ;;

        # 添加默认路由
        *"route add default gw"*)
            local gateway=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="gw") print $(i+1)}')
            echo "ip route add default via $gateway"
            ;;

        # 添加静态路由
        *"route add -net"*)
            local network=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="-net") print $(i+1)}')
            local netmask=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="netmask") print $(i+1)}')
            local gateway=$(echo "$route_cmd" | awk '{for(i=1;i<=NF;i++) if($i=="gw") print $(i+1)}')

            if [ -n "$netmask" ] && [ -n "$gateway" ]; then
                # 转换子网掩码为CIDR
                local cidr=$(ipcalc -b "$network/$netmask" 2>/dev/null | grep "Netmask:" | awk '{print $2}' | cut -d'/' -f2)

                if [ -n "$cidr" ]; then
                    echo "ip route add $network/$cidr via $gateway"
                else
                    echo "# 需要计算CIDR: $network/$netmask"
                fi
            fi
            ;;

        # 删除路由
        *"route del"*)
            echo "# 请使用: ip route del <目标网络>"
            ;;

        # 默认情况
        *)
            echo "# 无法自动转换,请手动转换"
            ;;
    esac
    echo ""
}

# 主菜单
main_menu() {
    while true; do
        clear
        echo "=== ifconfig/route 到 ip 命令转换工具 ==="
        echo ""
        echo "1. 转换ifconfig命令"
        echo "2. 转换route命令"
        echo "3. 批量转换脚本"
        echo "4. 创建别名"
        echo "5. 测试转换"
        echo "0. 退出"
        echo ""

        read -p "请选择: " choice

        case $choice in
            1)
                echo "输入ifconfig命令(如: ifconfig eth0 192.168.1.100 netmask 255.255.255.0):"
                read -r ifconfig_cmd
                convert_ifconfig_to_ip "$ifconfig_cmd"
                ;;
            2)
                echo "输入route命令(如: route add default gw 192.168.1.1):"
                read -r route_cmd
                convert_route_to_ip "$route_cmd"
                ;;
            3)
                echo "=== 批量转换示例 ==="
                echo ""
                echo "转换常见的ifconfig命令:"
                echo "1. ifconfig -> ip addr show"
                echo "2. ifconfig eth0 -> ip addr show dev eth0"
                echo "3. ifconfig eth0 up -> ip link set eth0 up"
                echo "4. ifconfig eth0 192.168.1.100 netmask 255.255.255.0 -> ip addr add 192.168.1.100/24 dev eth0"
                echo ""
                echo "转换常见的route命令:"
                echo "1. route -n -> ip route show"
                echo "2. route add default gw 192.168.1.1 -> ip route add default via 192.168.1.1"
                echo "3. route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254 -> ip route add 10.0.0.0/8 via 192.168.1.254"
                ;;
            4)
                echo "=== 创建命令别名 ==="
                echo ""
                echo "在 ~/.bashrc 或 ~/.bash_aliases 中添加以下别名:"
                echo ""
                echo "# ifconfig别名"
                echo "alias ifconfig='ip addr show'"
                echo "alias ifup='ip link set'"
                echo "alias ifdown='ip link set'"
                echo ""
                echo "# route别名"
                echo "alias route='ip route show'"
                echo ""
                echo "然后运行: source ~/.bashrc"
                ;;
            5)
                echo "=== 测试转换 ==="
                echo ""
                echo "运行以下命令测试:"
                echo "1. ip addr show"
                echo "2. ip link show"
                echo "3. ip route show"
                echo "4. ip -s link"
                echo "5. ip neigh show"
                ;;
            0)
                echo "退出"
                exit 0
                ;;
            *)
                echo "无效选择"
                ;;
        esac

        echo ""
        read -p "按回车键继续..."
    done
}

# 运行主菜单
main_menu
EOF

# 运行迁移助手
bash /tmp/ifconfig-to-ip-migration.sh

常见问题

解决方案:

  1. 安装net-tools:
    # Debian/Ubuntu
    sudo apt-get update
    sudo apt-get install net-tools
    
    # RHEL/CentOS
    sudo yum install net-tools
    
    # Arch Linux
    sudo pacman -S net-tools
    
    # 验证安装
    which ifconfig
    ifconfig --version
  2. 使用ip命令替代:
    # 显示网络接口
    ip addr show
    # 或简写
    ip a
    
    # 启用接口
    ip link set eth0 up
    
    # 禁用接口
    ip link set eth0 down
    
    # 配置IP地址
    ip addr add 192.168.1.100/24 dev eth0
  3. 创建别名:
    # 在~/.bashrc中添加别名
    echo "alias ifconfig='ip addr show'" >> ~/.bashrc
    source ~/.bashrc
    
    # 现在ifconfig会调用ip addr show
    ifconfig
  4. 从源码编译:
    # 下载net-tools源码
    wget https://sourceforge.net/projects/net-tools/files/net-tools-2.10.tar.xz
    tar -xf net-tools-2.10.tar.xz
    cd net-tools-2.10
    ./configure
    make
    sudo make install

永久保存配置:

  1. 使用网络配置文件:
    # Debian/Ubuntu
    sudo nano /etc/network/interfaces
    # 添加:
    auto eth0
    iface eth0 inet static
        address 192.168.1.100
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4
    
    # RHEL/CentOS/Fedora
    sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
    # 添加:
    DEVICE=eth0
    BOOTPROTO=static
    IPADDR=192.168.1.100
    NETMASK=255.255.255.0
    GATEWAY=192.168.1.1
    DNS1=8.8.8.8
    DNS2=8.8.4.4
    ONBOOT=yes
    
    # 重启网络
    sudo systemctl restart network
  2. 使用NetworkManager:
    # 使用nmcli配置
    sudo nmcli connection add type ethernet ifname eth0 \
        ip4 192.168.1.100/24 gw4 192.168.1.1
    
    # 或修改现有连接
    sudo nmcli connection modify "有线连接 1" \
        ipv4.addresses 192.168.1.100/24 \
        ipv4.gateway 192.168.1.1 \
        ipv4.dns "8.8.8.8 8.8.4.4" \
        ipv4.method manual
  3. 创建启动脚本:
    # 创建systemd服务
    sudo nano /etc/systemd/system/network-config.service
    # 内容:
    [Unit]
    Description=Network Configuration
    After=network.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/configure-network.sh
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    
    # 创建配置脚本
    sudo nano /usr/local/bin/configure-network.sh
    # 内容:
    #!/bin/bash
    ifconfig eth0 192.168.1.100 netmask 255.255.255.0
    route add default gw 192.168.1.1
    
    # 启用服务
    sudo systemctl enable network-config.service
  4. 使用cron:
    # 添加@reboot任务
    sudo crontab -e
    # 添加:
    @reboot /usr/local/bin/configure-network.sh

完整迁移步骤:

  1. 学习ip命令语法:
    # 基本命令结构
    ip [选项] 对象 命令 [参数]
    
    # 常用对象:
    # link    - 网络设备
    # addr    - IP地址
    # route   - 路由表
    # neigh   - ARP/NDP缓存
    # rule    - 策略路由规则
    # maddr   - 多播地址
    # tunnel  - IP隧道
    
    # 常用命令:
    # show    - 显示信息
    # add     - 添加
    # del     - 删除
    # set     - 设置
  2. 创建命令对照表:
    # 常用命令对照
    echo "ifconfig          -> ip addr show"
    echo "ifconfig eth0     -> ip addr show dev eth0"
    echo "ifconfig eth0 up  -> ip link set eth0 up"
    echo "ifconfig eth0 down -> ip link set eth0 down"
    echo "route -n          -> ip route show"
    echo "arp -a            -> ip neigh show"
  3. 更新脚本:
    # 查找使用ifconfig的脚本
    grep -r "ifconfig" /etc/ /usr/local/bin/ ~/scripts/ 2>/dev/null
    
    # 替换为ip命令
    # 示例替换:
    # 原:ifconfig eth0 192.168.1.100
    # 新:ip addr add 192.168.1.100/24 dev eth0
    
    # 使用sed批量替换
    sed -i 's/ifconfig eth0 \([0-9.]*\) netmask \([0-9.]*\)/ip addr add \1\/\2 dev eth0/g' script.sh
  4. 设置别名:
    # 在~/.bash_aliases中添加
    cat >> ~/.bash_aliases << 'EOF'
    # ifconfig别名
    alias ifconfig='ip addr show'
    alias ifup='ip link set'
    alias ifdown='ip link set'
    
    # route别名
    alias route='ip route show'
    
    # arp别名
    alias arp='ip neigh show'
    EOF
    
    source ~/.bash_aliases
  5. 卸载net-tools:
    # 确认不再需要ifconfig
    sudo apt-get remove net-tools
    # 或
    sudo yum remove net-tools
  6. 验证迁移:
    # 测试所有功能
    ip addr show
    ip link show
    ip route show
    ip -s link
    ip neigh show
    
    # 验证脚本运行
    ./your-script.sh