跳转至

网络管理

网络管理

📌 学习时间:2-3天 📌 难度级别:⭐⭐⭐ 中级 📌 前置知识:Linux基础、Shell编程基础


📚 章节概述

网络管理是 Linux 运维的关键技能。本章全面讲解网络配置与诊断工具(ifconfig/ip/netstat/ss)、DNS 工具(dig/nslookup)、HTTP 工具(curl/wget)、防火墙基础(iptables/firewalld)、SSH 高级配置以及远程文件传输。

🎯 学习目标

  • 掌握网络接口配置和查看(ifconfig/ip)
  • 熟练使用网络连接诊断工具(netstat/ss/ping/traceroute)
  • 掌握 DNS 查询工具(dig/nslookup)
  • 熟练使用 HTTP 工具(curl/wget)
  • 了解防火墙配置(iptables/firewalld)
  • 掌握 SSH 高级配置(密钥认证/端口转发/config文件)
  • 熟练使用远程传输工具(scp/rsync)

📖 1. 网络接口配置

1.1 ip 命令(新一代标准)

Bash
# ip 是 iproute2 工具包的核心命令,取代了传统的 ifconfig/route/arp

# 查看网络接口
ip addr show                      # 查看所有接口的 IP 地址
ip addr show eth0                 # 查看特定接口
ip a                              # 简写

# 查看链路状态
ip link show                      # 查看所有接口状态
ip link show eth0

# 配置接口(临时)
sudo ip addr add 192.168.1.100/24 dev eth0    # 添加 IP
sudo ip addr del 192.168.1.100/24 dev eth0    # 删除 IP
sudo ip link set eth0 up                       # 启用接口
sudo ip link set eth0 down                     # 禁用接口

# 查看路由表
ip route show                     # 查看路由表
ip route get 8.8.8.8             # 查看到达某IP的路由

# 添加/删除路由
sudo ip route add 10.0.0.0/8 via 192.168.1.1   # 添加静态路由
sudo ip route del 10.0.0.0/8                     # 删除路由
sudo ip route add default via 192.168.1.1        # 添加默认网关

# 查看 ARP 表(邻居表)
ip neigh show

# 查看网络统计
ip -s link show eth0              # 接口流量统计

1.2 ifconfig(传统命令)

Bash
# 安装 net-tools
sudo apt install net-tools

ifconfig                          # 查看所有活动接口
ifconfig -a                       # 查看所有接口(含未激活的)
ifconfig eth0                     # 查看特定接口

# 临时配置
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
sudo ifconfig eth0 down

# ip vs ifconfig 对照表
# ifconfig eth0              → ip addr show eth0
# ifconfig eth0 up           → ip link set eth0 up
# route -n                   → ip route show
# arp -a                     → ip neigh show

1.3 永久网络配置

Bash
# Ubuntu 22.04 (Netplan)
cat /etc/netplan/01-netcfg.yaml
# network:
#   version: 2
#   ethernets:
#     eth0:
#       dhcp4: false
#       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                # 应用配置

# CentOS 7 (NetworkManager)
cat /etc/sysconfig/network-scripts/ifcfg-eth0
# TYPE=Ethernet
# BOOTPROTO=static
# IPADDR=192.168.1.100
# NETMASK=255.255.255.0
# GATEWAY=192.168.1.1
# DNS1=8.8.8.8
# ONBOOT=yes

sudo systemctl restart network    # 重启网络

📖 2. 网络诊断工具

2.1 ping — 连通性测试

Bash
ping 8.8.8.8                     # 持续 ping(Ctrl+C 停止)
ping -c 5 8.8.8.8                # 只发5个包
ping -i 0.5 8.8.8.8              # 每0.5秒发一个包
ping -s 1024 8.8.8.8             # 指定包大小
ping -W 3 8.8.8.8                # 超时3秒
ping -f 8.8.8.8                  # 洪水 ping(需要root,压力测试用)
ping6 ::1                        # IPv6 ping

# ping 结果分析
# 64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.3 ms
# ttl: 存活时间(每经过一个路由器减1,初始通常是64或128)
# time: 往返时间

2.2 traceroute — 路由追踪

Bash
traceroute 8.8.8.8               # 追踪到 8.8.8.8 的路径
traceroute -n 8.8.8.8            # 不解析主机名(更快)
traceroute -I 8.8.8.8            # 使用 ICMP(有些路由器封UDP)
traceroute -T -p 80 example.com  # 使用 TCP

