网络与 Linux 基础:11月30日分享会记录

计算机网络基础 与 Linux 系统运维


目录

  1. 前言

  2. 计算机网络基础(自底向上)

    • 物理层与早期全连接网络
    • 数据链路层:MAC 与以太网、交换机
    • 网络层:IP 与路由
    • ARP、默认网关与子网通信
    • NAT(网络地址转换)与端口
    • 传输层:TCP 与 UDP 对比
    • 常见网络命令速查
  3. Linux 系统运维基础

    • 常用软件/工具(SSH 客户端,云环境)
    • systemd(由来、概述、主要命令)
    • Unit(类型、状态、管理、依赖与配置文件)
    • Target 与传统 RunLevel 的对应
    • 环境变量、bash 基础
    • 常用系统工具(lscpu、top、ps、netstat、ip、ifconfig、vmstat)
    • 文件系统与常见目录说明
    • 软件包管理与常用镜像站
  4. 静态与动态网页部署(快速流程)

    • 用户/权限设置
    • Nginx 静态站点部署(示例命令)
    • Node / Hexo 简要流程
    • 动态站点 / Spring Boot 提示
  5. NAT 与 STUN 实验(深入)

    • 前言与范围(仅 IPv4)
    • 关键概念:mapping 与 filtering
    • 详细概念(IP/TCP/UDP 四元组说明)
    • RFC 中的分类(mapping/filtering 类型)
    • 测试目的与需上报结果
    • 测试方法、工具与命令示例
    • Tips 与多层 NAT 的影响
  6. 参阅与附录(命令速查表、常见示例)


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 reboot
    • sudo systemctl poweroff
    • sudo systemctl halt
    • sudo systemctl suspend
    • sudo systemctl hibernate
    • sudo systemctl hybrid-sleep
    • sudo 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-units
    • systemctl 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=target
    • systemctl list-dependencies multi-user.target
    • systemctl get-default, sudo systemctl set-default multi-user.target
    • sudo 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 脚本中常见)。

常用诊断命令(快速)

  • lscpucat /proc/meminfocat /proc/diskstats
  • netstat -tunlpifconfig / ip a
  • top, ps aux, pstree, free, vmstat -a
  • kill(信号机制),nohup(屏蔽 SIGHUP,常用于后台运行)。

Linux 目录结构简介

  • /usr:Unix 软件与资源
  • /proc:虚拟文件系统,进程与内核信息
  • /run:运行时数据(临时)
  • /home:普通用户家目录
  • /var:可变数据(日志、邮件等)
  • /tmp:临时文件(系统建议重启清理)
  • /etc:配置文件
  • /dev:设备文件(Linux 中一切皆文件)

软件包管理

  • Debian 系列:aptapt-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 行为。

  • 需上报

    1. traceroute stun.stunprotocol.org 的前 5 行输出(见连通性测试) — 在打印到第一个公网节点后可停止。
    2. TCP 的 mapping(传出)与 filtering(传入)结果。
    3. UDP 的 mapping 与 filtering 结果。
    4. 若可控制 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-reload
  • hostnamectl, localectl, timedatectl, loginctl
  • traceroute, tcpdump, netstat, ss, ip, ifconfig
  • lscpu, free, vmstat, ps aux, top

建议更改一下标题为 “关于 XXX 的记录”,可以更好的让感兴趣的人点进来 :smiley: