# Linux 网络配置 - 详解网络接口设置与管理

URL: https://caijiao.org/linux/network/configuration
Source: docs/linux/network/configuration.md
Description: 全面学习 Linux 网络配置方法，包括静态 IP 设置、DHCP 配置、网络接口管理和高级网络参数调整，实现高效网络连接。

## 1. 网络配置概述

Linux 网络配置是系统管理中的重要部分，合理配置网络接口对于确保系统网络连接的稳定性和性能至关重要。Linux 系统提供了多种配置网络的方法，包括命令行工具、配置文件和图形化界面。

### 1.1 网络配置方法

在 Linux 系统中，主要有以下几种网络配置方法：

- **命令行配置**：使用 `ifconfig`、`ip` 等命令临时配置网络
- **配置文件**：通过编辑配置文件实现持久化配置
- **图形界面配置**：通过桌面环境提供的网络管理工具配置
- **网络管理服务**：使用 NetworkManager、systemd-networkd 等服务管理网络

### 1.2 网络配置文件位置

不同的 Linux 发行版使用不同的网络配置文件：

- **Debian/Ubuntu 系统**：
  - `/etc/network/interfaces`：传统网络配置文件
  - `/etc/netplan/`：Ubuntu 18.04+ 使用的网络配置目录

- **RHEL/CentOS 系统**：
  - `/etc/sysconfig/network-scripts/ifcfg-*`：网络接口配置文件

- **通用配置文件**：
  - `/etc/resolv.conf`：DNS 解析配置
  - `/etc/hostname`：主机名配置
  - `/etc/hosts`：本地主机名解析

## 2. 网络接口配置基础

### 2.1 查看网络接口信息

在配置网络之前，首先需要了解系统中的网络接口信息：

```bash
# 使用 ifconfig 命令（传统方法）
ifconfig -a

# 使用 ip 命令（现代方法）
ip addr show
ip link show

# 查看网络接口统计信息
ip -s link

# 查看网络接口配置详情
ethtool eth0
```

### 2.2 使用 ifconfig 配置网络接口

`ifconfig` 是一个传统的网络配置命令，可以临时配置网络接口：

```bash
# 启用网络接口
ifconfig eth0 up

# 禁用网络接口
ifconfig eth0 down

# 配置静态 IP 地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255

# 配置多个 IP 地址到一个接口
ifconfig eth0:0 192.168.1.101 netmask 255.255.255.0

# 修改 MAC 地址
ifconfig eth0 hw ether 00:11:22:33:44:55

# 设置 MTU 值
ifconfig eth0 mtu 1500
```

注意：使用 `ifconfig` 命令的配置是临时的，系统重启后会丢失。

### 2.3 使用 ip 命令配置网络接口

`ip` 命令是现代 Linux 系统推荐使用的网络配置工具，功能更强大：

```bash
# 启用网络接口
ip link set eth0 up

# 禁用网络接口
ip link set eth0 down

# 配置 IP 地址
ip addr add 192.168.1.100/24 dev eth0

# 删除 IP 地址
ip addr del 192.168.1.100/24 dev eth0

# 添加第二个 IP 地址（别名）
ip addr add 192.168.1.101/24 dev eth0 label eth0:1

# 修改 MAC 地址
ip link set dev eth0 address 00:11:22:33:44:55

# 设置 MTU 值
ip link set dev eth0 mtu 1500

# 刷新网络接口
ip link set dev eth0 down
ip link set dev eth0 up
```

同样，使用 `ip` 命令的配置也是临时的，系统重启后会丢失。

## 3. 持久化网络配置

### 3.1 Debian/Ubuntu 系统网络配置

#### 3.1.1 使用 /etc/network/interfaces 配置

在 Debian/Ubuntu 系统中，可以通过编辑 `/etc/network/interfaces` 文件实现持久化网络配置：

```bash
# 编辑网络配置文件
nano /etc/network/interfaces
```

配置静态 IP：

```bash
# 回环接口
auto lo
iface lo inet loopback

# 配置静态 IP 的以太网接口
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
    dns-search example.com
```

配置 DHCP：

```bash
# 配置 DHCP 的以太网接口
auto eth0
iface eth0 inet dhcp
```

应用配置：

```bash
# 重启网络服务
/etc/init.d/networking restart
# 或
ifdown eth0 && ifup eth0
```

#### 3.1.2 使用 Netplan 配置（Ubuntu 18.04+）

Ubuntu 18.04 及更高版本使用 Netplan 进行网络配置：

