第二章 —— 服务器初步配置 · 开启你的建站之路

拿到一台服务器,不等于就能立刻建站。我们需要先为它打好“基础配置”,确保它能稳定、安全地工作。

本章节将带你一步步完成服务器上线后的首轮设置,即便是第一次接触 Linux 的新手也能跟得上。


🧭 操作概览如下:
  1. 确认网络正常:检查服务器能否正常访问外网,确保软件源和域名解析不受阻。
  2. 配置域名解析:将你的域名正确指向服务器 IP,让网站能通过网址访问。
  3. 登录服务器:使用 SSH 客户端登录服务器,准备开始配置。
  4. 设置 SSH 免密登录:用密钥登录,提升安全性,省去频繁输入密码的麻烦。
  5. 修改主机名:让你的服务器有一个易识别的名字,方便管理。
  6. 启用防火墙(firewalld)与 SELinux:增强系统安全,防范常见攻击。
  7. 安装推荐软件包:准备常用工具(如 vim、curl 等),为后续操作做准备。
  8. 重启服务器:应用配置变更,确认系统状态良好。

📌 这一节的目标是:把你的服务器从“裸机”状态变成一个可用、可控、初步安全的系统环境。

准备好了吗?我们现在就开始动手配置。💻✨

检查服务器网络

在shell中执行ping命令,检查本机与服务器的连接情况。

$ ping <your ip addr> 

正常情况下会返回诸如此类的消息:

64 bytes from 150.171.28.10 (150.171.28.10): icmp_seq=1 ttl=116 time=67.4 ms
64 bytes from 150.171.28.10 (150.171.28.10): icmp_seq=2 ttl=116 time=69.7 ms
64 bytes from 150.171.28.10 (150.171.28.10): icmp_seq=3 ttl=116 time=69.4 ms

如果没有返回类似消息,而是一直不响应或返回Destination Host Unreachable。需要排查服务器网卡与防火墙配置。

先尝试用ssh命令连一下服务器,看是否提示我们登录。

$ ssh <your ip addr>

如果提示我们登录,说明你的服务器不响应ping,请登录虚拟主机的后台管理页面,检查是否有防火墙规则阻止了ICMP数据包。

如果上面的命令返回“No route to host”,请在管理页面中检查服务器是否搭载了公网IP?是否有防火墙阻止了所有的外部访问?

最终你需要ping通服务器,再进行下一步。

配置域名解析

这一步非常简单,只需要在域名服务商的管理页面中,为自己的域名添加一条A记录。目的是将自己的域名与服务器的IP地址绑定。

新添加的DNS记录需要一段时间来同步,同步完成后,执行dig命令检查解析是否成功。

$ dig example.com

输出如下:

; <<>> DiG 9.16.23-RH <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27651
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;example.com.		IN	A

;; ANSWER SECTION:
example.com.	1372	IN	A	x.x.x.x

;; Query time: 5 msec
;; SERVER: 192.168.50.1#53(192.168.50.1)
;; WHEN: Fri May 23 13:19:09 CST 2025
;; MSG SIZE  rcvd: 60

后续在搭建HTTP Server、邮件等服务的过程中,还会添加更多的解析记录。

登录服务器

在本机执行以下命令,使用root账号和密码远程登录服务器,root密码通常在服务器的后台管理界面查询。

$ ssh root@example.com

安装vim编辑器

接下来我们需要安装编辑器,以便对系统进行配置

通过下面的命令安装vim编辑器。

# dnf install vim

vim编辑器使用方法可以运行vimtutor自行学习。

创建用户

创建一个普通用户,并设置密码。

# useradd example
# passwd example

配置sudo权限

sudo 是 Linux 中的一种权限控制工具,全称是 “superuser do“,意思是「以管理员身份执行命令」。

它允许你在不登录 root 用户的前提下,临时获得 root 权限,执行关键操作,比如安装软件、修改配置文件、重启服务等。

❓ 为什么不能直接用 root?

虽然你可以直接用 root 登录服务器,但这么做有几个明显的问题:

问题原因
风险极高root 权限无限,一旦误操作(如 rm -rf /)可能直接毁掉系统
不安全如果服务器被入侵,攻击者直接掌控整个系统
无法审计多人共享 root 账户时无法追踪是谁执行了什么操作
不符合最佳实践现代运维安全标准都建议用普通用户 + sudo 模式操作系统

✅ 配置 sudo 有什么好处?
优势说明
更安全日常使用非 root 用户,减少出错风险,关键操作时才切换权限
可控可审计可记录谁用了 sudo、执行了什么命令(存日志)
便于多用户协作给多个用户分配 sudo 权限,而不暴露 root 密码
兼容自动化工具很多脚本工具(如 Ansible)默认用 sudo 执行远程命令

配置 sudo 是为了在「安全」与「控制权」之间取得平衡:不给别人 root,却能完成所有需要的工作。

/etc/sudoers.d目录下创建与用户同名的文件

# vim /etc/sudoers.d/example

写入如下内容,使用户example能够执行所有命令。

example		ALL=(ALL)	ALL

退出ssh

# exit

从此之后,非必要不要用root登录系统!

配置SSH免密钥登录

🔑 什么是 SSH 免密钥登录?

