2026-10-14
系统运维
00

目录

💻 系统要求
📥 下载镜像
💾 制作启动盘
Linux 下制作
Windows 下制作
⚙️ 安装步骤
1. 选择语言
2. 键盘布局
3. 安装类型
4. 网络配置
5. 代理设置
6. 镜像地址
7. 磁盘分区
8. 账户设置
9. 安装 OpenSSH
10. 选择额外软件包
11. 完成安装
🔧 安装后初始配置
设置 root 密码(可选)
修改主机名
配置静态 IP(安装时未设置的场景)
时间同步
系统更新
🔧 常用工具:WinSCP、Putty
🔧 指定端口开放
🛡️ 核心方法:使用 UFW 防火墙开放端口
第 1 步:查看当前防火墙状态
第 2 步:开放指定端口
第 3 步:重新加载并验证
第 4 步:启用防火墙(如果还未启用)
📝 常用 UFW 操作示例
🔍 重要排查:服务没有监听端口怎么办?
☁️ 额外提醒:云服务器安全组
🔍 Vim操作
常见场景
🛠️ 常见问题

Ubuntu Server 26.04 LTS(代号 Resolute Raccoon)是一个长期支持版本,提供长达 5 年的标准安全维护,适合在生产环境中部署。以下是基于官方文档和社区指南整理的完整安装与初始配置步骤。

以下是本人 Ubuntu Server 安装、基础配置全流程的核心要点汇总,按阶段划分方便查阅。 安装环境:VMware17 Pro

💻 系统要求

在开始安装前,请确认硬件满足以下最低配置:

项目最低配置推荐配置
CPU1 GHz 64 位处理器2 GHz+ 多核处理器
内存1.5 GB4 GB 及以上
磁盘5 GB 可用空间25 GB 及以上
安装介质USB 端口或 DVD 驱动器4 GB 以上 U 盘

Ubuntu Server 默认不包含图形界面,资源占用更低,更适合运行各类服务。


📥 下载镜像

从 Ubuntu 官方发布页面下载 ISO 文件:

bash
wget https://releases.ubuntu.com/26.04/ubuntu-26.04-live-server-amd64.iso

如果官方源速度较慢,可以使用国内镜像加速下载:

bash
# 清华大学镜像 wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/26.04/ubuntu-26.04-live-server-amd64.iso # 阿里云镜像 wget https://mirrors.aliyun.com/ubuntu-releases/26.04/ubuntu-26.04-live-server-amd64.iso

下载完成后建议校验文件完整性:

bash
wget https://releases.ubuntu.com/26.04/SHA256SUMS sha256sum -c SHA256SUMS 2>/dev/null | grep ubuntu-26.04-live-server-amd64.iso

💾 制作启动盘

Linux 下制作

bash
# 查看 U 盘设备名(注意确认,避免误写系统盘) lsblk # 写入 ISO(将 /dev/sdX 替换为实际设备名) sudo dd if=ubuntu-26.04-live-server-amd64.iso of=/dev/sdX bs=4M status=progress oflag=sync

Windows 下制作

推荐使用 Rufus 或 balenaEtcher:

  1. 打开 Rufus,选择 U 盘设备
  2. 选择下载好的 ISO 文件
  3. 分区类型选择 GPT(UEFI) 或 MBR(BIOS)
  4. 点击“开始”写入

⚙️ 安装步骤

将制作好的启动盘插入服务器,设置 BIOS 从该介质启动。安装程序 Subiquity 会引导你完成整个过程。

1. 选择语言

服务器环境建议选择 English,可以避免后续终端中出现中文乱码问题。如需中文环境,可在系统安装完成后再单独配置。

2. 键盘布局

一般选择默认的 English (US) 即可。

3. 安装类型

  • Ubuntu Server:标准安装,包含常用工具
  • Ubuntu Server (minimized):最小化安装,适合容器和云环境

4. 网络配置

安装程序会默认通过 DHCP 自动获取网络配置。如需设置静态 IP,按以下步骤操作:

  1. 选择网卡接口
  2. 选择 Edit IPv4
  3. 将方法改为 Manual
  4. 填入 IP 地址、子网掩码、网关和 DNS

5. 代理设置

