服务器简单配置流程
前两天从群友中得知了阿里云的高校活动,白嫖到了一年的 2c1g 新加坡云服务器,小小玩了一下,顺便记录了一下一些相关配置流程。
dd 系统
由于官方默认系统定制化较多,且提供了监控等多余插件,占用系统资源,而云服务器通常资源紧张,因此先 dd 一个纯净的系统,清理掉其它无用的工具。这里以 Debian11 为例。
运行下述命令,然后等待一段时间后根据配置的端口密码以 root 用户重登系统就行了。
1
2
3
4
5
#下载脚本
wget --no-check-certificate -qO InstallNET.sh 'https://raw.githubusercontent.com/leitbogioro/Tools/master/Linux_reinstall/InstallNET.sh' && chmod a+x InstallNET.sh
# 选择 debian11 系统,配置 ssh 服务器端口号和 root 密码
bash InstallNET.sh -debian 11 -pwd xxxxx -port 22222
性能测试
如果需要的话,可以通过以下脚本分别测试服务器各方面性能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#cpu:
bash <(curl -sL gb5.top)
#测网络
wget -qO- network-speed.xyz | bash
#测流媒体解锁情况
bash <(curl -L -s https://netflix.dad/detect-script)
#磁盘 IO 测试
wget -qO- bench.sh | bash
#综合测试
## 交互形式
bash <(wget -qO- --no-check-certificate https://gitlab.com/spiritysdx/za/-/raw/main/ecs.sh)
### 或者
bash <(wget -qO- --no-check-certificate https://github.com/spiritLHLS/ecs/raw/main/ecs.sh)
## 无交互形式
echo 1 | bash <(wget -qO- --no-check-certificate https://gitlab.com/spiritysdx/za/-/raw/main/ecs.sh)
### 或者
echo 1 | bash <(wget -qO- --no-check-certificate https://github.com/spiritLHLS/ecs/raw/main/ecs.sh)
配置交换内存
由于一般云服务器的内存比较紧张,而硬盘大小绰绰有余,所以配置 1.5 - 2 倍内存大小的硬盘作为交换内存以避免时不时爆内存
1
2
3
4
5
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
配置默认编辑器
一般系统会使用 nano 作为默认文本编辑器,只是我习惯了使用 vim,所以使用下面命令切换默认文本编辑器。
1
update-alternatives --config editor
更新软件包
由于服务器镜像通常软件包不一定是最新的,所以在进行其它配置前先更新镜像源和软件包:
切换镜像源
镜像源通常选择各云服务器厂家自家的,走内网的话快速。不过因为我这个服务器位置在新加坡,所以就用原来自带的官网镜像源。镜像源配置文件不同系统有所区别,Debian 系列的话在 /etc/apt/sources.list
。一般进行配置的话首先备份源镜像源配置文件,然后将其文件顶部添加类似下面的内容,具体条目的话根据系统和镜像源厂家的不同也有所区别,一般在镜像源网站上都列有具体条目,如阿里云的 镜像源网站。
1
2
3
4
5
6
7
8
deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main
deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
之后更新软件包缓存:
1
apt makecache
更新软件包
1
2
apt-get update
apt-get upgrade
配置时区和时间
设置时区为亚洲/上海,并检查当前时间
1
2
sudo timedatectl set-timezone Asia/Shanghai
date
有时候系统时间不准,或者运行一段时间后有所偏差。这时候使用 ntp 服务或者硬件时钟 hwclock + cron 服务去定时同步时间,我这里因为硬件时钟是正确的,所以使用硬件时钟去校准了。
首先运行 crontab -e
,在最下面添加如下内容,让服务器每天中午根据硬件时间校准系统时间:
1
0 12 * * * hwclock -s
配置 ssh 保持登录
ssh 连接服务器后,如果长时间没有操作,会自动断开连接。可以通过一些配置来保持 ssh 连接。
首先在服务端运行 vi /etc/ssh/sshd_config
,添加或修改如下行
1
2
ClientAliveInterval 60
ClientAliveCountMax 3
之后重启 sshd 服务
1
systemctl restart sshd
然后在 ssh 客户端配置文件中对应服务器的配置下添加如下行
1
2
3
4
5
6
7
TCPKeepAlive=yes
ServerAliveInterval=5
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
添加日常使用用户
由于 root 用户权限过大,故需新建个普通用户用于日常操作。这里使用下面命令交互式创建了个普通用户 ssr。
1
sudo adduser ssr
允许用户使用 sudo 命令(可选)
为了方便使用,我设置了允许该用户使用提权指令并免输密码。首先运行 sudo visudo
,并在文件最后面一行添加:
1
ssr ALL=(ALL) NOPASSWD: ALL
如果不想设置为免密提权,可以删除 ` NOPASSWD: `,或者通过不进行上述配置,而是通过以下命令把 ssr 添加进 sudo 组来让其能进行提权(提权时需要输入密码):
1
sudo usermod -aG sudo ssr
切换用户并测试提权指令
1
2
su ssr
sudo date
为用户 ssr 添加密钥并关闭 root 登录(可选)
因为密码登录一般相对不是很安全,而且每次登录时需要手动输入密码,还可能被其它人进行 ssh 爆破,所以使用密钥并关闭掉密码登录。首先本地执行下面命令来生成密钥对:
1
ssh-keygen -t ed25519 -C "[email protected]"
服务器上切换到目标用户并依次执行下述命令:
1
2
3
4
5
mkdir -p ~/.ssh
vi ~/.ssh/authorized_keys
#把公钥复制进去
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
之后使用 vi /etc/ssh/sshd_config
修改以下行
1
2
# 允许密钥登录
PubkeyAuthentication yes
重启 sshd 服务
1
sudo systemctl reload sshd
之后在客户端修改服务器登录配置,如果能通过密钥正常登录目标用户后再修改 sshd_config
的如下行并重启 sshd 服务以禁用密码登录和 root 用户登录。修改过程中切记先开新的终端 ssh 连接上后再关闭原来的 ssh 连接,避免把自己关在房子外。
1
2
3
4
# 禁用 root 和密码登录
PasswordAuthentication no
PermitRootLogin no
配置 fail2ban 阻拦 SSH 爆破攻击
fail2Ban 是一个用于保护 Linux 服务器免受暴力破解攻击的安全软件。它通过分析日志文件来检测对服务器的访问尝试。如果检测到某个 IP 地址在一定时间内多次尝试失败的登录,Fail2Ban 可以自动禁止该 IP 地址在一段时间内访问服务器,从而防止暴力破解攻击。
首先安装 fail2ban
1
apt install fail2ban
之后使用 vi /etc/fail2ban/jail.local
创建配置文件,一个简单的配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[DEFAULT]
# 配置忽略检测的 IP (段),添加多个需要用空格隔开
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
# ssh 的端口,如果使用非默认端口 22,要修改为实际使用端口
port = 22
# 配置使用的匹配规则文件(位于 /etc/fail2ban/filter.d 目录中)
filter = sshd
# 配置 IP 封禁的持续时间(years/months/weeks/days/hours/minutes/seconds)
bantime = 1h
# 是否开启增量禁止,可选
bantime.increment = true
# 如果上面为 false 则不生效,增量禁止的指数因子,这里设置为 168 的意思就是每次增加 168*(2^ban 次数) (封禁时长类似这样 - 1 小时 -> 7 天 -> 14 天 ...):
bantime.factor = 168
# 最大封禁时间,8w 表示 8 周,可选
bantime.maxtime = 8w
# 配置计算封禁 IP 的具体滑动窗口大小
findtime = 5m
# 配置在 findtime 时间内发生多少次失败登录然后将 IP 封禁
maxretry = 3
# 配置封禁 IP 的手段(位于 /etc/fail2ban/action.d 目录中),可通过 iptables、firewalld 或者 TCP Wrapper 等,此处设置为 hostsdeny 代表使用 TCP Wrapper
action = hostsdeny
logpath = %(sshd_log)s
backend = %(sshd_backend)s
然后重启 fail2ban 服务
1
systemctl restart fail2ban #重启服务
开启 BBr tcp 加速算法
BBr 算法是一种 TCP 拥塞控制算法,能够优化网络的吞吐量和延迟,基本上已经集成到系统内核了,只是默认设置为关闭,可以通过以下命令打开
1
2
3
4
5
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
sysctl net.ipv4.tcp_available_congestion_control | grep bbr
运行完上面命令如果看到最后输出有 bbr 则说明成功打开了
安装 docker
docker 的安装 该开源项目 上已经写的很完善了,选择正确的系统并按照流程安装即可
使用 docker watchtower 监视容器
Watchtower 是一个用于 Docker 容器的自动更新工具。它监视正在运行的 Docker 容器及其对应的镜像。如果 Watchtower 检测到镜像有更新,它会自动拉取新版本的镜像,并以相同的方式重启容器,使用新拉取的镜像。这样可以确保你的容器总是运行最新版本的镜像,从而简化了容器管理和更新过程。
可以使用下面命令启动 Watchtower 容器,更新间隔我设置为了 3600
s
1
docker run -d --name watchtower --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -c --interval 3600
配置 rclone+restic 备份服务
rclone 可以通过配置,把云盘挂载到系统上,可以逻辑上扩展系统的存储空间。一般而言可以搭配 alist 来使用,首先使用 alist 挂载百度网盘、阿里云盘、onedrive等网盘,然后使用 alist 提供可以访问这些网盘的 webdev 服务,之后使用 rclone 通过 webdev 协议挂载这些网盘。
而 restic 是备份服务,用来自动备份指定的目录。由于原版的 restic 有些功能使用较繁琐,这里使用了其封装版 autorestic
进行配置管理。
总体而言,我通过使用这两个服务,定时将服务器上的文件配置备份到云盘。
配置 rclone
运行 sudo -v ; curl https://rclone.org/install.sh | sudo bash
安装rclone
然后使用 rclone config
添加可用云端。如果配置有问题,可以再次运行进行增添改查(:
对于配置好的的云端,假设其名字是 ali,可以通过以下命令查看其内文件:
1
rclone lsd ali:
配置 restic
运行 wget -qO - https://raw.githubusercontent.com/cupcakearmy/autorestic/master/install.sh | bash
安装 autorestic
然后使用命令 restic -r rclone:ali:/backup init
初始化在 rclone 的 ali 云端的 backup 路径初始化 restic 仓库
之后选择一个路径创建自动配置文件 .autorestic.yml 并添加下面内容并根据需要进行修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: 2
extras:
policies: &bar
keep-last: 7 # 指定保留快照的策略,这里的配置意思是每天备份保留最近 7 天,周备份保留最近 4 周,月备份保留最近 4 月,年备份保留最近 2 月
keep-weekly: 4
keep-monthly: 4
keep-yearly: 2
locations:
user_data:
from:
- '/home/ssr/docker' # 根据需要填写要备份的路径
- '/home/ssr/cert'
- '/home/ssr/errorcert'
- '/home/ssr/app'
to:
- baidu # 后端,上面这些路径需要备份到哪些 restic 仓库
- ali
forget: prune
cron: '0 3 * * *' # 定时操作设置,5个值对应 分、时、日、月、周几,这里的表达式是每天早上 3 点进行备份
options: # 这些都是传给 restic 的参数
all: # 这些会传给所有的 restic 命令
tag: home
forget: # 会传给 restic forget 命令,下面的 backup 同理
<<: *bar
backup:
exclude-larger-than: 3G
backends:
# external_hdd:
# type: local # 本地源
# path: 'E:\Backups\UserDirectory_Restic'
# key: 'xxxxx' # 源的密码,前面 restic init 时设置的,下同
aliyun:
type: rclone
path: 'baidu:/backup' # 注意这里和手动跑 restic 不同,不需要写 rclone:aliyun:/backup/xxxxxxxxxxxx 了
key: 'xxxxx'
onedrive:
type: rclone
path: 'ali:/backup'
key: 'xxxxx'
使用命令autorestic backup -a --config /your_path/.autorestic.yml
手动备份进行测试,如果没问题则使用命令crontab -e
添加如下定时备份任务:
1
2
3
PATH="/usr/local/bin:/usr/bin:/bin:$PATH"
# Example running every 10 minutes
*/10 * * * * /usr/local/bin/autorestic -c /root/.autorestic.yml --ci cron
通过外部 smtp 服务器配置服务器域名邮件发送服务
由于直接配置邮件发送服务可能会暴露服务器 ip,所以可以选择通过第三方邮件发送服务器来进行域名邮件代发,如谷歌邮箱、QQ邮箱、网易邮箱等。根据情况选择合适的服务商,在服务商上配置完成后会得到 sstp 登录账户。然后配置服务器发送邮件时,将邮件转交给对应服务商以让其代发。
首先通过 apt 安装 mailutils
和 ssmtp
。
然后修改 ` /etc/ssmtp/ssmtp.conf `,指定外部的 smtp 服务器地址、帐号密码等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
# Where will the mail seem to come from?
#rewriteDomain=
# The full hostname
hostname=xxxx.xie-zh.com
# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES
#
#
[email protected]
mailhub=xxxx.xxxx.com:465 # smtp 服务器地址
[email protected] # smtp授权账户
AuthPass=xxxxxxxx # smtp授权密码
UseTLS=Yes
测试:
echo "test" | mail -s "test" [email protected]
日常维护
为了服务器安全,需要定期上去看看服务器日志,并根据需要添加监控报警服务。我个人选择的是哪吒探针并添加了对应的报警规则,这里就不展开讲了。希望各位玩得愉快~