年轻人的第一台 VPS 设置
前言
对于个人用户来说云服务器成本总是过于昂贵的,如果个人业务不需要高度可扩展性、弹性资源和高可用性,这时 VPS (虚拟专用服务器)更加合适,本文将介绍个人使用 VPS 时基础配置以及性能测试方法。
🪷 由于个人也是摸索使用技术力浅薄,文中出现任何问题、错误请和平讨论,谢谢~
💣 注意:本文不涉及推荐任何云服务商,文中出现仅用于举例使用。
VPS 的特点
VPS 最大的特点是在一台物理服务器上创建的虚拟实例,每个实例有自己的操作系统和资源分配。资源是固定的,扩展性有限。而云服务器则是基于云计算架构,可以动态分配和调整资源,具有更好的可扩展性和可靠性。
在使用 VPS 时我们往往有着明确的目标,个人建站、托管数据、离线下载服务器、反向代理等等。 我们往往会依据自己的需求选择 VPS 的资源,当前我比较常用的是 DigitalOcean Droplets 与 Amazon Lightsail,它俩的最低价格如下,可见价格很低但是资源也是少的可怜🥺:
开机
接下来我们创建对应虚拟机,这里以 DigitalOcean Droplets 举例,它有如下几个国家的服务器,自己选择个网速比较快的,我都开了个遍,发现对于杭州移动而言旧金山反而慢于悉尼,查了路由路线也是绕了一圈到洛杉矶才到悉尼,只能怀疑是旧金山路线繁忙了😂,按如下方法创建 Droplets 也就是 DO 提供的 VPS 服务,选择区域:
不同区域会影响后续机型价格,例如选择旧金山数据中心 SFO1 最低档的资源会没法选择,换一换机房就好了,选择想要的配置:
接下来选择鉴权方式,这里推荐使用密钥鉴权的方法,自己上传个公钥上来,这样会安全的多有效避免被攻击成肉鸡:
创建密钥的方法:ssh-keygen 生成密钥 --- Linux latest 文档 (gnu-linux.readthedocs.io)
其他选项默认,最终确认下价格符合自己选择的计划后就可以创建对应 VPS 了:
在项目列表中会有新建的 VPS 服务器信息,通过这个 ip 即可连接服务器:
再次声明下并不涉及任何服务商推荐,仅仅是展示创建一个 VPS 大致流程,其他服务商大同小异,而且 DO 的 IP 池一言难尽🤣,仅仅是我还剩不少额度浪费不心疼,大家要自己多找找适合自己的。
安全设置
SSH 安全
‼️ 重要:修改 SSHD 相关配置前一定要备份相关脚本并且重启服务后,千万不要断开当前的连接,先用新终端尝试是否可以连接,避免 VPS 失联 😓
-
ssh 登陆鉴权,推荐使用密钥进行 ssh 登陆,仅上传公钥,千万别把私钥放到服务器上;
-
sshd 为服务端,其配置文件通常在:
/etc/ssh/sshd_config
,如下配置项建议修改;sh# =========== Degub ============== # 端口, 默认22,一般都是全端口扫描修改意义不大 Port 22 # 指定将日志消息通过哪个日志子系统(facility)发送,调试时使用 SyslogFacility AUTH # 指定日志等级,调试时使用 LogLevel INFO # ========== 鉴权 ============= # 限制用户必须在指定的时限(单位秒)内认证成功 LoginGraceTime 2m # 允许root用户登录 PermitRootLogin yes # 是否允许密码验证,使用密钥校验后强烈建议禁止密码验证 PasswordAuthentication no # 是否允许空密码,同上 PermitEmptyPasswords no # 是否允许X11转发,一般VPS也没有UI,不需要 X11Forwarding no #X11DisplayOffset 10 #X11UseLocalhost yes # 配置超时 TCPKeepAlive yes ClientAliveInterval 120 ClientAliveCountMax 10 # VPS 不需要,如果只想在局域网内,在最后添加内网地址匹配逻辑, 注意要放到文件最后 # Match Address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
-
修改完成配置后需要重启 SSH 服务,以下命令在 Ubuntu 上验证过:
- 查看服务:
systemctl -l --type service --all | grep ssh
- 重启 ssh 服务:
systemctl restart ssh.service
- ssh.service 与 sshd.service 是等价的,从 status 状态可以看出最终都是启动了 sshd 监听,不同的衍生系统有差异。
- 查看 ssh 服务状态:
systemctl status ssh.service
- 查看服务:
-
检查 SSH 服务工作状态,查看日志:
sh# 查看文件大小 sudo ls -alh /var/log/auth.log # 查看文件行数 sudo wc -l /var/log/auth.log # 查看 ssh 密码错误的行数 sudo grep "Failed password" /var/log/auth.log | wc -l # 统计攻击次数 log sudo grep "Failed password for" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
UFW 防火墙
如果你的服务器没有安全组的话,你可以使用 UFW(Uncomplicated Firewall)来配置防火墙并控制端口的暴露。以下是一个常见的使用示例:
sh
apt update && apt upgrade -y
apt install ufw -y
# 安装完成后,开始配置 UFW
ufw default deny incoming # 默认阻止入站连接
ufw default allow outgoing # 默认允许出站连接
# ufw allow 9993 # 如果你使用 Zerotier,请确保允许 9993 端口的进出站连接
ufw allow 22 # SSH 端口,请根据实际情况填写端口
ufw allow 443 # HTTPS 端口
# 立即启用 UFW,此操作可能会中断当前的 SSH 连接,请按 y 继续
ufw enable
常用的 UFW 命令参考:
- 启用 UFW:
ufw enable
- 禁用 UFW:
ufw disable
- 列出当前活动规则(详细):
ufw status verbose
- 列出当前活动规则(带序号):
ufw status numbered
# 序号标识了每条规则 - 允许某个 CIDR 访问本机所有端口:
ufw allow from {CIDR}
- 阻止某个 CIDR 访问本机所有端口:
ufw deny from {CIDR}
- 允许访问某个端口:
ufw allow {PORT}
- 对某个 CIDR 暴露某个端口:
ufw allow from {CIDR} to any port {PORT}
- 对某个 CIDR 暴露某个端口:
- 阻止访问某个端口:
ufw deny {PORT}
- 对某个 CIDR 阻止访问某个端口:
ufw deny from {CIDR} to any port {PORT}
- 对某个 CIDR 阻止访问某个端口:
- 删除某个规则:
ufw delete {RULE}|{NUM}
- 可以是之前执行的命令中的 RULE,例如,如果之前执行了
ufw allow 443
,要删除此规则,可以使用ufw delete allow 443
,其他类似 - 也可以使用之前提到的规则序号 NUM
- 可以是之前执行的命令中的 RULE,例如,如果之前执行了
- 将规则 RULE 插入到规则列表的位置 NUM:
ufw insert {NUM} {RULE}
,例如ufw insert 1 allow 443
表示将allow 443
规则插入到规则列表的第一位- 注意:这里的规则列表位置 NUM 不同于之前提到的序号,因为 UFW 规则包括 v6 规则,使用
ufw status numbered
列出规则列表时,v6 规则会在 v4 规则之后继续列出。
- 注意:这里的规则列表位置 NUM 不同于之前提到的序号,因为 UFW 规则包括 v6 规则,使用
优化配置
接下来介绍 VPS 的优化,由于大部分时间我使用 VPS 主要是网络相关,因此优化也是围绕着部分。
网络配置优化
haveged
是一个用于生成高质量随机数的守护进程。在 Linux 系统中,随机数对于许多应用程序和系统操作是至关重要的,这些随机数可用于加密操作、密钥生成以及其他需要高质量随机数的安全应用。它并不直接针对网络进行的优化项,但是当设计加密通信或密钥生成的场景会有安全性和效率的改善:- 安装:
apt install haveged -y
- 启用:
systemctl disable --now haveged;systemctl enable --now haveged
- 安装:
- 优化系统网络性能与连接跟踪:
-
modprobe ip_conntrack
: 这是加载ip_conntrack
内核模块的命令。这模块通常用于 IPv4 连接跟踪,用于跟踪网络连接的状态。IP 连接跟踪功能本身并不直接优化网络性能。它更多地用于网络安全、地址转换和负载均衡等方面。 -
TCP 拥塞控制算法 BBR (Bottleneck Bandwidth and RTT) 可以大限度地利用 服务器 带宽,减少排队的情况,提高网络质量:
shecho net.core.default_qdisc=fq >> /etc/sysctl.conf echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf sysctl -p # 检查是否成功,显示 net.ipv4.tcp_available_congestion_control = reno cubic bbr: sysctl net.ipv4.tcp_available_congestion_control
-
SWAP 优化
一般 VPS 默认都是没有开启 Swap 的,面对内存消耗多的程序会出现无法运行的问题,这时可以使用 Swap 进行缓解:
sh
# 关闭 swap
swapoff -a
# 创建 2G swap 分区
dd if=/dev/zero of=/var/swapfile bs=1M count=2048
# 制作 swap 分区
mkswap /var/swapfile
# 开启 swap
swapon /var/swapfile
# 检查 swap 状态
free -m
# 设置开机自启
echo "/var/swapfile none swap sw 0 0" >>/etc/fstab
WRAP+
由于 IPV4 资源紧张,很多 VPS 的 IPV4 池质量都不高,体现在 google 经常跳验证码、paypal 支付受限、ChatGPT 受限等,我们可以在 VPS 套一层 WRAP+ 来优化 ip。
我们可以使用 github.com/P3TERX/warp... 脚本进行部署,使用方法参考 Cloudflare WARP 一键安装脚本 使用教程 - P3TERX ZONE
流量监测
VPS 往往面临着流量限制,掌握如何查看那些程序与连接正在消耗宝贵流量是必要的技能,如下工具 Ubuntu23 测试均可以 apt 直接安装:
-
nethogs
:root 权限直接运行即可,自动监测所有程序的数据传输情况。
-
iftop
:用于快速识别占用、测量速度,并保持网络流量的总体情况:h
切换帮助屏幕;n
切换名称解析;s
切换源主机显示,d
切换目标主机;s
切换端口号;N
切换端口解析。要全看到端口号,请关闭解析;t
切换文本界面。默认显示需要 ncurses。我认为文本显示更易于阅读和更好的组织;p
暂停显示;q
退出程序;
-
vnstat
:网络数据收集工具,可以统计网络信息,累计流量使用:shapt install vnstat service vnstat start # 删除不需要监控的网卡 vnstat --remove -i eth1 --force # 添加需要监控的网卡 vnstat --add -i eth1 # 查看统计数据 [-5 展示分钟] [-h 展示小时] [-hg 展示小时折线图] 更多选项 --help 查看
测试
-
国内网速测试可以使用
network-speed.xyz
脚本:curl -sL network-speed.xyz | bash -s -- -r china
- 如果提示 python 找不到的问题,Ubuntu 由于默认只有 python3,可以安装:
python-is-python3
- 如果提示 python 找不到的问题,Ubuntu 由于默认只有 python3,可以安装:
-
下载速度测试:
wget -O /dev/null http://speedtest.london.linode.com/100MB-london.bin
-
路由查询可以使用 ipip ,可以测试延时与查看路由信息:
-
综合测试 benchmark,可以使用 yabs 脚本:
curl -sL yabs.sh | bash
sh#跳过网络测试,仅测硬盘和Geekbench5 curl -sL yabs.sh | bash -s -- -i5 #跳过硬盘测试,保留其他 curl -sL yabs.sh | bash -s -- -fd #跳过网速测试,保留其他 curl -sL yabs.sh | bash -s -- -i #跳过Geekbench,保留其他 curl -sL yabs.sh | bash -s -- -g #换为Geekbench 5,保留其他 curl -sL yabs.sh | bash -s -- -5 #仅测硬盘 curl -sL yabs.sh | bash -s -- -ig #仅测速 curl -sL yabs.sh | bash -s -- -fdg #仅测Geekbench 5 curl -sL yabs.sh | bash -s -- -fdi5 #仅测Geekbench 5 和 Geekbench 6 curl -sL yabs.sh | bash -s -- -fdi56
总结
其实玩 VPS 也快一年了,对于很多技术细节不慎了解大多是搜搜各种命令跑下脚本看看就得了,对于脚本安原理、安全性都没有深入了解过,最近正好放假了梳理了下 VPS 常用的基本操作,大多脚本也都翻了翻代码没啥异常,本文也没有涉及太多技术细节,技术细节如果后续有需要再整理吧,现在主打一个不求甚解「够用就行」😂。
最终本文很多操作自己也写了一个脚本可以自动化跑,相关代码都是开源的,大家感兴趣可以试用下,点点 start ✨:bash -c "$(curl -fsSL https://raw.githubusercontent.com/HATTER-LONG/dotfile/main/tools/VPS/harden.sh)"
最后会在 $HOME
下把我的 dotfile 仓库下载下来,手动删下就行: rm -rf ~/dotfile
参考文章
- vnstat流量统计(2.8版本) - 何宇泽 - 博客园 (cnblogs.com)
- ssh-keygen 生成密钥 --- Linux latest 文档 (gnu-linux.readthedocs.io)
- 手把手教学系列:从零开始配置VPS服务器 - kingszelda - 博客园 (cnblogs.com)
- 通过ssh X11转发使用远程gui程序 - sakuragl - 博客园 (cnblogs.com)
- VPS优化之添加swap交换分区 - VPS侦探 (vpser.net)
- Cloudflare WARP 一键安装脚本 使用教程 - P3TERX ZONE
- 鸭子都能看懂的 VPS 离线下载 & 云服务搭建新手教程 - 少数派 (sspai.com)