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 1000IPv6 配置#
# 添加 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最佳实践#
- 使用 ip 命令替代:在新版本 Linux 中,优先使用
ip命令替代ifconfig - 配置持久化:使用网络配置文件(如
/etc/network/interfaces)使配置持久化 - 备份配置:在进行重要配置更改前,先备份当前配置
- 监控接口状态:定期监控网络接口状态,及时发现和解决问题
- 合理设置 MTU:根据网络环境设置合适的 MTU 值
- 安全考虑:修改 MAC 地址等操作需要谨慎,避免违反网络策略
- 日志记录:记录重要的配置更改和事件,便于故障排查
- 测试配置:在生产环境应用配置前,先在测试环境验证
注意事项#
ifconfig在某些 Linux 发行版中已被弃用,建议使用ip命令- 修改网络接口配置需要 root 权限
- 修改网络配置可能导致网络连接中断
- 在远程服务器上修改网络配置时要格外小心
- 某些网络配置更改可能需要重启网络服务
- 虚拟接口(如 eth0:0)的配置方法与物理接口不同
- 不同 Linux 发行版的网络配置文件位置可能不同
- 注意网络安全策略,避免违反组织规定