```bash
# 查看 Netplan 配置文件
ls -la /etc/netplan/

# 编辑配置文件
nano /etc/netplan/01-network-manager-all.yaml
```

配置静态 IP：

```yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      addresses: [192.168.1.100/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
        search: [example.com]
```

配置 DHCP：

```yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      optional: true
```

应用配置：

```bash
# 应用 Netplan 配置
netplan apply

# 测试配置语法
netplan try
```

### 3.2 RHEL/CentOS 系统网络配置

在 RHEL/CentOS 系统中，网络接口配置文件位于 `/etc/sysconfig/network-scripts/` 目录下，以 `ifcfg-接口名` 命名：

```bash
# 编辑网络接口配置文件
nano /etc/sysconfig/network-scripts/ifcfg-eth0
```

配置静态 IP：

```ini
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
DEVICE=eth0
ONBOOT=yes
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
```

配置 DHCP：

```ini
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=eth0
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
DEVICE=eth0
ONBOOT=yes
```

应用配置：

```bash
# 重启网络服务（RHEL/CentOS 6）
/etc/init.d/network restart

# 重启网络服务（RHEL/CentOS 7+）
systemctl restart network

# 或重启特定接口
ifdown eth0 && ifup eth0
```

## 4. 路由配置

### 4.1 查看路由表

```bash
# 使用 route 命令（传统方法）
route -n

# 使用 ip 命令（现代方法）
ip route show
```

### 4.2 配置路由

```bash
# 添加默认路由
ip route add default via 192.168.1.1 dev eth0

# 添加网络路由
ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0

# 添加主机路由
ip route add 10.1.1.1 via 192.168.1.254 dev eth0

# 删除路由
ip route del 10.0.0.0/8

# 修改路由
ip route replace 10.0.0.0/8 via 192.168.1.250 dev eth0
```

### 4.3 持久化路由配置

#### 4.3.1 Debian/Ubuntu 系统

在 `/etc/network/interfaces` 文件中添加路由配置：

```bash
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    # 添加静态路由
    up ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
    up ip route add 172.16.0.0/12 via 192.168.1.253 dev eth0
```

#### 4.3.2 RHEL/CentOS 系统

创建路由配置文件 `/etc/sysconfig/network-scripts/route-eth0`：

```bash
# 方法1：网络/掩码 via 网关
10.0.0.0/8 via 192.168.1.254

# 方法2：使用完整的路由命令
# ADDRESS0=10.0.0.0
# NETMASK0=255.0.0.0
# GATEWAY0=192.168.1.254
# ADDRESS1=172.16.0.0
# NETMASK1=255.240.0.0
# GATEWAY1=192.168.1.253
```

或者在 `/etc/sysconfig/network` 文件中添加默认网关：

```ini
NETWORKING=yes
HOSTNAME=server.example.com
GATEWAY=192.168.1.1
```

## 5. DNS 配置

### 5.1 /etc/resolv.conf 文件

DNS 配置主要通过 `/etc/resolv.conf` 文件进行：

```bash
# 编辑 DNS 配置文件
nano /etc/resolv.conf
```

基本配置格式：

```
# 设置默认搜索域
search example.com sub.example.com

# 设置 DNS 服务器
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 1.1.1.1
```

### 5.2 持久化 DNS 配置

注意：在许多现代 Linux 系统中，`/etc/resolv.conf` 文件可能是由 NetworkManager、systemd-resolved 或其他网络服务自动生成的，直接编辑可能会被覆盖。

#### 5.2.1 Debian/Ubuntu 系统

在 `/etc/network/interfaces` 文件中配置：

```bash
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
    dns-search example.com
```

对于使用 Netplan 的系统：

```yaml
network:
  version: 2
  ethernets:
    eth0:
      addresses: [192.168.1.100/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
        search: [example.com]
```

#### 5.2.2 RHEL/CentOS 系统

在网络接口配置文件中配置：

```ini
# 在 /etc/sysconfig/network-scripts/ifcfg-eth0 中添加
DNS1=8.8.8.8
DNS2=8.8.4.4
DOMAIN=example.com
```

或者在 `/etc/sysconfig/network` 文件中配置：

```ini
# 在 /etc/sysconfig/network 中添加
DNS1=8.8.8.8
DNS2=8.8.4.4
DOMAIN=example.com
```

### 5.3 使用 systemd-resolved

在使用 systemd 的现代 Linux 系统中，可以通过 systemd-resolved 管理 DNS：

