计算机网络基础 与 Linux 系统运维
目录
-
前言
-
计算机网络基础(自底向上)
- 物理层与早期全连接网络
- 数据链路层:MAC 与以太网、交换机
- 网络层:IP 与路由
- ARP、默认网关与子网通信
- NAT(网络地址转换)与端口
- 传输层:TCP 与 UDP 对比
- 常见网络命令速查
-
Linux 系统运维基础
- 常用软件/工具(SSH 客户端,云环境)
- systemd(由来、概述、主要命令)
- Unit(类型、状态、管理、依赖与配置文件)
- Target 与传统 RunLevel 的对应
- 环境变量、bash 基础
- 常用系统工具(lscpu、top、ps、netstat、ip、ifconfig、vmstat)
- 文件系统与常见目录说明
- 软件包管理与常用镜像站
-
静态与动态网页部署(快速流程)
- 用户/权限设置
- Nginx 静态站点部署(示例命令)
- Node / Hexo 简要流程
- 动态站点 / Spring Boot 提示
-
NAT 与 STUN 实验(深入)
- 前言与范围(仅 IPv4)
- 关键概念:mapping 与 filtering
- 详细概念(IP/TCP/UDP 四元组说明)
- RFC 中的分类(mapping/filtering 类型)
- 测试目的与需上报结果
- 测试方法、工具与命令示例
- Tips 与多层 NAT 的影响
-
参阅与附录(命令速查表、常见示例)
1. 前言
- 文档限定讨论 IPv4 与与 NAT/Socket 编程相关的行为。部分表述以教学推理为主,可能与 RFC(标准描述)在措辞上不同。
- 若对某些术语陌生,可参考文末的 RFC 与外部资料(例如 RFC4787、RFC5382)。
2. 计算机网络基础(自底向上方法)
物理层与早期网络模型
- 最早的情形:两台主机通过物理介质(软盘、网线)直连进行通信。
- 随主机数量增多,点对点的全连接变得不现实,需要分层抽象。
数据链路层:MAC 与以太网、交换机
- MAC 地址:由设备厂商在生产时写入硬件(在全球范围内应保持唯一性),用于链路层帧的目的/源识别。
- 使用集线器(hub)时,所有端口广播帧;接收主机检查目的 MAC,非目标丢弃。
- 交换机(Switch) 工作在数据链路层:通过学习帧源 MAC 与进出端口建立转发表(MAC table),只向目标端口转发帧,减少广播。
- 当多个交换机级联时,端口映射会出现“汇总到上行端口”的情况(如表格示例),说明上行端口连接了一整段网段。
示例 MAC 表:
| MAC 地址 | 端口 |
|---|---|
| EE:EE:EE:EE:EE:EE | 4 |
| FF:FF:FF:FF:FF:FF | 4 |
| … | 4 |
备注:交换机自身不会像主机那样持有 IP(除非是管理型交换机),但当网络划分与路由需要出现时,会引入更高层次的设备(路由器)。
网络层:IP 与路由
- IP 地址:抽象出来用于标识网络/子网与主机,通常与子网前缀一起确定是否在同一网段。
- 路由器负责不同子网之间的定向转发(routing)。
- 子网内通信:直接在网卡层发送帧;子网外通信:需要发送到默认网关(Default Gateway)。
ARP(地址解析协议)与网关
- ARP 用于把 IP 地址解析为链路层 MAC 地址(仅在同一子网内)。
- 当目标在同一子网内,主机直接发帧到目标 MAC;当目标不在本地子网,主机发帧到网关的 MAC(先用 ARP 查询)。
示例场景:
- A 与 B 在同一子网:A 用 B 的 IP + B 的 MAC 直接发送。
- A 想发给 C(位于子网外):A 把目的 IP 写为 C,但目的 MAC 写为网关的 MAC(通过 ARP 获取)。
NAT(网络地址转换)简介
- IPv4 的地址空间有限(32位),NAT 允许多台私有网络主机共享一个公网地址,通过端口复用实现。
- 路由器利用源 IP 与源端口(以及目标信息)来维护映射表,从而把外部回复分回到内部主机。
- NAT 对传出与传入包的行为可分类(下文有更详尽描述)。
私有地址段示例(常见分配):
- 10.0.0.0/8(大型机构或学校)
- 172.16.0.0/12(机构局域网)
- 192.168.0.0/16(家庭/小型局域网)
传输层:TCP 与 UDP 的对比
- TCP(Transmission Control Protocol):面向连接(可靠),三次握手建立连接,丢包重传、流量控制和序列号保证数据可靠性。类比:电话通话。
- UDP(User Datagram Protocol):无连接、不保证可靠到达、无重传。类比:广播、路边表演,听的自己算。
差异要点(编程视角):
- UDP:发送方指定目的 IP/端口,可选
bind()指定源 IP/端口;若不指定系统自动分配源端口。 - TCP:主动
connect()时,目的地址由程序指定;源地址/端口通常由操作系统分配(或bind()指定)。
常见网络命令速查
arp:查看/修改 ARP 缓存traceroute:跟踪路由路径ifconfig/ip:查看/配置网卡信息(ip是更现代的替代)netstat -tunlp:查看网络连接与监听端口tcpdump:抓包分析(未在原文详述,但常用)
3. Linux 系统运维基础
本节为对原始笔记中关于 Systemd、常用命令与运维实践的整理。
常用软件与环境
- SSH 客户端:Linux/Mac 自带;Windows 推荐
git-for-windows、PuTTY、MobaXTerm、XShell、Termius 等。 - 课程环境示例:在华为云上使用鲲鹏芯片运行 Euler OS(示例环境),使用
nexo、搭建 Nginx 等。
systemd(由来与概述)
- 传统上 Linux 引导使用
init;缺点:串行启动慢、启动脚本复杂。 systemd是现代替代方案,目标是提供完整、并行化的启动与管理解决方案,成为 PID=1 的第一个进程。systemd的优缺点:功能强大但复杂,有争议(违反 UNIX 简单哲学的批评)。
查看版本:
$ systemctl --version
systemd 的主要命令与日常操作
-
管理系统电源与状态:
sudo systemctl rebootsudo systemctl poweroffsudo systemctl haltsudo systemctl suspendsudo systemctl hibernatesudo systemctl hybrid-sleepsudo systemctl rescue
-
查看启动耗时:
systemd-analyze
-
查看/设置主机信息:
hostnamectl,sudo hostnamectl set-hostname <name>
-
本地化/时区:
localectl,timedatectl
-
登录会话信息:
loginctl list-sessions
Unit(单元)
-
systemd 将系统资源抽象为各种 Unit,常见有 12 种:
- Service、Target、Device、Mount、Automount、Path、Scope、Slice、Snapshot、Socket、Swap、Timer
-
列出 Unit:
systemctl list-unitssystemctl list-units --all(包含 inactive/failed)systemctl list-units --type=service
-
查询状态:
systemctl status <unit>- 脚本级别查询:
systemctl is-active <unit>、systemctl is-failed <unit>、systemctl is-enabled <unit>
Unit 管理(常用)
- 启动/停止/重启/重新加载:
sudo systemctl start apache.service
sudo systemctl stop apache.service
sudo systemctl restart apache.service
sudo systemctl reload apache.service
- 重新加载 systemd 配置(在修改 Unit 文件后):
sudo systemctl daemon-reload
- 查看与设置 Unit 的属性:
systemctl show httpd.service
systemctl show -p CPUShares httpd.service
sudo systemctl set-property httpd.service CPUShares=500
- 强制杀死服务:
sudo systemctl kill apache.service
Unit 的依赖关系
systemctl list-dependencies <unit>:显示依赖树。- 使用
--all可以展开 Target 类型的依赖。
Unit 配置文件(.service 等)
- 默认位置:
/etc/systemd/system/(多为符号链接),实际配置通常在/usr/lib/systemd/system/或/lib/systemd/system/。 systemctl enable <unit>:为 Unit 建立开机启动的符号链接(等同于手动 ln -s);systemctl disable取消。- Unit 文件由多个区块组成(例如
[Unit],[Service],[Install]),区块与字段均区分大小写。 - 查看 Unit 文件内容:
systemctl cat <unit>。 - 列出 Unit 文件与其状态:
systemctl list-unit-files(字段状态:enabled / disabled / static / masked)。
示例 Unit 文件格式:
[Unit]
Description=ATD daemon
[Service]
Type=forking
ExecStart=/usr/bin/atd
[Install]
WantedBy=multi-user.target
修改 Unit 文件后需运行
sudo systemctl daemon-reload,并重启对应服务以生效。
Target(与 RunLevel 对比)
-
Target 是多个 Unit 的集合,类似于传统 init 的 RunLevel,但 Targets 可以并行存在。
-
常用命令:
systemctl list-unit-files --type=targetsystemctl list-dependencies multi-user.targetsystemctl get-default,sudo systemctl set-default multi-user.targetsudo systemctl isolate multi-user.target(切换并关闭前一 Target 中不属于当前的 Unit)
RunLevel 与 Target 的对应示例:
| 传统 RunLevel | 新 Target 名称 | 链接到 … |
|---|---|---|
| 0 | runlevel0.target | poweroff.target |
| 1 | runlevel1.target | rescue.target |
| 2,3,4 | runlevel[2-4].target | multi-user.target |
| 5 | runlevel5.target | graphical.target |
| 6 | runlevel6.target | reboot.target |
环境变量 & shell
-
常见环境变量:
$HOME,$PATH,$LANG,$PS1。 -
login shell 与 non-login shell:
- 登录 shell 会读取
/etc/profile,~/.bash_profile等;非登录 shell(通过bash打开的新终端)常读取~/.bashrc。
- 登录 shell 会读取
-
全局变量与局部变量区别(在 shell 脚本中常见)。
常用诊断命令(快速)
lscpu、cat /proc/meminfo、cat /proc/diskstatsnetstat -tunlp、ifconfig/ip atop,ps aux,pstree,free,vmstat -akill(信号机制),nohup(屏蔽 SIGHUP,常用于后台运行)。
Linux 目录结构简介
/usr:Unix 软件与资源/proc:虚拟文件系统,进程与内核信息/run:运行时数据(临时)/home:普通用户家目录/var:可变数据(日志、邮件等)/tmp:临时文件(系统建议重启清理)/etc:配置文件/dev:设备文件(Linux 中一切皆文件)
软件包管理
- Debian 系列:
apt、apt-get - RedHat 系列:
yum/dnf - Arch 系列:
pacman - 常见压缩解压:
tar -xvf,unzip。
4. 静态网页(快速部署示例)
用户与权限示例
useradd -m -s $(which bash) xsk
groupadd sudo
usermod -aG sudo xsk
# 编辑 sudoers(慎用)
visudo
安装 Nginx 与启动
# 以 RedHat/DNF 为例
sudo dnf install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
Node / Hexo 静态站点(示例流程)
wget https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-arm64.tar.xz
tar -xvf node-v16.13.0-linux-arm64.tar.xz
sudo mv node-v16.13.0-linux-arm64 /opt
# 将 node 添加到 PATH(编辑 /etc/bashrc 或用户的 .bashrc)
# 切换到用户
su - xsk
npm config set registry https://repo.huaweicloud.com/repository/npm/
npm install -g hexo
hexo init blog_folder
cd blog_folder
hexo generate
chmod a+r -R public
# 把生成目录链接到 /var/www
cd /var
ln -s /home/xsk/blog_folder/public www
# 修改 nginx 配置中的 root 指向 /var/www
sudo systemctl reload nginx
检查 Nginx 以哪个用户启动:
ps aux | grep "nginx: worker process" | awk '{print $1}'
动态网页
- 可将 Jupyter Notebook 托管在线,或使用 Spring Boot 等后端框架处理 GET/POST 请求(开发中)。
5. NAT 与 STUN 实验(面向研究/测试)
前言与范围
- 本部分聚焦于 IPv4 环境中 NAT 对 UDP/TCP 的不同行为以及测试方法。文中大量以 UDP 为例,TCP 行为因状态性更复杂。
- 涉及 socket 编程的理解,建议结合
stunclient/stunserver实验工具实践。
关键概念概览
- Mapping(映射):当 NAT 后的主机发出传出包时,NAT 会把包的源信息(源 IP/端口)替换成公网侧的信息。Mapping 描述了相同内部源在不同目的地情况下是否使用相同的 NAT 映射。
- Filtering(过滤):描述 NAT 在接收外部包时如何决定将包转发到 NAT 内部哪台主机(基于什么条件匹配)。
IP 包与四元组
- 每个 UDP/TCP 包都携带四元组:
(src_addr, src_port, dest_addr, dest_port),NAT/防火墙通常基于这些字段做判断与映射。
Mapping 类型(RFC 分类)
- Endpoint-Independent Mapping:同一内部源(地址+端口)发往不同目的地,NAT 改写后的源(通常是公网 IP + 新端口)保持一致。
- Address-Dependent Mapping:映射依赖目标地址(不同目标地址可能得到不同改写端口),但不区分目标端口。
- Address-and-Port-Dependent Mapping:映射同时依赖目标地址与目标端口。
Filtering(传入包)类型
- Endpoint-Independent Filtering:外部包到来时,只检查原始目的信息来决定是否允许并转发。
- Address-Dependent Filtering:还需要匹配源地址。
- Address-and-Port-Dependent Filtering:需要匹配源地址与源端口。
测试目的与需上报结果
-
目标:确定被测网络(或路径)在穿越的各级 NAT 上的 mapping 与 filtering 行为。
-
需上报:
traceroute stun.stunprotocol.org的前 5 行输出(见连通性测试) — 在打印到第一个公网节点后可停止。- TCP 的 mapping(传出)与 filtering(传入)结果。
- UDP 的 mapping 与 filtering 结果。
- 若可控制 NAT 环境,需提交控制前后的对比(四项)。
测试工具与安装
- 推荐使用
stunserver/stunclient(如 jselbie/stunserver)。 - 编译方法:阅读仓库 README、安装依赖并
make。在源码client目录中会生成stunclient。
仓库示例:GitHub - jselbie/stunserver(STUNTMAN)
测试命令示例
# 连通性测试
traceroute stun.stunprotocol.org
# TCP 传出 mapping 测试
./stunclient --protocol tcp --mode behavior stun.stunprotocol.org 3478
# TCP 传入 filtering 测试
./stunclient --protocol tcp --mode filtering stun.stunprotocol.org 3478
# UDP 传出 mapping 测试
./stunclient --protocol udp --mode behavior stun.stunprotocol.org 3478
# UDP 传入 filtering 测试
./stunclient --protocol udp --mode filtering stun.stunprotocol.org 3478
连通性说明:在打印出第一个公网节点(第一个非私有地址/跳数)后即可停止并记录结果。
Tips
- 阅读
stunclient/stunserver的帮助输出可帮助理解为何测试需要服务器端有多个 IP 地址。 - 校园网或运营商网络中常见的“fullcone”补丁可能只对 UDP 有效,TCP 不一定适用。
多层 NAT 的影响(简要)
- 传出(mapping):每一级 NAT 都会影响最终的映射行为;总体表现相当于对每一级规则的逻辑结合(近似 AND)。
- 传入(filtering):决定是否放行的通常是最外层 NAT(最先接触公网侧的 NAT),只要映射链未断,外部到达最外层后再由它依次转发到内层。
6. 参阅
- RFC4787(NAT Behavior)
- RFC5382
- 公共 STUN 服务器列表(示例)
附录:命令速查表(摘录)
systemctl:start/stop/restart/enable/disable/status/daemon-reloadhostnamectl,localectl,timedatectl,loginctltraceroute,tcpdump,netstat,ss,ip,ifconfiglscpu,free,vmstat,ps aux,top