# mtr — traceroute + ping 的结合体(更好用)
sudo apt install mtr
mtr 8.8.8.8                      # 交互式
mtr -rn 8.8.8.8                  # 报告模式

2.3 netstat / ss — 网络连接查看

Bash
# ss 是 netstat 的现代替代品(更快)

# 查看监听端口
ss -tuln                          # TCP + UDP 监听端口(数字显示)
netstat -tuln                     # 同上(netstat 版本)

# 查看所有连接
ss -tuna                          # 所有 TCP+UDP 连接
ss -t state established           # 已建立的 TCP 连接

# 查看特定端口
ss -tlnp | grep ":80"            # 查看80端口
ss -tlnp | grep nginx            # 查看 nginx 的端口

# 统计连接状态
ss -s                             # 摘要统计

# 常用选项
# -t  TCP
# -u  UDP
# -l  监听状态
# -n  不解析服务名(显示数字端口)
# -p  显示进程名
# -a  所有连接
# -e  扩展信息
# -o  显示定时器

# 统计各状态连接数
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn  # awk文本处理:按列提取和格式化数据

# 查看连接最多的 IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

2.4 DNS 工具

Bash
# dig — DNS 查询(推荐)
dig example.com                   # 查询 A 记录
dig example.com MX                # 查询 MX 记录(邮件)
dig example.com NS                # 查询 NS 记录(名称服务器)
dig example.com AAAA              # 查询 IPv6 地址
dig example.com ANY               # 查询所有记录
dig +short example.com            # 简洁输出
dig @8.8.8.8 example.com         # 指定 DNS 服务器查询
dig +trace example.com            # 跟踪完整的DNS解析过程
dig -x 8.8.8.8                    # 反向查询(IP → 域名)

# nslookup — 交互式 DNS 查询
nslookup example.com
nslookup example.com 8.8.8.8     # 指定 DNS 服务器
nslookup -type=MX example.com    # 查询 MX 记录

# host — 简洁的 DNS 查询
host example.com
host -t MX example.com

# DNS 配置
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 8.8.4.4
# search example.com

# /etc/hosts — 本地 DNS 映射
cat /etc/hosts
# 127.0.0.1   localhost
# 192.168.1.10 myserver

📖 3. HTTP 工具

3.1 curl

Bash
# curl — 强大的命令行 HTTP 客户端

# 基本请求
curl http://example.com                 # GET 请求
curl -o output.html http://example.com  # 保存到文件
curl -O http://example.com/file.zip     # 保存(使用原始文件名)
curl -L http://example.com              # 跟随重定向
curl -v http://example.com              # 详细输出(调试用)
curl -s http://example.com              # 静默模式
curl -I http://example.com              # 只获取响应头

# POST 请求
curl -X POST -d "name=alice&age=25" http://api.example.com/users
curl -X POST -H "Content-Type: application/json" \
     -d '{"name":"alice","age":25}' http://api.example.com/users

# 其他 HTTP 方法
curl -X PUT -d '{"name":"bob"}' http://api.example.com/users/1
curl -X DELETE http://api.example.com/users/1
curl -X PATCH -d '{"age":26}' http://api.example.com/users/1

# 认证
curl -u user:password http://api.example.com
curl -H "Authorization: Bearer TOKEN" http://api.example.com

# 文件上传
curl -F "file=@photo.jpg" http://example.com/upload
curl -T localfile.txt ftp://example.com/remote_file.txt

# 下载文件
curl -O -L --progress-bar http://example.com/large_file.zip
curl -C - -O http://example.com/large_file.zip  # 断点续传

# 超时设置
curl --connect-timeout 5 --max-time 30 http://example.com

# 使用代理
curl -x http://proxy:8080 http://example.com
curl -x socks5://proxy:1080 http://example.com

# 实用脚本示例
# 检查网站可用性
check_site() {
    local url="$1"
    local code=$(curl -sL -o /dev/null -w '%{http_code}' "$url")
    echo "$url: HTTP $code"
}

3.2 wget

Bash
# wget — 非交互式下载器

wget http://example.com/file.tar.gz           # 下载文件
wget -O custom_name.zip http://example.com/f  # 指定文件名
wget -c http://example.com/large_file.zip     # 断点续传
wget -q http://example.com/file.zip           # 安静模式
wget -b http://example.com/huge_file.iso      # 后台下载
wget --limit-rate=1m http://example.com/f     # 限速 1MB/s
wget -r -np http://example.com/docs/          # 递归下载(镜像网站)
wget -r -l 2 -np http://example.com/          # 递归深度2层
wget -i url_list.txt                          # 从文件读取URLs批量下载
wget --mirror http://example.com/             # 完整镜像
wget --spider http://example.com/file.zip     # 检查链接是否有效