它是指使用一对密钥(私钥 + 公钥) 代替密码登录服务器的方式。

  • 私钥:保存在你自己电脑上,不能泄露
  • 公钥:放在服务器上(通常放在 ~/.ssh/authorized_keys

当你用 SSH 连接服务器时,系统会验证你本地私钥是否匹配服务器上的公钥,如果匹配,就允许登录。

✅ 整个过程不需要输入密码,也比密码更安全。


❓ 为什么不直接用密码登录?

虽然用账号+密码也能登录服务器,但存在以下几个明显的缺点和风险:

问题说明
❌ 容易被暴力破解攻击者可以不停尝试用户名 + 密码组合,一旦猜中就拿下服务器
❌ 密码容易泄露输错、粘贴、截图等方式可能让密码暴露
❌ 自动化困难需要人工输入密码,批量操作、脚本部署都不方便
❌ 无法细粒度控制密码是“万能钥匙”,一旦泄露无法限定用途和来源 IP

✅ 配置 SSH 免密钥登录的好处
优势说明
🔒 更安全私钥只有你自己拥有,不能被猜测或暴力破解
更高效登录时无需每次输入密码,提升操作速度
🤖 便于自动化各类自动化工具(如 Ansible、Git、CI/CD)都依赖密钥登录
🧠 可与防火墙配合可禁用密码登录,只允许密钥登录,从根源上防暴力破解

SSH 免密钥登录更安全、更高效,是每个上线服务器必做的配置步骤。

在本机执行如下命令,生成公钥和私钥。

$ ssh-keygen

将公钥复制到服务器。

$ ssh-copy-id example@example.com

输入普通用户的密码来完成公钥的复制。

测试再次登录服务器,无需提供密码。

$ ssh example@example.com

一切顺利的话,你的shell提示符会显示:

[example@yourhostname ~]$

修改主机名

执行以下命令更改主机名,建议与域名保持一致。

$ sudo hostnamectl hostname <example.com>
$ hostnamectl hostname #检查是否更改成功

启用内置防火墙

🧩 systemctlsystemd 是什么关系?

systemd 是 Linux 系统中的初始化系统(init system)和服务管理器,它负责在系统启动时加载各种服务、管理进程、挂载文件系统等,堪称系统的大管家。

systemctlsystemd 提供的命令行工具,你可以通过它来:

  • 启动或停止服务
  • 设置服务开机自启
  • 查看服务状态
  • 重新加载配置等等

可以简单理解为:

systemd 是系统背后的“控制中心”,
systemctl 是你用来跟它对话的“遥控器”。

🧩 systemd 与单元文件的关系

systemd 是系统的大总管,负责启动和管理所有服务。
而它要管理什么、怎么管理,就是靠一份份 “单元文件(Unit File)” 来定义的。

每个单元文件就像一张服务说明书,告诉 systemd:

  • 要启动哪个程序
  • 启动时用什么命令
  • 需要依赖哪些服务
  • 出错时怎么处理

你用 systemctl 启动服务,背后其实就是 systemd 在读取并执行对应的单元文件。

systemd 是总指挥,单元文件是操作剧本,而 systemctl 是你下达指令的方式。

下面启动firewalld就是个很好的例子。

$ sudo systemctl enable firewalld
$ sudo systemctl start firewalld
$ systemctl status firewalld

#输出如下:

firewalld.service - firewalld - dynamic firewall daemon #firewalld.service就是单元文件的一种类型。
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
     Active: active (running)

启用SELinux

🔐 什么是 SELinux?为什么要开启它?

SELinux(Security-Enhanced Linux) 是 Linux 系统中的一个强制访问控制机制(MAC),由美国国家安全局(NSA)开发,用来进一步保护系统安全。

通俗地讲:

SELinux 就像系统里的“安保人员”,即使你是合法用户,也不能随便乱走乱动。


🧱 它是做什么的?

一般的 Linux 权限控制是基于用户和文件的读写执行权限,但这还不够:

比如一个被入侵的 Web 服务进程可能会尝试访问系统其他位置,甚至提权。
这时 SELinux 就能站出来说“不”,即使你有 root,只要没被授权,也不能越界。

它能实现:

  • 👀 限制服务进程只能访问允许的文件和端口
  • 🧱 阻止 Web 应用访问系统敏感目录
  • 🕵️‍♂️ 记录可疑操作并提供日志审计
  • ❌ 防止某些提权攻击和恶意模块加载

SELinux 是 Linux 的“第二道防线”,即使黑客突破了权限,也会被 SELinux 拦住。

在生产环境中,推荐将 SELinux 设置为 Enforcing 模式(强制执行),是系统级别安全加固的重要一步。

$ sudo setenforce 1
$ getenforce

#输出如下:

Enforcing

安装软件包

安装软件包示例:

$ sudo dnf install bash-completion #tab键命令补全

在后续的文章中如果遇到”command not found“的情况,可用以下方法处理。我们以tcpdump命令为例:

$ sudo dnf whatprovides tcpdump
tcpdump-14:4.99.0-6.el9.x86_64 : A network traffic monitoring tool
Repo        : rhel-9-for-x86_64-appstream-rpms
Matched from:
Provide    : tcpdump = 14:4.99.0-6.el9

tcpdump-14:4.99.0-7.el9.x86_64 : A network traffic monitoring tool
Repo        : rhel-9-for-x86_64-appstream-rpms
Matched from:
Provide    : tcpdump = 14:4.99.0-7.el9

tcpdump-14:4.99.0-7.el9_3.1.x86_64 : A network traffic monitoring tool
Repo        : rhel-9-for-x86_64-appstream-rpms
Matched from:
Provide    : tcpdump = 14:4.99.0-7.el9_3.1

tcpdump-14:4.99.0-9.el9.x86_64 : A network traffic monitoring tool
Repo        : @System
Matched from:
Provide    : tcpdump = 14:4.99.0-9.el9

tcpdump-14:4.99.0-9.el9.x86_64 : A network traffic monitoring tool
Repo        : rhel-9-for-x86_64-appstream-rpms
Matched from:
Provide    : tcpdump = 14:4.99.0-9.el9

#以上输出表示哪些软件包含有tcpdump命令

$ sudo dnf install tcpdump #这会安装最新版本的软件包

重启服务器

$ reboot

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注