文章

服务器简单配置流程

前两天从群友中得知了阿里云的高校活动,白嫖到了一年的 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 安装 mailutilsssmtp

然后修改 ` /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]

日常维护

为了服务器安全,需要定期上去看看服务器日志,并根据需要添加监控报警服务。我个人选择的是哪吒探针并添加了对应的报警规则,这里就不展开讲了。希望各位玩得愉快~

本文由作者按照 CC BY 4.0 进行授权