# curl vs wget
# curl: 支持更多协议,更适合API调用,输出到stdout
# wget: 更适合下载文件,支持递归下载,断点续传更方便

📖 4. 防火墙

4.1 iptables 基础

Bash
# iptables — Linux 传统防火墙工具

# 查看规则
sudo iptables -L -n -v            # 查看所有规则
sudo iptables -L -n --line-numbers  # 带行号

# 链(Chains)
# INPUT   — 入站流量
# OUTPUT  — 出站流量
# FORWARD — 转发流量

# 基本规则操作
# 允许 SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许回环接口
sudo iptables -A INPUT -i lo -j ACCEPT

# 拒绝其他所有入站(放在最后)
sudo iptables -A INPUT -j DROP

# 删除规则
sudo iptables -D INPUT 3                  # 删除第3条规则
sudo iptables -F                           # 清空所有规则

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4  # 保存
sudo iptables-restore < /etc/iptables/rules.v4  # 恢复

# 安装持久化
sudo apt install iptables-persistent

4.2 firewalld(CentOS/RHEL 默认)

Bash
# firewalld — 动态防火墙管理

# 基本操作
sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --state

# 查看规则
sudo firewall-cmd --list-all
sudo firewall-cmd --list-services
sudo firewall-cmd --list-ports

# 添加规则
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --add-port=8080/tcp --permanent

# 删除规则
sudo firewall-cmd --remove-service=http --permanent
sudo firewall-cmd --remove-port=8080/tcp --permanent

# 重新加载
sudo firewall-cmd --reload

# 区域管理
sudo firewall-cmd --get-zones
sudo firewall-cmd --get-default-zone
sudo firewall-cmd --set-default-zone=public

4.3 ufw(Ubuntu 简化防火墙)

Bash
# ufw — Uncomplicated Firewall
sudo ufw enable                    # 启用
sudo ufw disable                   # 禁用
sudo ufw status verbose            # 查看状态

# 添加规则
sudo ufw allow ssh                 # 允许 SSH
sudo ufw allow 80/tcp              # 允许 HTTP
sudo ufw allow 443/tcp             # 允许 HTTPS
sudo ufw allow from 192.168.1.0/24 # 允许特定网段
sudo ufw deny 3306                 # 拒绝 MySQL 端口

# 删除规则
sudo ufw delete allow 80/tcp

# 应用顺序
sudo ufw default deny incoming     # 默认拒绝入站
sudo ufw default allow outgoing    # 默认允许出站

📖 5. SSH 高级配置

5.1 SSH 密钥认证

Bash
# 1. 生成密钥对
ssh-keygen -t ed25519 -C "alice@example.com"   # 推荐 Ed25519
ssh-keygen -t rsa -b 4096 -C "alice@example.com"  # RSA 4096位

# 2. 复制公钥到服务器
ssh-copy-id user@server                        # 自动方式
# 或手动:
cat ~/.ssh/id_ed25519.pub | ssh user@server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'  # |管道:将前一命令的输出作为后一命令的输入

# 3. 测试密钥登录
ssh user@server                                # 不需要输入密码

# 4. 禁用密码登录(增强安全)
# 编辑 /etc/ssh/sshd_config
# PasswordAuthentication no
# PubkeyAuthentication yes
# PermitRootLogin prohibit-password
sudo systemctl restart sshd

5.2 SSH 端口转发(隧道)

Bash
# 本地端口转发(访问远程内网服务)
# 将本地 8080 端口转发到远程的 localhost:3306
ssh -L 8080:localhost:3306 user@server
# 现在访问本地 localhost:8080 = 远程 localhost:3306

# 远程端口转发(将远程端口转发到本地)
ssh -R 8080:localhost:80 user@server
# 现在访问远程 server:8080 = 本地 localhost:80

# 动态端口转发(SOCKS 代理)
ssh -D 1080 user@server
# 配置浏览器使用 SOCKS5 代理 localhost:1080

# 后台运行隧道
ssh -fNL 8080:localhost:3306 user@server
# -f 后台运行
# -N 不执行远程命令

5.3 SSH Config 文件

Bash
# ~/.ssh/config — 简化 SSH 连接

cat > ~/.ssh/config << 'EOF'
# 全局设置
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes
    IdentitiesOnly yes