如网络环境需要代理,在此填入代理地址(如 http://proxy.example.com:8080),否则留空跳过。

6. 镜像地址

默认使用 http://archive.ubuntu.com/ubuntu。建议替换为国内镜像以加快后续软件安装速度:

https://mirrors.tuna.tsinghua.edu.cn/ubuntu

7. 磁盘分区

推荐新手使用整块磁盘方案:

  • 选择 Use an entire disk
  • 可选启用 LVM(推荐,方便后续扩容)
  • 可选启用 LUKS 加密(需设置密码)

如需自定义分区,建议方案如下:

分区大小文件系统挂载点
EFI512 MBfat32/boot/efi
/boot1 GBext4/boot
swap与内存等大swap—
/剩余空间ext4/

附扩容参考:LVM 在线扩容,支持 --check 干跑、扩前留底、扩后 SHA256/可写性校验

sh
#!/usr/bin/env bash # 在线扩容根分区:把 LVM 卷组里闲置的空间全部分配给 /(ext4 在线扩容,无需重启) # # 用法: # sudo bash /home/lvm-extend-root.sh --check # 只检查、只报告,不改动 # sudo bash /home/lvm-extend-root.sh # 执行扩容 # # 安全性说明: # - 只做“扩大”:lvextend 追加空间 + resize2fs 在线扩文件系统,不动任何已有数据。 # - 失败可安全重试:即使 resize2fs 被中断,文件系统仍然有效,重新执行即可继续。 # - 本脚本不做自动回滚:缩容(resize2fs + lvreduce)需要卸载分区并做离线 fsck, # 风险远高于扩容,因此只提供命令说明,不自动执行。 set -uo pipefail VG=ubuntu-vg LVNAME=ubuntu-lv LVDEV=/dev/${VG}/${LVNAME} LOG=/home/lvm-extend-root.log SELF="$(readlink -f "$0")" if [ "$(id -u)" -ne 0 ]; then echo "错误:必须用 sudo 运行 -> sudo bash $SELF --check" exit 1 fi exec > >(tee -a "$LOG") 2>&1 echo "================ $(date '+%F %T %Z') 开始 ================" MODE="${1:-run}" TS="$(date +%Y%m%d%H%M%S)" RECORD="/root/lvm-extend-${TS}.txt" g2() { awk -v b="$1" 'BEGIN{printf "%.2f", b/1073741824}'; } # ---------- 前置检查 ---------- FSTYPE="$(findmnt -no FSTYPE / 2>/dev/null)" [ "$FSTYPE" = "ext4" ] || { echo "❌ 根文件系统类型是 '${FSTYPE:-未知}',本脚本只处理 ext4"; exit 1; } [ -e "$LVDEV" ] || { echo "❌ 找不到逻辑卷 $LVDEV"; exit 1; } ROOTSRC="$(findmnt -no SOURCE / 2>/dev/null)" # 通过解析到真实设备节点比较,规避 LVM 名字里 '--' 转义导致的字符串不匹配 [ "$(readlink -f "$ROOTSRC")" = "$(readlink -f "$LVDEV")" ] || { echo "⚠ 注意:/ 的源设备是 $ROOTSRC,与 $LVDEV 不一致,请人工确认后再执行"; exit 1; } FREE_B="$(vgs --noheadings --units b --nosuffix -o vg_free "$VG" 2>/dev/null | tr -d ' ')" case "$FREE_B" in ''|*[!0-9]*) echo "❌ 无法读取卷组 $VG 的空闲空间"; exit 1;; esac SIZE_BEFORE="$(df -B1 --output=size / | tail -1 | tr -d ' ')" AVAIL_BEFORE="$(df -B1 --output=avail / | tail -1 | tr -d ' ')" USED_BEFORE="$(df -B1 --output=used / | tail -1 | tr -d ' ')" echo "逻辑卷 : $LVDEV" echo "文件系统 : $FSTYPE(支持在线扩容)" echo "卷组空闲 : $(g2 "$FREE_B") GiB" echo "当前 / : 总 $(g2 "$SIZE_BEFORE") GiB,已用 $(g2 "$USED_BEFORE") GiB,可用 $(g2 "$AVAIL_BEFORE") GiB" echo "扩容后预期 : 总约 $(g2 $((SIZE_BEFORE + FREE_B))) GiB,可用约 $(g2 $((AVAIL_BEFORE + FREE_B))) GiB" { echo "# ===== 扩容前状态 $(date '+%F %T %Z') =====" echo "## vgs"; vgs "$VG" 2>&1 echo "## lvs"; lvs "$VG" 2>&1 echo "## df"; df -h / 2>&1 echo "## lsblk"; lsblk /dev/sda 2>&1 } > "$RECORD" echo "扩容前状态已记录 -> $RECORD" if [ "$MODE" = "--check" ]; then echo "(--check 模式:仅检查,未做任何修改)" exit 0 fi if [ "$FREE_B" -lt 1073741824 ]; then echo "❌ 卷组空闲不足 1 GiB($(g2 "$FREE_B") GiB),无需扩容" exit 1 fi # ---------- 完整性标记(扩前写入,扩后校验) ---------- MARKER="/root/.lvm-extend-marker-${TS}" echo "dsh lvm-extend check $TS" > "$MARKER" MARK_SUM="$(sha256sum "$MARKER" | awk '{print $1}')" PASS_SUM="$(sha256sum /etc/passwd | awk '{print $1}')" # ---------- 第一步:扩容逻辑卷 ---------- echo ">>> lvextend -l +100%FREE $LVDEV" if ! lvextend -l +100%FREE "$LVDEV"; then echo "❌ lvextend 失败:未做任何文件系统改动,数据无风险" exit 1 fi echo "✅ 逻辑卷已扩容,接下来在线扩容文件系统(resize2fs,通常几十秒)..." # ---------- 第二步:在线扩容文件系统 ---------- echo ">>> resize2fs $LVDEV" if ! resize2fs "$LVDEV"; then echo "⚠ resize2fs 首次失败,重试一次..." if ! resize2fs "$LVDEV"; then echo "❌ 文件系统扩容失败,但 LV 已扩容——这不影响数据完整性。" echo " 请手动重试(可安全重复执行): sudo resize2fs $LVDEV" exit 1 fi fi # ---------- 校验 ---------- sleep 1 sync SIZE_AFTER="$(df -B1 --output=size / | tail -1 | tr -d ' ')" AVAIL_AFTER="$(df -B1 --output=avail / | tail -1 | tr -d ' ')" GROWTH=$(( (SIZE_AFTER - SIZE_BEFORE) / 1073741824 )) ok=1 [ "$SIZE_AFTER" -gt "$SIZE_BEFORE" ] || { echo "❌ 文件系统总容量没有变化"; ok=0; } [ "$(sha256sum "$MARKER" 2>/dev/null | awk '{print $1}')" = "$MARK_SUM" ] || { echo "❌ 标记文件校验不一致"; ok=0; } [ "$(sha256sum /etc/passwd 2>/dev/null | awk '{print $1}')" = "$PASS_SUM" ] || { echo "❌ /etc/passwd 校验不一致"; ok=0; } findmnt -no OPTIONS / | grep -q '^rw' || { echo "❌ 根分区未处于可读写状态"; ok=0; } ( touch /root/.lvm-write-test && rm -f /root/.lvm-write-test ) || { echo "❌ 根分区写入测试失败"; ok=0; } for d in /etc /usr /var /home /boot; do [ -d "$d" ] || { echo "❌ 关键目录 $d 不见了"; ok=0; }; done { echo "# ===== 扩容后状态 $(date '+%F %T %Z') =====" echo "## vgs"; vgs "$VG" 2>&1 echo "## lvs"; lvs "$VG" 2>&1 echo "## df"; df -h / 2>&1 echo "## lsblk"; lsblk /dev/sda 2>&1 } >> "$RECORD" echo "扩容后状态已追加 -> $RECORD" echo "---- 结果 ----" df -hT / | sed 's/^/ /' lsblk -o NAME,SIZE,TYPE,MOUNTPOINT /dev/sda | sed 's/^/ /' if [ "$ok" = "1" ]; then echo "✅ 成功:/ 已扩容约 ${GROWTH} GiB,现总 $(g2 "$SIZE_AFTER") GiB、可用 $(g2 "$AVAIL_AFTER") GiB" echo " 数据完整性校验全部通过(标记文件、/etc/passwd、可读写、关键目录)" rm -f "$MARKER" echo " 如需缩小回去(不推荐、需离线操作):" echo " sudo swapoff /swap.img && sudo e2fsck -f $LVDEV && sudo resize2fs $LVDEV 29G && sudo lvreduce -L 29G $LVDEV && sudo swapon /swap.img" else echo "❌ 校验未全部通过:请查看上方 ❌ 项与日志 $LOG" echo " LV 扩容本身不影响数据;必要时可再次执行本脚本重试文件系统扩容" exit 1 fi

8. 账户设置

设置你的用户名和密码。Ubuntu 默认不启用 root 账户密码,日常操作通过 sudo 提权。

9. 安装 OpenSSH

建议勾选 “Install OpenSSH server”,以便安装完成后可以通过 SSH 远程连接服务器。

10. 选择额外软件包

根据服务器用途勾选需要的软件包(如 LAMP、Docker 等),也可全部跳过,后续按需安装。

11. 完成安装

确认配置后点击 Done → Reboot Now。系统会提示你拔出安装介质,拔出后按 Enter 重启。


🔧 安装后初始配置

重启后使用创建的账户登录,进行以下基本配置。

设置 root 密码(可选)

Ubuntu 默认 root 无密码,如需使用传统 su 命令切换,可手动设置:

bash
sudo passwd root

修改主机名

bash
sudo hostnamectl set-hostname your-server-name

配置静态 IP(安装时未设置的场景)

编辑 Netplan 配置文件:

bash
sudo nano /etc/netplan/00-installer-config.yaml

示例配置(请根据实际网卡名称和网络参数调整):netplan-ens33-static.yaml

yaml
# 静态 IP 配置:ens33 -> 192.168.3.138/24 # 网关/DNS:192.168.3.2(路由器),备用 DNS:223.5.5.5 # 生效方式:复制为 /etc/netplan/00-installer-config.yaml 后执行 netplan apply network: version: 2 renderer: networkd ethernets: ens33: dhcp4: false dhcp6: false addresses: - 192.168.3.138/24 routes: - to: default via: 192.168.3.2 metric: 100 nameservers: addresses: - 192.168.3.2 - 223.5.5.5

附静态IP设置参考:set-static-ip.sh

sh
#!/usr/bin/env bash # 把本机 ens33 固定为静态 IP 192.168.3.138/24 # # 用法(只记这一条,sudo 会正常提示你输密码): # sudo bash /home/set-static-ip.sh # # 回滚到 DHCP: # sudo bash /home/set-static-ip.sh --rollback # # 原理:sudo 在前台拿到 root -> 脚本自己用 setsid 把真正干活的进程分离到后台 # -> 前台立即返回。这样 netplan apply 导致 SSH 掉线时,后台进程不会被 SIGHUP 杀掉。 # 调试:加 SETSTATIC_FOREGROUND=1 可让脚本留在前台运行(不推荐,掉线可能中断)。 set -uo pipefail IFACE=ens33 IPADDR=192.168.3.138 PREFIX=24 GW=192.168.3.2 NEWSRC=/home/netplan-ens33-static.yaml TARGET=/etc/netplan/00-installer-config.yaml LOG=/home/set-static-ip.log SELF="$(readlink -f "$0")" # ---------- 阶段 1:前台前置检查(错误立刻显示在终端上) ---------- if [ "$(id -u)" -ne 0 ]; then echo "错误:必须用 sudo 运行 -> sudo bash $SELF" exit 1 fi [ -f "$NEWSRC" ] || { echo "错误:找不到配置文件 $NEWSRC"; exit 1; } # ---------- 阶段 2:把自己分离到后台 ---------- if [ "${SETSTATIC_DETACHED:-0}" != "1" ] && [ "${SETSTATIC_FOREGROUND:-0}" != "1" ]; then export SETSTATIC_DETACHED=1 setsid bash "$SELF" "$@" >/dev/null 2>&1 </dev/null & echo "已在后台启动(PID $!),约 20 秒后完成。" echo "查看结果: cat $LOG" echo "实时进度: tail -f $LOG" exit 0 fi # ---------- 阶段 3:后台正式执行 ---------- exec > >(tee -a "$LOG") 2>&1 echo "================ $(date '+%F %T') 开始 ================" LATEST_BAK=$(ls -1t "${TARGET}".bak.* 2>/dev/null | head -1 || true) if [ "${1:-}" = "--rollback" ]; then [ -n "$LATEST_BAK" ] || { echo "❌ 没有找到任何备份,无法回滚"; exit 1; } echo "回滚:$LATEST_BAK -> $TARGET" cp -a "$LATEST_BAK" "$TARGET" netplan apply && echo "✅ 已回滚为 DHCP 动态获取" exit $? fi BAK="$TARGET.bak.$(date +%Y%m%d%H%M%S)" if cp -a "$TARGET" "$BAK"; then echo "已备份原配置 -> $BAK"; else echo "❌ 备份失败,中止"; exit 1; fi if ! install -m 600 -o root -g root "$NEWSRC" "$TARGET"; then echo "❌ 写入新配置失败,还原备份"; cp -a "$BAK" "$TARGET"; netplan apply; exit 1 fi echo "---- 新配置内容 ----"; cat "$TARGET"; echo "--------------------" if ! netplan generate; then echo "❌ netplan generate 语法检查失败,立即回滚" cp -a "$BAK" "$TARGET"; netplan apply; exit 1 fi echo "语法检查通过,正在应用(网络将瞬断几秒,SSH 会掉线)..." netplan apply ok_addr=""; ok_route="" for _ in $(seq 1 20); do sleep 1 ip -4 -o addr show dev "$IFACE" | grep -q "inet ${IPADDR}/${PREFIX}" && ok_addr=1 ip route show default 2>/dev/null | grep -q "via ${GW}" && ok_route=1 [ -n "$ok_addr" ] && [ -n "$ok_route" ] && break done if ping -c1 -W2 "$GW" >/dev/null 2>&1; then ping_note="网关 ICMP 响应正常" else ping_note="网关未响应 ICMP(路由器可能禁 ping,不代表故障)" fi if [ -n "$ok_addr" ] && [ -n "$ok_route" ]; then echo "✅ 成功:${IFACE} = ${IPADDR}/${PREFIX},默认路由 via ${GW};${ping_note}" echo " 回滚命令:sudo bash $SELF --rollback" exit 0 fi echo "❌ 校验失败(地址生效=${ok_addr:-0},默认路由=${ok_route:-0}),自动回滚" cp -a "$BAK" "$TARGET" netplan apply sleep 5 ip -4 -o addr show dev "$IFACE" || true exit 1

应用配置:

bash
sudo netplan apply

时间同步

Ubuntu 26.04 默认使用 chrony 进行时间同步(替代了旧版的 systemd-timesyncd)。配置文件位于 /etc/chrony/sources.d/ubuntu-ntp-pools.sources,一般保持默认即可。

附把本机时区设为东八区: set-timezone-shanghai.sh

sh
#!/usr/bin/env bash # 把本机时区设为东八区(北京时间)Asia/Shanghai # # 用法(sudo 会正常提示你输密码): # sudo bash /home/set-timezone-shanghai.sh # # 回滚到修改前的时区: # sudo bash /home/set-timezone-shanghai.sh --rollback # # 说明:只改时区(/etc/localtime 与 /etc/timezone),不动系统时钟、不需要重启、 # 不会断网。同时会确认 chrony 时间同步在运行,保证时钟长期准确。 set -uo pipefail TZ_TARGET=Asia/Shanghai LOG=/home/jing/set-timezone.log SELF="$(readlink -f "$0")" # ---------- 前置检查(错误直接显示在终端) ---------- if [ "$(id -u)" -ne 0 ]; then echo "错误:必须用 sudo 运行 -> sudo bash $SELF" exit 1 fi if [ ! -f "/usr/share/zoneinfo/${TZ_TARGET}" ]; then echo "错误:缺少时区数据文件 /usr/share/zoneinfo/${TZ_TARGET}(请安装 tzdata)" exit 1 fi exec > >(tee -a "$LOG") 2>&1 echo "================ $(date '+%F %T %Z') 开始 ================" ORIG_ZONE="$(timedatectl show -p Timezone --value 2>/dev/null || echo Etc/UTC)" LATEST_BAK=$(ls -1t /root/tz-backup-*.txt 2>/dev/null | head -1 || true) # ---------- 回滚模式 ---------- if [ "${1:-}" = "--rollback" ]; then if [ -z "$LATEST_BAK" ]; then echo "❌ 没找到备份文件 /root/tz-backup-*.txt,无法自动回滚" echo " 手动回滚示例: sudo timedatectl set-timezone Etc/UTC" exit 1 fi RESTORE_ZONE="$(cat "$LATEST_BAK")" echo "回滚:$ORIG_ZONE -> $RESTORE_ZONE(来自 $LATEST_BAK)" timedatectl set-timezone "$RESTORE_ZONE" echo "当前时区:$(timedatectl show -p Timezone --value) 时间:$(date '+%F %T %Z %z')" exit $? fi # ---------- 备份 ---------- BAK="/root/tz-backup-$(date +%Y%m%d%H%M%S).txt" printf '%s\n' "$ORIG_ZONE" > "$BAK" echo "原时区:$ORIG_ZONE (已备份 -> $BAK)" ls -l /etc/localtime # ---------- 设置时区 ---------- if ! timedatectl set-timezone "$TZ_TARGET"; then echo "timedatectl 失败,改用直接替换 /etc/localtime 的方式" ln -sfn "/usr/share/zoneinfo/${TZ_TARGET}" /etc/localtime printf '%s\n' "$TZ_TARGET" > /etc/timezone systemctl restart systemd-timedated 2>/dev/null || true fi # ---------- 校验 ---------- NEW_ZONE="$(timedatectl show -p Timezone --value 2>/dev/null || echo unknown)" OFFSET="$(date '+%z')" echo "---- 校验 ----" echo "时区 : $NEW_ZONE" echo "偏移 : $OFFSET" echo "本地时间: $(date '+%F %T %Z')" echo "UTC 时间: $(date -u '+%F %T %Z')" echo "/etc/localtime -> $(readlink -f /etc/localtime)" # 时间同步服务确认(时钟准不准取决于它) if systemctl is-active --quiet chrony 2>/dev/null; then echo "时间同步: chrony 运行中(Stratum $(chronyc tracking 2>/dev/null | awk '/Stratum/{print $3}'))" elif systemctl is-active --quiet systemd-timesyncd 2>/dev/null; then echo "时间同步: systemd-timesyncd 运行中" else echo "时间同步: ⚠ 未发现运行中的 NTP 客户端,建议执行 sudo systemctl enable --now chrony" fi if [ "$NEW_ZONE" = "$TZ_TARGET" ] && [ "$OFFSET" = "+0800" ]; then echo "✅ 成功:已切换为东八区(北京时间),无需重启,时钟不受影响" echo " 回滚命令:sudo bash $SELF --rollback" exit 0 fi echo "❌ 校验失败:时区=$NEW_ZONE 偏移=$OFFSET(期望 $TZ_TARGET / +0800)" echo " 回滚命令:sudo bash $SELF --rollback" exit 1

系统更新

bash
sudo apt update && sudo apt upgrade -y

🔧 常用工具:WinSCP、Putty

在 WinSCP 的会话窗口中,直接按下 Ctrl + Alt + H 组合键,可以快速在“显示”与“隐藏”状态之间切换

WinScp 下载地址:https://winscp.net/eng/index.php Putty 下载地址:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

在 Ubuntu 中“开放端口”通常涉及到两个层面:系统防火墙(UFW) 和 服务本身的监听地址。

由于你使用的是 Ubuntu Server 并打算用 PuTTY 远程管理,以下是标准的操作流程。

🔧 指定端口开放

🛡️ 核心方法:使用 UFW 防火墙开放端口

Ubuntu 默认的防火墙工具是 UFW (Uncomplicated Firewall)。

⚠️ 极度重要警告:在操作防火墙前,如果你是通过 SSH(比如 PuTTY)连的服务器,必须确保先放行了 22 端口,否则一旦开启防火墙,你的 SSH 连接会立刻断开!

第 1 步:查看当前防火墙状态

bash
sudo ufw status
  • 如果显示 Status: inactive,说明防火墙没开启。
  • 如果显示 Status: active,说明防火墙已开启,并会列出所有规则。

第 2 步:开放指定端口

假设你要开放 8080 端口,输入以下命令:

bash
# 开放 TCP 端口(最常用) sudo ufw allow 8080/tcp # 如果需要同时开放 TCP 和 UDP sudo ufw allow 8080

第 3 步:重新加载并验证

bash
# 重载防火墙(一般会自动生效) sudo ufw reload # 查看规则是否添加成功 sudo ufw status numbered

第 4 步:启用防火墙(如果还未启用)

bash
# 启用前,再次确认 22 端口已放行! sudo ufw allow 22/tcp sudo ufw enable

📝 常用 UFW 操作示例

需求命令
开放 80 (HTTP)sudo ufw allow 80/tcp
开放 443 (HTTPS)sudo ufw allow 443/tcp
开放 3306 (MySQL)sudo ufw allow 3306/tcp
开放端口范围 8000-9000sudo ufw allow 8000:9000/tcp
允许特定 IP 访问 22 端口sudo ufw allow from 192.168.1.100 to any port 22
删除某条规则sudo ufw delete allow 8080/tcp
关闭防火墙(不推荐)sudo ufw disable

🔍 重要排查:服务没有监听端口怎么办?

开放了防火墙端口,但外部还是连不上?最常见的原因是服务只监听了 127.0.0.1(本地回环),没有监听 0.0.0.0(所有网卡)。

检查方法:

bash
# 查看当前系统所有正在监听的端口和地址 ss -tuln # 或者 netstat -tuln
  • 如果看到 127.0.0.1:8080,说明只有本机能访问。
  • 如果看到 0.0.0.0:8080 或 *:8080,说明所有网卡都能访问。

解决方法: 这取决于你运行的具体服务(如 Nginx、Docker、Node.js 等)。例如:

  • Nginx:检查配置文件里的 listen 8080;。
  • Docker:运行容器时,端口映射必须写成 -p 8080:8080(而不是 -p 127.0.0.1:8080:8080)。
  • Python/Node.js:启动命令里通常需要指定 --host 0.0.0.0。

☁️ 额外提醒:云服务器安全组

如果你是在阿里云、腾讯云、AWS等云服务器上操作,除了 Ubuntu 的 UFW 防火墙,你还需要在云厂商的 Web 控制台里,找到“安全组”或“防火墙”设置,手动放行对应端口。否则,请求在到达你的服务器之前就被云平台拦截了。

建议你现在的操作顺序:

  1. 确认 22 端口放行。
  2. 开启 UFW。
  3. 用 sudo ufw allow <你的端口>/tcp 开放你需要的端口。
  4. 如果外部还是连不上,用 ss -tuln 检查服务是否监听了 0.0.0.0。

🔍 Vim操作

在 vim 里保存退出,记住这个核心操作:

按 O(大写字母 O),这会在当前行的上方插入一个新行,并进入插入模式

先按 Esc,再输入 :wq,然后按回车。


常见场景

目的操作
保存并退出Esc → :wq → 回车
保存并退出(等价)Esc → :x → 回车
不保存,强制退出Esc → :q! → 回车
只保存,不退出Esc → :w → 回车
没修改,只想退出Esc → :q → 回车
保存退出(快捷键)Esc → 按 ZZ(Shift+z 两次)

🛠️ 常见问题

Q:安装后无法通过 SSH 连接? A:确认安装时已勾选 OpenSSH server,并检查防火墙是否放行了 22 端口:sudo ufw allow ssh。

Q:终端出现中文乱码? A:这是因为安装时选择了 English。可安装中文字体并配置 locale:sudo apt install language-pack-zh-hans fonts-wqy-zenhei。

Q:如何修改镜像源? A:编辑 /etc/apt/sources.list.d/ubuntu.sources,将 archive.ubuntu.com 替换为国内镜像地址即可。


以上步骤涵盖了 Ubuntu Server 26.04 LTS 从准备到初始配置的完整流程。如在安装过程中遇到具体报错,可以提供详细信息进一步排查。

本文作者:张京

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!