```bash
# 启用并启动 systemd-resolved 服务
systemctl enable systemd-resolved
systemctl start systemd-resolved

# 配置 DNS 服务器
nano /etc/systemd/resolved.conf
```

在 resolved.conf 中添加：

```ini
[Resolve]
DNS=8.8.8.8 8.8.4.4
Domains=example.com
```

然后重新启动服务：

```bash
systemctl restart systemd-resolved
```

## 6. 高级网络配置

### 6.1 网络接口绑定（Bonding）

网络接口绑定可以将多个物理网络接口组合成一个逻辑接口，提供冗余和负载均衡。

#### 6.1.1 Debian/Ubuntu 系统配置

1. 安装必要的软件包：

```bash
apt-get update
apt-get install ifenslave
```

2. 编辑网络配置文件：

```bash
nano /etc/network/interfaces
```

添加以下内容：

```bash
# 物理接口配置
auto eth0
iface eth0 inet manual
    bond-master bond0
auto eth1
iface eth1 inet manual
    bond-master bond0

# 绑定接口配置
auto bond0
iface bond0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bond-slaves eth0 eth1
    bond-mode 802.3ad  # LACP 模式
    bond-miimon 100    # 链路监控间隔（毫秒）
    bond-downdelay 200 # 接口宕机延迟
    bond-updelay 200   # 接口上线延迟
```

3. 加载 bonding 模块：

```bash
echo "bonding" >> /etc/modules
modprobe bonding
```

4. 重启网络服务：

```bash
/etc/init.d/networking restart
```

#### 6.1.2 RHEL/CentOS 系统配置

1. 创建绑定接口配置文件：

```bash
nano /etc/sysconfig/network-scripts/ifcfg-bond0
```

添加以下内容：

```ini
DEVICE=bond0
NAME=bond0
TYPE=Bond
BONDING_MASTER=yes
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
BONDING_OPTS="mode=4 miimon=100 downdelay=200 updelay=200"
```

2. 配置物理接口：

```bash
nano /etc/sysconfig/network-scripts/ifcfg-eth0
```

添加以下内容：

```ini
DEVICE=eth0
NAME=eth0
TYPE=Ethernet
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes
```

同样配置 eth1：

```bash
nano /etc/sysconfig/network-scripts/ifcfg-eth1
```

3. 重启网络服务：

```bash
systemctl restart network
```

### 6.2 虚拟局域网（VLAN）配置

VLAN 允许将单个物理网络划分为多个逻辑网络，提高网络安全性和性能。

#### 6.2.1 安装 VLAN 支持

```bash
# Debian/Ubuntu 系统
apt-get install vlan

# RHEL/CentOS 系统
yum install vconfig
```

#### 6.2.2 加载 8021q 模块

```bash
modprobe 8021q
echo "8021q" >> /etc/modules  # Debian/Ubuntu
echo "8021q" >> /etc/sysconfig/modules/8021q.modules  # RHEL/CentOS
```

#### 6.2.3 配置 VLAN 接口

**Debian/Ubuntu 系统**：

```bash
nano /etc/network/interfaces
```

添加以下内容：

```bash
# VLAN 10 配置
auto eth0.10
iface eth0.10 inet static
    address 192.168.10.100
    netmask 255.255.255.0
    gateway 192.168.10.1

# VLAN 20 配置
auto eth0.20
iface eth0.20 inet static
    address 192.168.20.100
    netmask 255.255.255.0
```

**RHEL/CentOS 系统**：

创建 VLAN 接口配置文件：

```bash
nano /etc/sysconfig/network-scripts/ifcfg-eth0.10
```

添加以下内容：

```ini
DEVICE=eth0.10
BOOTPROTO=static
IPADDR=192.168.10.100
NETMASK=255.255.255.0
GATEWAY=192.168.10.1
ONBOOT=yes
VLAN=yes
```

### 6.3 网络桥接配置

网络桥接允许将多个网络接口连接到一个虚拟交换机上，常用于虚拟化环境。

#### 6.3.1 安装桥接工具

```bash
# Debian/Ubuntu 系统
apt-get install bridge-utils

# RHEL/CentOS 系统
yum install bridge-utils
```

#### 6.3.2 配置网络桥接

**Debian/Ubuntu 系统**：

```bash
nano /etc/network/interfaces
```

添加以下内容：

```bash
# 物理接口配置
auto eth0
iface eth0 inet manual

# 桥接接口配置
auto br0
iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0
```

**RHEL/CentOS 系统**：

修改物理接口配置：

