【配置优化】我拿到VPS服务器必做的那些事

之前看到有佬友发过类似的帖子,但是其中的部分配置我觉得有更好的实现方式,因此我也来给出我的调优方案。(如果有改进会持续更新…)
BTW,我的系统基本都是Debian系列的,所以如果有命令在你的系统上不适用,可以回帖询问。

一、系统设置

更新软件库

apt update -y && apt upgrade -y

更新、安装必备软件

apt install sudo curl wget nano

校正系统时间

将时区改为改成上海

sudo timedatectl set-timezone Asia/Shanghai
  • 查看当前时区:
timedatectl
  • 列出所有时区:
timedatectl list-timezones

系统参数调优

这个功能通过调整各种系统和网络参数来优化服务器的性能。

实现方法

  • 内核参数调整:例如,增加TCP缓冲区大小、修改系统队列长度等,这些改变有助于提高网络吞吐量和减少延迟。
  • 性能优化:安装和配置Tuned和其他系统性能优化工具来自动调整和优化服务器的运行状态。
  • 资源限制:例如,设置文件打开数量的限制,这可以防止某些类型的资源耗尽攻击。

通过这些功能,你的服务器不仅能够更有效地管理资源,还能提高对外部威胁的防护能力,保障系统稳定运行。

bash <(wget -qO- https://raw.githubusercontent.com/jerry048/Tune/main/tune.sh) -t

二、BBR

BBR 是 Google 提出的一种新型拥塞控制算法(Bottleneck Bandwidth and RTT),全称为瓶颈带宽和往返传播时间。

在 Linux 系统中,BBR 主要有以下特点和作用:

  • 提高网络性能:它可以显著提高吞吐量和降低 TCP 连接的延迟,使数据传输更加高效。
  • 适应不同网络环境:适合高延迟、高带宽的网络链路,以及慢速接入网络的用户,能在一定丢包率的网络链路上充分利用带宽,并降低网络链路上的缓冲区占用率从而降低延迟。
  • 优化拥塞控制:BBR 改变了传统基于丢包反馈的拥塞控制机制,通过精确测量往返传播时间(RTT)和瓶颈带宽等参数来更有效地控制数据发送速率,避免了传统算法中因单纯丢包判断拥塞而导致的带宽利用率不高和端到端延迟大等问题。
  • 提升网络稳定性:有助于减少网络拥塞和数据包丢失,提高网络的稳定性和可靠性。

​因为我本人是PT玩家,所以接触到了一位大佬自己魔改的BBR版本,也就是BBRx。该版本调整了类似 startup(启动阶段)、drain(排空阶段)、probe_bw(探测带宽阶段)、probe_rtt(探测往返时间阶段)等状态下的一些关键参数,如 pacing_gain(发送速率增益)、cwnd_gain(拥塞窗口增益)等,个人来说觉得比原版BBR的效果更好,如果不喜欢的话,可以选择原版BBR进行安装。

开启BBRX加速

bash <(wget -qO- https://raw.githubusercontent.com/jerry048/Tune/main/tune.sh) -x

重启 VPS、使内核更新和BBR设置都生效

sudo reboot

确认BBR开启

如果你想确认 BBR 是否正确开启,可以使用下面的命令:

lsmod | grep bbr

此时应该返回这样的结果:

tcp_bbrx
tcp_bbr

再次重启 VPS

sudo reboot

如果只有tcp_bbr则再等几分钟reboot

此时再进行查询:

lsmod | grep bbr

此时应该返回这样的结果:

tcp_bbrx

开启BBR加速(备选)

wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh

也是重启VPS生效

三、添加SWAP

在 Linux 系统中,SWAP(交换空间)是指一块磁盘空间,用于在物理内存(RAM)不足时,作为临时的扩展内存来使用。当系统的物理内存使用量接近饱和,Linux 内核会将一些不常使用的内存页交换到 SWAP 分区中,从而为当前运行的程序腾出更多的物理内存。当这些被交换出去的内存页再次被需要时,它们会被重新换回到物理内存中。SWAP 分区的存在可以在一定程度上避免由于物理内存不足导致系统性能严重下降或进程被强制终止的情况。

因此,SWAP对于内存小的VPS非常有必要,可以提高我们的运行效率。

这里我们用脚本来添加。

wget -O swap.sh https://raw.githubusercontent.com/yuju520/Script/main/swap.sh && chmod +x swap.sh && clear && ./swap.sh

查看当前内存

free -m

四、安装Docker、Docker-compose以及修改配置

Docker

Docker安装

非大陆服务器

wget -qO- get.docker.com | bash

curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh

大陆服务器Docker安装

curl https://install.1panel.live/docker-install -o docker-install && sudo bash ./docker-install && rm -f ./docker-install

查看Docker版本

docker -v

开机自动启动

sudo systemctl enable docker

卸载Docker

sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo apt-get remove docker docker-engine
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Docker-compose安装

经佬友反馈,Docker从18.06.0-ce 版本就开始自带Docker Compose工具,因此,我们只需要检验Docker Compose的版本。

查看Docker Compose版本

docker compose version

五、修改SSH端口

修改 SSH 端口通常有以下几个主要原因:

  1. 增强安全性:SSH 服务默认使用的 22 端口是攻击者经常扫描和尝试攻击的目标。通过将端口修改为一个不常见的数值,可以减少自动攻击和暴力破解的风险,因为攻击者通常会首先针对常见的默认端口进行攻击。

例如,如果攻击者使用自动化工具扫描大量服务器,这些工具可能主要集中在 22 端口。而修改了端口后,就降低了被这类工具轻易发现和攻击的可能性。

  1. 减少误连接和非法访问尝试:一些网络环境中可能存在大量的随机连接请求或非法访问尝试,针对默认的 22 端口。更改端口可以减少这类无意义的连接请求。

假设您的服务器处于一个公共网络环境中,经常会收到大量的随机连接尝试,其中很多是针对常见端口的。修改 SSH 端口可以减少这类不必要的干扰。

将默认的22端口修改为55520(暗戳戳地表白)@wanwan

sudo sed -i 's/^#\?Port 22.*/Port 55520/g' /etc/ssh/sshd_config

重启sshd服务

sudo systemctl restart sshd

六、密钥登录

一键生成你的密钥

wget -O key.sh https://raw.githubusercontent.com/yuju520/Script/main/key.sh && chmod +x key.sh && clear && ./key.sh

!!!注意:请牢记你生成的密钥,否则会有无法连接SSH的后果。!!!

七、安装fail2ban

安装fail2ban

apt install fail2ban

配置fail2ban

fail2ban的配置文件通常位于 /etc/fail2ban/ 目录下,fail2ban的.conf配置文件都是可以被.local覆盖,所以配置方式建议是添加.local文件,不修改原来的配置文件。

nano /etc/fail2ban/jail.local

配置文件如下:

[DEFAULT]
#忽略的IP列表,不受设置限制(白名单)
ignoreip = 127.0.0.1

#允许ipv6
allowipv6 = auto

#日志修改检测机制(gamin、polling和auto这三种)
backend = systemd

#针对各服务的检查配置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置

[sshd]

#是否激活此项(true/false)
enabled = true

#过滤规则filter的名字,对应filter.d目录下的sshd.conf
filter = sshd

#ssh端口
port = ssh

#动作的相关参数
action = iptables[name=SSH, port=ssh, protocol=tcp]

#检测的系统的登陆日志文件
logpath = /var/log/secure

#屏蔽时间,单位:秒
bantime = 86400

#这个时间段内超过规定次数会被ban掉
findtime = 86400

#最大尝试次数
maxretry = 3

Ctrl+S保存并退出

设置开机自动启动fail2ban

sudo systemctl enable fail2ban

重新启动fail2ban

sudo systemctl restart fail2ban

查看fail2ban的状态

sudo systemctl status fail2ban

查看所有可用jail的状态

fail2ban-client status

感谢你的点赞,你的每一个小心心都证明了我不是只会水贴 :tieba_009:

589 Likes

先mark住,太强了佬

10 Likes

都是跟大佬们学的

9 Likes

感谢感谢

3 Likes

Mark; 感谢分享

4 Likes

Mark了
去研究一下脚本

2 Likes

感谢分享

3 Likes

感谢分享 建议写一个一键脚本 哈哈

2 Likes

万一有些配置别人不需要咋整

4 Likes

感谢分享,大佬今天分享太多辣 :tieba_007:

2 Likes

知识储备暂时还没被榨干

8 Likes

非常棒 感觉可以偷到自己的md文件里哈哈哈哈

3 Likes

读书人的事情,怎么能说偷呢

3 Likes

拉比克:这叫借

3 Likes

可以选择的,分享一下我的

#!/bin/bash
user=${SUDO_USER}
dl_host="https://db2.666666.xyz"

#定义输出颜色的功能
rmsg() { echo -e "\033[31m$*\033[0m"; }
gmsg() { echo -e "\033[32m$*\033[0m"; }
bmsg() { echo -e "\033[34m$*\033[0m"; }

#定义菜单的字典 和 选择的字典
declare -A options
declare -A choices=([0]="এ" [1]="এ" [2]="এ" [3]="এ" [4]="এ" [5]="এ")
#从options 里面获取的keys 顺序会变化, 所以这里写个数组直接定义菜单顺序
keys=(0 1 2 3 4 5)
#定义菜单选项
options[0]="AOSP编译环境配置"
options[1]="配置gitconfig、repo"
options[2]="配置adb及USB规则"
options[3]="配置ssh、vim、samba"
options[4]="安装AS、Chrome、Bcompare、jadx"
options[5]="配置docker-compose环境"

#定义错误信息变量
ERROR=" "
#清理显示
clear

#显示菜单
function MENU {
  bmsg "请使用sudo ./init.sh来执行此脚本"
  bmsg "菜单选项"
    for NUM in ${keys[*]}; do
        gmsg "[""${choices[$NUM]:- }""]" $NUM") ${options[$NUM]}"
    done
    rmsg "$ERROR"
}

showMenu(){
#循环菜单达到多选目的
    while MENU && read -e -p "根据菜单选择需要部署/取消,按Enter结束: " -n1 SELECTION && [[ -n "$SELECTION" ]]; do
        clear
        if [[ ${options[$SELECTION]} ]]; then
            if [[ "${choices[$SELECTION]}" == "এ" ]]; then
                unset choices[$SELECTION]
            else
                choices[$SELECTION]="এ"
            fi
                ERROR=" "
        else
            ERROR="非法参数: $SELECTION"
        fi
    done
}

# 配置软件源及安装几个基本软件
set_base_env(){
    bmsg "##### 安装基本软件  #####"
    sudo apt-get -y update && sudo apt-get -y upgrade
    sudo apt-get install -y -qq --no-install-recommends git vim openssh-server git-core curl wget unzip zip
    sudo apt-get -y remove --purge modemmanager firefox
    sudo snap remove firefox
    sudo dpkg --configure -a
    bmsg "##### end install base env #####"
}

set_apt_env(){
    bmsg "##### 安装必要的软件  #####"
    sudo apt-get install -y -qq --no-install-recommends openjdk-11-jdk fcitx fcitx-table-wbpy git-core openssh-server g++ samba python-is-python3 \
       zip unzip flex bc rsync bison gperf gnupg m4 ccache curl genisoimage xsltproc tofrodos aapt jq \
       build-essential gcc-multilib g++-multilib libc6-dev-i386 lib32z-dev lib32ncurses5-dev kmod dpkg-dev x11proto-core-dev zlib1g-dev \
       libsdl1.2-dev libx11-dev libgl1-mesa-dev libgl1-mesa-dev libxml2-utils libssl-dev vim git openjdk-8-jdk openssh-server sudo git-lfs \
       net-tools python2 python2.7 usbutils imagemagick less device-tree-compiler cpio lz4 libncurses5 mkbootimg libxml-simple-perl
    curl -sL https://deb.nodesource.com/setup_18.x | sudo bash -
    sudo apt-get -y install nodejs
    sudo dpkg --configure -a
    bmsg "##### end apt install android build env #####"
}

set_smbconf(){
mkdir -p /etc/samba/ && touch /etc/samba/smb.conf
cat >> /etc/samba/smb.conf <<EOF
[Movies]
  comment = readonly
  path = /work/share/Movies
  public = yes
  browsable = yes
  read only = yes
  guest ok = yes
[Camera]
  comment = writeable
  path = /work/share/Camera
  public = yes
  browsable = yes
  writeable = yes
  force user = master
  create mask = 0755
EOF
#service smbd restart
}

set_gitconfig(){
cat > /home/$user/.gitconfig <<EOF
[user]
	name = master
	email = [email protected]
[core]
    editor = vim
	quotepath = false
[color]
    ui = auto
    status = auto
    log = auto
[alias]
    lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --topo-order
    br = branch
    co = checkout
    ci = commit
[pack]
    windowMemory = 100m
    packSizeLimit = 100m
    threads = 1
[url "https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/"]
    insteadof = https://android.googlesource.com
[url "[email protected]:"]
    insteadof = git://github.com/
[commit]
    template = ~/.gitmessage
EOF
}

# 配置usb规则
set_usb_rules(){
    rulePath="/etc/udev/rules.d/51-android.rules"
    bmsg "##### 配置USB文件 $rulePath #####"
    mkdir -p /etc/udev/rules.d/
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", MODE="0666", GROUP="plugdev"' >  $rulePath
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"' >> $rulePath
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2e04", MODE="0666", GROUP="plugdev"' >> $rulePath
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="1532", MODE="0666", GROUP="plugdev"' >> $rulePath
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666", GROUP="plugdev"' >> $rulePath
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="1f3a", MODE="0666", GROUP="plugdev"' >> $rulePath
    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="22d9", MODE="0666", GROUP="plugdev"' >> $rulePath
    sudo service udev restart
}

#配置chrome浏览器
down_chrome(){
    bmsg "##### 下载安装 google-chrome #####"
    curl -s https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o /tmp/google_chrome.deb
    sudo dpkg -i /tmp/google_chrome.deb
}

# 下载安装BC
down_bcompare(){
    bmsg "##### 下载安装 bcompare #####"
    #curl -s https://www.scootersoftware.com/bcompare-4.4.3.26655_amd64.deb -o /tmp/bcompare.deb
    curl -s $dl_host/soft/zbcompare-4.4.3.26655_amd64.deb -o /tmp/bcompare.deb
    sudo dpkg -i /tmp/bcompare.deb
    mkdir -p /home/$user/.config/bcompare/
    mkdir -p /home/$user/bin/
    curl -s $dl_host/conf/bcompare/BC4Key.txt -o /home/$user/.config/bcompare/BC4Key.txt
    curl -s $dl_host/conf/bcompare/BCPreferences.xml -o /home/$user/.config/bcompare/BCPreferences.xml
    curl -s $dl_host/conf/bcompare/BCCommands.xml -o /home/$user/.config/bcompare/BCCommands.xml
    curl -s $dl_host/conf/bcompare/BCFileFormats.xml -o /home/$user/.config/bcompare/BCFileFormats.xml
    curl -s $dl_host/conf/bcompare/menu.ini -o /home/$user/.config/bcompare/menu.ini
    sed -i "s/keexjEP3t4Mue23hrnuPtY4TdcsqNiJL-5174TsUdLmJSIXKfG2NGPwBL6vnRPddT7tH29qpkneX63DO9ECSPE9rzY1zhThHERg8lHM9IBFT+rVuiY823aQJuqzxCKIE1bcDqM4wgW01FH6oCBP1G4ub01xmb4BGSUG6ZrjxWHJyNLyIlGvOhoY2HAYzEtzYGwxFZn2JZ66o4RONkXjX0DF9EzsdUef3UAS+JQ+fCYReLawdjEe6tXCv88GKaaPKWxCeaUL9PejICQgRQOLGOZtZQkLgAelrOtehxz5ANOOqCaJgy2mJLQVLM5SJ9Dli909c5ybvEhVmIC0dc9dWH+/N9KmiLVlKMU7RJqnE+WXEEPI1SgglmfmLc1yVH7dqBb9ehOoKG9UE+HAE1YvH1XX2XVGeEqYUY-Tsk7YBTz0WpSpoYyPgx6Iki5KLtQ5G-aKP9eysnkuOAkrvHU8bLbGtZteGwJarev03PhfCioJL4OSqsmQGEvDbHFEbNl1qJtdwEriR+VNZts9vNNLk7UGfeNwIiqpxjk4Mn09nmSd8FhM4ifvcaIbNCRoMPGl6KU12iseSe+w+1kFsLhX+OhQM8WXcWV10cGqBzQE9OqOLUcg9n0krrR3KrohstS9smTwEx9olyLYppvC0p5i7dAx2deWvM1ZxKNs0BvcXGukR+/g" /usr/lib/beyondcompare/BCompare
    echo "sed -i 's/<CheckID\(.*\)/<CheckID Value=\"252180231804521\"\/>/' ~/.config/bcompare/BCState.xml" >/home/$user/bin/bcKey
    chmod a+x /home/$user/bin/bcKey
    chown -R $user:$user /home/$user/.config/bcompare/
    chown -R $user:$user /home/$user/bin/
}

# 下载安装AS
down_as(){
    bmsg "##### 下载安装AS #####"
    curl -s https://r3---sn-j5o7dn7z.gvt1-cn.com/edgedl/android/studio/ide-zips/2023.2.1.23/android-studio-2023.2.1.23-linux.tar.gz -o /tmp/android_studio.tar.gz
    #curl -s https://r4---sn-j5o7dn7s.gvt1.com/edgedl/android/studio/ide-zips/2022.1.1.21/android-studio-2022.1.1.21-linux.tar.gz -o /tmp/android_studio.tar.gz
    tar -zxf /tmp/android_studio.tar.gz -C /opt/
    chown -R $user:$user /opt/android-studio
    desktop="/usr/share/applications/android-studio.desktop"
    echo "[Desktop Entry]" >$desktop
    echo "Type=Application" >>$desktop
    echo "Name=Android Studio" >>$desktop
    echo "Exec=/opt/android-studio/bin/studio.sh" >>$desktop
    echo "Icon=/opt/android-studio/bin/studio.png" >>$desktop
    echo "Categories=Development;IDE;" >>$desktop
    echo "Terminal=false" >>$desktop
    echo "StartupNotify=true" >>$desktop
}

down_jadx(){
    bmsg "##### 下载安装 jadx #####"
    curl -s $dl_host/soft/jadx-1.3.5.zip -o /tmp/jadx.zip
    unzip /tmp/jadx.zip -d /opt/jadx > /dev/null
    ln -sf /opt/jadx/bin/jadx-gui /usr/bin/jxx
}

# 配置adb及fastboot
set_android_tools(){
    bmsg "##### 安装及配置adb、fastboot工具 #####"
    #https://developer.android.google.cn/studio/releases/platform-tools
    curl -sL https://dl.google.com/android/repository/platform-tools-latest-linux.zip -o /tmp/platform-tools-linux.zip
    rm -rf /usr/bin/fastboot /usr/bin/adb /usr/lib/android-sdk/
    unzip /tmp/platform-tools-linux.zip -d /usr/lib/android-sdk/
    ln -sf /usr/lib/android-sdk/platform-tools/adb /usr/bin/adb
    ln -sf /usr/lib/android-sdk/platform-tools/fastboot /usr/bin/fastboot
}

# 下载私有文件
set_others(){
    mkdir -p /home/$user/.android/
    mkdir -p /home/$user/.ssh/
    curl -s $dl_host/conf/android/adbkey -o /home/$user/.android/adbkey
    curl -s $dl_host/conf/android/adbkey.pub -o /home/$user/.android/adbkey.pub
    curl -s $dl_host/conf/ssh/id_rsa -o /home/$user/.ssh/id_rsa
    curl -s $dl_host/conf/ssh/id_rsa.pub -o /home/$user/.ssh/id_rsa.pub
    curl -s $dl_host/conf/vimrc -o /home/$user/.vimrc
    chown -R  $user:$user /home/$user/
    chmod 600 /home/$user/.ssh/id_rsa*
    # 装todesk后无法远程控制
    if [ -f "/etc/gdm3/custom.conf" ]; then
        sed -i "s/#WaylandEnable/WaylandEnable/" /etc/gdm3/custom.conf
    fi
}

# 配置repo
set_repo(){
    bmsg "##### 为$user添加环境变量 #####"
    echo "export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'" >> /etc/profile
    bmsg "##### 配置vim repo 等 #####"
    curl -s https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o /usr/bin/repo
    chmod +x /usr/bin/repo
    sudo apt-get clean
}

down_docker(){
    bmsg "##### 安装docker 及docker-compose #####"
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    curl -L https://g.666666.xyz/https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    bmsg "##### 配置docker权限 #####"
    usermod -aG docker $user
}

actions(){
    set_base_env
    if [[ "${!choices[@]}" =~ "0" ]];then
        set_apt_env
    fi
    if [[ "${!choices[@]}" =~ "1" ]];then
        set_gitconfig && set_repo
    fi
    if [[ "${!choices[@]}" =~ "2" ]];then
        set_usb_rules && set_android_tools
    fi
    if [[ "${!choices[@]}" =~ "3" ]];then
        set_smbconf && set_others
    fi
    if [[ "${!choices[@]}" =~ "4" ]];then
        down_chrome && down_bcompare && down_as && down_jadx
    fi
    if [[ "${!choices[@]}" =~ "5" ]];then
        down_docker
    fi
}

main(){
    if [[ $EUID -ne 0 ]]; then
        rmsg "权限需要提升:该安装程序必须由sudo执行" 1>&2
        exit
    fi
    showMenu
    bmsg "当前选择的是: ${!choices[@]}"
    actions 
}

main $*
rmsg "脚本执行结束,最好重启"
10 Likes

送我一台宝贝

9 Likes

学习了,有空搓一个

3 Likes

什么宝贝的量词居然是“台”

3 Likes

xui还有嗷妹妹哈哈哈哈

5 Likes

xui不是每个服务器都必做的吧,这个单独配置比较好

2 Likes