网络管理¶
📌 学习时间: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:如何查看服务器上某个端口是否被占用?
Q2:如何排查网络不通的问题?
ping目标 IP — 检查网络层是否通traceroute— 定位在哪一跳断开dig/nslookup— 检查 DNS 解析是否正常ss -tlnp— 检查服务是否监听iptables -L— 检查防火墙规则curl -v— 检查应用层
Q3:scp 和 rsync 有什么区别?
scp是简单的全量复制,每次都传输完整文件。rsync支持增量传输(只传输差异部分),支持压缩、断点续传、排除文件、镜像同步等功能。对于频繁同步或大量文件建议用rsync。
Q4:如何配置 SSH 免密登录?
ssh-keygen生成密钥对ssh-copy-id user@server复制公钥- 确认
~/.ssh/authorized_keys和~/.ssh权限正确(700和600)- 测试:
ssh user@server
🔧 练习题¶
- 使用
ip addr和ss查看当前系统的网络配置和监听端口 - 使用
curl调用一个公开 API 并解析返回的 JSON - 配置 SSH 密钥认证,实现免密登录
- 使用
rsync编写自动备份脚本 - 配置
~/.ssh/config简化多台服务器的连接
✅ 自我检查¶
- 掌握 ip/ifconfig 查看和配置网络
- 能用 ss/netstat 查看网络连接和监听端口
- 能用 curl 发送各种 HTTP 请求
- 了解 iptables/firewalld/ufw 防火墙
- 能配置 SSH 密钥认证和端口转发
- 熟练使用 scp/rsync
上一章:06-Shell脚本编程 下一章:08-服务与系统管理