🌐 第13课:网络接口配置

阶段三:网络配置第1/6课

📚 课程目标

一、Linux网络栈

应用层       │ HTTP/SSH/DNS/...
传输层       │ TCP/UDP
网络层       │ IP/ICMP/ARP
数据链路层    │ 以太网帧/VLAN
物理层       │ 网卡驱动/网线

1.1 网络接口命名

命名来源说明
eth0/eth1传统命名按检测顺序
ens33PCI插槽systemd predictable naming
enp0s3PCI位置bus+slot
enx001122334455MAC地址USB网卡
lo回环127.0.0.1
docker0桥接Docker创建

二、ip命令(核心工具)

2.1 查看网络接口

$ ip addr show | head -25
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 52:54:00:2d:df:12 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 10.3.4.3/22 metric 100 brd 10.3.7.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe2d:df12/64 scope link 
       valid_lft forever preferred_lft forever
3: br-0ce8d170b79f:  mtu 1500 qdisc noqueue state UP group default 
    link/ether 66:eb:f8:f6:93:34 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-0ce8d170b79f
       valid_lft forever preferred_lft forever
    inet6 fe80::64eb:f8ff:fef6:9334/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0:  mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 32:25:20:2d:f4:a7 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::3025:20ff:fe2d:f4a7/64 scope link
$ ip link show | head -15
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:2d:df:12 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
3: br-0ce8d170b79f:  mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
    link/ether 66:eb:f8:f6:93:34 brd ff:ff:ff:ff:ff:ff
4: docker0:  mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 32:25:20:2d:f4:a7 brd ff:ff:ff:ff:ff:ff
5: vethf680c5f@if2:  mtu 1500 qdisc noqueue master br-0ce8d170b79f state UP mode DEFAULT group default 
    link/ether ea:af:d9:da:08:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 0

2.2 配置IP地址

# 添加IP地址
sudo ip addr add 192.168.1.100/24 dev eth0

# 删除IP地址
sudo ip addr del 192.168.1.100/24 dev eth0

# 启用/禁用接口
sudo ip link set eth0 up
sudo ip link set eth0 down

# 修改MTU
sudo ip link set eth0 mtu 9000

2.3 路由管理

$ ip route show | head -10
default via 10.3.4.1 dev eth0 proto dhcp src 10.3.4.3 metric 100 
10.3.4.0/22 dev eth0 proto kernel scope link src 10.3.4.3 metric 100 
10.3.4.1 dev eth0 proto dhcp scope link src 10.3.4.3 metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 
172.18.0.0/16 dev br-0ce8d170b79f proto kernel scope link src 172.18.0.1 
183.60.82.98 via 10.3.4.1 dev eth0 proto dhcp src 10.3.4.3 metric 100 
183.60.83.19 via 10.3.4.1 dev eth0 proto dhcp src 10.3.4.3 metric 100
# 添加默认路由
sudo ip route add default via 192.168.1.1

# 添加静态路由
sudo ip route add 10.0.0.0/8 via 192.168.1.254

# 删除路由
sudo ip route del 10.0.0.0/8

# 查看路由到某IP的路径
ip route get 8.8.8.8

三、Netplan配置(Ubuntu)

$ ls /etc/netplan/
50-cloud-init.yaml
# /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
    eth1:
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]

# 应用配置
sudo netplan apply
sudo netplan try     # 交互式测试,超时自动回退

四、NetworkManager

# 查看连接
nmcli device status
nmcli connection show

# 创建静态IP连接
sudo nmcli connection add con-name static ifname eth0 type ethernet \
  ip4 192.168.1.100/24 gw4 192.168.1.1

# 修改DNS
sudo nmcli connection modify static ipv4.dns "8.8.8.8 8.8.4.4"

# 启用/禁用连接
sudo nmcli connection up static
sudo nmcli connection down static

五、网络诊断工具

$ ss -tlnp | head -10
State  Recv-Q Send-Q Local Address:Port  Peer Address:PortProcess                                                                             
LISTEN 0      511          0.0.0.0:443        0.0.0.0:*    users:(("nginx",pid=364290,fd=5),("nginx",pid=364289,fd=5),("nginx",pid=1055,fd=5))
LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=364290,fd=6),("nginx",pid=364289,fd=6),("nginx",pid=1055,fd=6))
LISTEN 0      4096         0.0.0.0:22         0.0.0.0:*    users:(("sshd",pid=1000,fd=3),("systemd",pid=1,fd=87))                             
LISTEN 0      511          0.0.0.0:12440      0.0.0.0:*    users:(("node",pid=544551,fd=25))                                                  
LISTEN 0      4096      127.0.0.54:53         0.0.0.0:*    users:(("systemd-resolve",pid=803,fd=17))                                          
LISTEN 0      10         127.0.0.1:9222       0.0.0.0:*    users:(("chrome",pid=1295,fd=73))                                                  
LISTEN 0      4096   127.0.0.53%lo:53         0.0.0.0:*    users:(("systemd-resolve",pid=803,fd=15))                                          
LISTEN 0      4096       127.0.0.1:45063      0.0.0.0:*    users:(("containerd",pid=1049,fd=14))                                              
LISTEN 0      511        127.0.0.1:12442      0.0.0.0:*    users:(("node",pid=544551,fd=27))
# ping - 测试连通性
ping -c 3 8.8.8.8