# 开发服务器
Host dev
    HostName 192.168.1.100
    User alice
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# 生产服务器(通过跳板机)
Host prod
    HostName 10.0.0.100
    User deploy
    ProxyJump jump

# 跳板机
Host jump
    HostName bastion.example.com
    User alice
    Port 2222

# 多服务器批量配置
Host web-*
    User deploy
    IdentityFile ~/.ssh/deploy_key

Host web-01
    HostName 10.0.1.1

Host web-02
    HostName 10.0.1.2
EOF

# 使用配置连接
ssh dev                        # 等同于 ssh -i ~/.ssh/id_ed25519 alice@192.168.1.100
ssh prod                       # 自动通过跳板机连接

📖 6. 远程文件传输

6.1 scp

Bash
# scp — 基于 SSH 的安全复制

# 上传文件
scp file.txt user@server:/path/to/       # 上传文件
scp -r dir/ user@server:/path/to/        # 上传目录

# 下载文件
scp user@server:/path/file.txt ./        # 下载文件
scp -r user@server:/path/dir/ ./         # 下载目录

# 选项
scp -P 2222 file.txt user@server:        # 指定端口
scp -C file.txt user@server:             # 压缩传输
scp -i key.pem file.txt user@server:     # 指定密钥

# 服务器间传输
scp user1@server1:/file user2@server2:/path/

6.2 rsync

Bash
# rsync — 增量同步工具(比 scp 更强大)

# 基本同步
rsync -avz source/ user@server:/dest/    # 同步目录

# 常用选项
# -a  归档模式(保留权限、时间戳等)
# -v  详细输出
# -z  压缩传输
# -P  显示进度 + 支持断点续传
# --delete  删除目标端多余的文件(镜像同步)
# --exclude  排除文件
# --dry-run  模拟运行(不实际操作)

# 实际使用
rsync -avzP ./project/ user@server:/opt/project/   # 同步项目

# 镜像同步(危险:会删除目标端多余文件)
rsync -avz --delete source/ dest/

# 排除文件
rsync -avz --exclude='*.log' --exclude='node_modules' source/ dest/

# 从文件读取排除规则
rsync -avz --exclude-from='exclude.txt' source/ dest/

# 断点续传大文件
rsync -avz --partial --progress bigfile.tar.gz user@server:/backup/

# 本地目录同步(备份)
rsync -avz --delete /home/alice/ /backup/alice/

# 备份脚本常用组合
rsync -avz --delete \
    --exclude={'.cache','.tmp','node_modules'} \
    --backup --backup-dir="/backup/$(date +%F)" \  # $()命令替换:执行命令并获取输出
    /home/alice/ /backup/current/

📖 7. 面试要点

高频面试题

Q1:如何查看服务器上某个端口是否被占用?

Bash
ss -tlnp | grep ":80"         # 方法1
lsof -i :80                   # 方法2
netstat -tlnp | grep ":80"    # 方法3

Q2:如何排查网络不通的问题?

  1. ping 目标 IP — 检查网络层是否通
  2. traceroute — 定位在哪一跳断开
  3. dig / nslookup — 检查 DNS 解析是否正常
  4. ss -tlnp — 检查服务是否监听
  5. iptables -L — 检查防火墙规则
  6. curl -v — 检查应用层

Q3:scprsync 有什么区别?

scp 是简单的全量复制,每次都传输完整文件。rsync 支持增量传输(只传输差异部分),支持压缩、断点续传、排除文件、镜像同步等功能。对于频繁同步或大量文件建议用 rsync

Q4:如何配置 SSH 免密登录?

  1. ssh-keygen 生成密钥对
  2. ssh-copy-id user@server 复制公钥
  3. 确认 ~/.ssh/authorized_keys~/.ssh 权限正确(700和600)
  4. 测试:ssh user@server

🔧 练习题

  1. 使用 ip addrss 查看当前系统的网络配置和监听端口
  2. 使用 curl 调用一个公开 API 并解析返回的 JSON
  3. 配置 SSH 密钥认证,实现免密登录
  4. 使用 rsync 编写自动备份脚本
  5. 配置 ~/.ssh/config 简化多台服务器的连接

✅ 自我检查

  • 掌握 ip/ifconfig 查看和配置网络
  • 能用 ss/netstat 查看网络连接和监听端口
  • 能用 curl 发送各种 HTTP 请求
  • 了解 iptables/firewalld/ufw 防火墙
  • 能配置 SSH 密钥认证和端口转发
  • 熟练使用 scp/rsync

上一章06-Shell脚本编程 下一章08-服务与系统管理