```bash
nano /etc/sysconfig/network-scripts/ifcfg-eth0
```

```ini
DEVICE=eth0
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
BRIDGE=br0
```

创建桥接接口配置：

```bash
nano /etc/sysconfig/network-scripts/ifcfg-br0
```

```ini
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
DELAY=0
```

## 7. 网络服务管理

### 7.1 NetworkManager

NetworkManager 是一个动态网络管理工具，常用于桌面环境，也可以在服务器上使用：

```bash
# 检查 NetworkManager 状态
systemctl status NetworkManager

# 启动/停止/重启 NetworkManager
systemctl start NetworkManager
systemctl stop NetworkManager
systemctl restart NetworkManager

# 设置开机自启/禁止开机自启
systemctl enable NetworkManager
systemctl disable NetworkManager

# 使用 nmcli 命令行工具管理网络
nmcli connection show
nmcli device status

# 创建新的网络连接
nmcli connection add type ethernet con-name eth0 ifname eth0 ip4 192.168.1.100/24 gw4 192.168.1.1

# 启动/停止网络连接
nmcli connection up eth0
nmcli connection down eth0

# 修改网络连接
nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"
```

### 7.2 systemd-networkd

systemd-networkd 是 systemd 的网络管理组件，适合服务器环境：

```bash
# 检查 systemd-networkd 状态
systemctl status systemd-networkd

# 启动/停止/重启 systemd-networkd
systemctl start systemd-networkd
systemctl stop systemd-networkd
systemctl restart systemd-networkd

# 设置开机自启/禁止开机自启
systemctl enable systemd-networkd
systemctl disable systemd-networkd

# 创建网络配置文件
nano /etc/systemd/network/20-eth0.network
```

示例配置：

```ini
[Match]
Name=eth0

[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=8.8.4.4

[DHCP]
# 如需使用 DHCP 取消注释下行
# UseDNS=true
```

## 8. 网络配置故障排除

### 8.1 常见网络配置问题

| 问题 | 可能原因 | 解决方案 |
|------|---------|---------|
| 网络接口无法启动 | 接口名称错误、驱动问题、硬件故障 | 检查接口名称、更新驱动、检查硬件连接 |
| 无法获取 IP 地址 | DHCP 服务器问题、网络配置错误 | 检查 DHCP 服务器、验证网络配置 |
| 可以 ping IP 但无法访问域名 | DNS 配置错误 | 检查 /etc/resolv.conf、测试 DNS 服务器 |
| 本地网络连通但无法访问互联网 | 网关配置错误、DNS 错误、防火墙问题 | 检查网关设置、DNS 配置、防火墙规则 |
| 网络连接不稳定 | 硬件问题、驱动问题、网络冲突 | 更换网线、更新驱动、检查 IP 冲突 |

### 8.2 网络配置验证

```bash
# 验证 IP 地址配置
ip addr show

# 验证路由配置
ip route show

# 测试网络连通性
ping -c 4 192.168.1.1
ping -c 4 8.8.8.8

# 测试 DNS 解析
dig www.example.com
nslookup www.example.com

# 检查网络连接状态
netstat -tuln
ss -tuln

# 查看网络接口错误统计
ip -s link

# 检查系统日志中的网络相关信息
journalctl -u network
journalctl -u NetworkManager
```

### 8.3 重置网络配置

如果遇到严重的网络配置问题，可以尝试重置网络配置：

```bash
# Debian/Ubuntu 系统
# 重置网络配置文件到默认状态
cp /etc/network/interfaces.dpkg-dist /etc/network/interfaces

# RHEL/CentOS 系统
# 备份当前配置
cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth0.bak
# 重新创建配置文件
cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << 'EOF'
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
EOF
```

## 9. 总结

Linux 网络配置是系统管理中的重要技能，本文介绍了从基础到高级的各种网络配置方法，包括临时配置和持久化配置，静态 IP 设置和 DHCP 配置，以及路由、DNS、网络接口绑定、VLAN 和网络桥接等高级功能。

通过本文的学习，您应该能够：

- 使用 ifconfig 和 ip 命令配置网络接口
- 通过编辑配置文件实现持久化网络配置
- 配置路由和 DNS 解析
- 设置高级网络功能，如网络接口绑定、VLAN 和网络桥接
- 使用 NetworkManager 和 systemd-networkd 等工具管理网络
- 诊断和解决常见的网络配置问题

在实际工作中，网络配置可能因 Linux 发行版和具体需求而有所不同，建议参考相关发行版的官方文档获取更详细的配置信息。