# traceroute - 路由追踪
traceroute 8.8.8.8

# mtr - 持续路由追踪
mtr 8.8.8.8

# nslookup/dig - DNS查询
dig google.com
nslookup google.com

# curl - HTTP测试
curl -I https://www.google.com

# nc - 端口测试
nc -zv host 22

# tcpdump - 抓包
sudo tcpdump -i eth0 -n port 80

六、网络命名空间

# 创建命名空间
sudo ip netns add ns1
sudo ip netns add ns2

# 在命名空间中运行命令
sudo ip netns exec ns1 ip link

# 连接两个命名空间(veth pair)
sudo ip link add veth1 type veth peer name veth2
sudo ip link set veth1 netns ns1
sudo ip link set veth2 netns ns2

# 配置IP并测试
sudo ip netns exec ns1 ip addr add 10.0.0.1/24 dev veth1
sudo ip netns exec ns1 ip link set veth1 up
sudo ip netns exec ns2 ip addr add 10.0.0.2/24 dev veth2
sudo ip netns exec ns2 ip link set veth2 up
sudo ip netns exec ns1 ping -c 2 10.0.0.2

七、故障排查

❌ 网络不通排查流程

# 1. 检查接口状态
ip link show

# 2. 检查IP地址
ip addr show

# 3. 检查路由
ip route show

# 4. 测试本地回环
ping -c 1 127.0.0.1

# 5. 测试网关
ping -c 1 192.168.1.1

# 6. 测试外网IP
ping -c 1 8.8.8.8

# 7. 测试DNS
ping -c 1 google.com

# 8. 抓包分析
sudo tcpdump -i eth0 -n

八、练习

📝 网络配置实战

# 1. 查看本机网络配置
ip addr
ip route
cat /etc/resolv.conf

# 2. 测试网络连通性
ping -c 3 8.8.8.8
dig google.com

# 3. 查看监听端口
ss -tlnp

# 4. 追踪路由
traceroute 8.8.8.8 2>/dev/null || tracepath 8.8.8.8
🏆

成就解锁:网络配置员

✅ 理解Linux网络栈

✅ 掌握ip命令

✅ 学会Netplan/nmcli配置

✅ 了解网络命名空间

✅ 掌握网络诊断工具

九、网络绑定(Bonding)

# 双网卡绑定,提供冗余和负载均衡
# /etc/netplan/01-bond.yaml
network:
  version: 2
  bonds:
    bond0:
      interfaces: [eth0, eth1]
      parameters:
        mode: active-backup    # 主备模式
        # mode: balance-rr     # 轮询
        # mode: 802.3ad        # LACP(需交换机支持)
      addresses: [192.168.1.100/24]
      routes:
        - to: default
          via: 192.168.1.1
模式编号说明
balance-rr0轮询,需要交换机支持
active-backup1主备,无需交换机配置
balance-xor2基于MAC哈希
802.3ad4LACP,需交换机支持

十、VLAN配置

# /etc/netplan/01-vlan.yaml
network:
  version: 2
  vlans:
    vlan10:
      id: 10
      link: eth0
      addresses: [10.10.10.100/24]
    vlan20:
      id: 20
      link: eth0
      addresses: [10.10.20.100/24]

十一、网络性能调优

# 调整TCP缓冲区
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

# TCP连接优化
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_fin_timeout=15
sudo sysctl -w net.core.somaxconn=65535

# 持久化 /etc/sysctl.conf
echo "net.core.rmem_max=16777216" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

十二、网络故障排查实战脚本

#!/bin/bash
# net-diag.sh - 网络诊断脚本
echo "===== 网络诊断报告 ====="
echo "时间: $(date)"
echo

echo "--- 1. 接口状态 ---"
ip -br addr

echo "\n--- 2. 路由表 ---"
ip route show

echo "\n--- 3. DNS配置 ---"
cat /etc/resolv.conf | grep nameserver

echo "\n--- 4. 连通性测试 ---"
ping -c 2 -W 2 127.0.0.1 > /dev/null && echo "✅ 回环" || echo "❌ 回环"
ping -c 2 -W 2 $(ip route | grep default | awk '{print $3}') > /dev/null && echo "✅ 网关" || echo "❌ 网关"
ping -c 2 -W 2 8.8.8.8 > /dev/null && echo "✅ 外网IP" || echo "❌ 外网IP"
ping -c 2 -W 2 google.com > /dev/null && echo "✅ DNS" || echo "❌ DNS"

echo "\n--- 5. 监听端口 ---"
ss -tlnp | head -10

echo "\n--- 6. 网络连接统计 ---"
ss -s

echo "\n--- 7. ARP表 ---"
ip neigh show | head -5