1. 0. Before
  2. 1. 基本安全配置
    1. 1.1. 更改 ssh 配置
    2. 1.2. 防火墙配置
  3. 2. 常用软件安装
    1. 2.1. 更新内核(可选的)
    2. 2.2. 安装 nginx
    3. 2.3. 安装 Docker
    4. 2.4. 通过 Docker 运行 V2Ray

这篇笔记的内容诞生于作者在黑五促销时冲动的服务器上,服务器是基于 KVM 架构的 VPS,系统为 Ubuntu 20.04 LTC。促销的原因,这台机器没有托管防火墙,所以在安全上要多做一些工作。下面从连接到服务器后开始记录。

0. Before

到手的服务器默认只有 root 用户,添加普通用户:

adduser username

按照提示输入密码和基本信息,然后将新用户添加到 sudo 组:

adduser username sudo

随后通过新用户登录。

安装 zsh 和 Oh My ZSH(可选的):

sudo apt install zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

1. 基本安全配置

1.1. 更改 ssh 配置

需要更改的地方如下:

Port # your port # 更改默认端口
PermitRootLogin no # 禁止 root 用户登录

# 启用密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

# 禁止空密码
PermitEmptyPasswords no

在本地生成一对密钥,将公钥上传到服务器的 ~/.ssh/authorized_keys 内,并设置权限为 600.

重启 sshd:

sudo systemctl restart ssh.service

这时用尝试用密钥登录,成功登录后再配置:

# 禁用密码登录
PasswordAuthentication no

再次重启 sshd.

1.2. 防火墙配置

Ubuntu 自带有 UFW,可以极大简化防火墙的配置。首先查看 UFW 的运行状态:

sudo ufw status

一般回显 inactive.

查看已安装的规则:

sudo ufw app list

一般回显中会有 OpenSSH,这些规则一般放在 /etc/ufw/applications.d/ 下,比如 OpenSSH 就定义在 openssh-server 中。如果没有可以自己定义,语法遵循 ini 文件:

[OpenSSH]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=22/tcp

UFW 默认的 ssh 端口为 22,修改为上一步设置的值,然后更新并启用它:

sudo ufw app update OpenSSH
sudo ufw allow OpenSSH

启用 UFW:

sudo ufw enable

程序可能会提示你这个操作可能会影响 ssh 连接,但是我们已经允许 ssh 使用的端口通过防火墙,所以直接回车即可。

2. 常用软件安装

上面我们完成了基本的安全配置,现在可以安装常用软件了。

开始之前应该先更新已有软件,执行 sudo apt update && sudo apt upgrade -y.

如果你的网络环境不佳,建议在新的 screen 会话中执行上面的命令,然后分离会话,坐和放宽。

2.1. 更新内核(可选的)

现阶段 Ubuntu 20.04 自带的内核是 5.4.x,如果你觉得有必要,可以升级到 5.10.x.

内核版本限制

如果选择的内核版本 >5.10.32,你可能会遇到 linux-headers-5.10.x-generic depends on libc6 (>= 2.33); however: Version of libc6:amd64 on system is 2.31-0ubuntu9.2. 这样的错误,这是因为更新的内核是用 21.04 编译的,21.04 上 libc6 的版本要新一点,详细见这里

因此我们直接选择 5.10.30 的内核,在这里选择合适的架构,比如 amd64. 在 home 创建一个目录 kernel,进入该目录,把需要下载的文件的链接放到 urls.txt 中:

https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10.30/amd64/linux-headers-5.10.30-051030-generic_5.10.30-051030.202104140332_amd64.deb
https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10.30/amd64/linux-headers-5.10.30-051030_5.10.30-051030.202104140332_all.deb
https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10.30/amd64/linux-image-unsigned-5.10.30-051030-generic_5.10.30-051030.202104140332_amd64.deb
https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.10.30/amd64/linux-modules-5.10.30-051030-generic_5.10.30-051030.202104140332_amd64.deb

然后执行:

wget -i urls.txt

等到下载完成,执行:

sudo dpkg -i *.deb

等待命令完成,重启服务器并登录。现在执行 uname -r 将会回显 5.10.30-051030-generic,安装成功。

2.2. 安装 nginx

本部分内容由 nginx 官网文档精简。

首先安装依赖:

sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

导入 nginx 官方签名密钥:

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

在 apt 源中配置 nginx 稳定版:

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

配置优先级:

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx

安装 nginx:

sudo apt update
sudo apt install nginx

2.3. 安装 Docker

Docker yyds!

2.3.1. Docker 引擎的安装

本部分由 Docker 官方文档精简。

如果你曾安装过 Ubuntu 官方库的 Docker,先卸载:

sudo apt-get remove docker docker-engine docker.io containerd runc

Ubuntu 20.04 LTC 默认支持 overlay2,如果你的 Ubuntu 不支持,需要自行安装合适的存储驱动。

向 apt 添加 Docker 的官方库:

sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加稳定版源到 apt 源中
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 Docker:

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

2.3.2. 防火墙配置

Docker 的网络管理是通过配置 iptables 来完成的,我们在前面用来辅助管理防火墙的 UFW 不能管理 Docker 发布出来的端口,甚至 UFW 配置的规则对 Docker 失效,这里推荐使用 GitHub 上的 ufw-docker 来解决这个问题。

下载 ufw-docker 脚本:

sudo wget -O /usr/local/bin/ufw-docker \
https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
chmod +x /usr/local/bin/ufw-docker

使用下列命令来修改 ufw 的 after.rules 文件:

ufw-docker install

通过 ufw reload 命令使配置生效。

假设你将宿主机的 8080 端口映射到容器 web 的 80 端口,在以后的使用中,如果你需要将 8080 端口暴露到公网,你应该:

ufw-docker allow web 80

更多案例参见使用方法

2.3.3. Docker Compose 的安装(可选的)

本部分参考官方文档

执行 which docker-composedocker-compose --version 看看系统里有没有安装 Docker Compose,如果回显出正确的结果,比如 Docker Compose 的位置或版本信息,就可以结束这一步了。

执行以下命令安装:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

测试安装是否成功:

docker-compose --version

应该回显:

docker-compose version 1.29.2, build 1110ad01

2.4. 通过 Docker 运行 V2Ray

作为笔记,本文默认你已经熟悉 V2Ray 的配置,如果你是第一次接触 V2Ray,有专门的教程更好更详细的讲解如何使用它,比如新 V2Ray 白话文指南

通过 Docker 运行 V2Ray,需要我们向容器挂载一个目录来传递配置文件,在 home 下创建一个目录用来存放和 V2Ray 相关的文件。如果你已经安装了 Docker Compose,在这个目录下创建 docker-compose.yml,根据你的需求编写配置内容。

这是我的配置
version: "3"
services:
v2ray:
image: v2fly/v2fly-core
container_name: v2ray
restart: unless-stopped
volumes:
- /path/to/your/v2ray/config/:/etc/v2ray/
environment:
- V2RAY_CONF_GEOLOADER=memconservative

我将 V2Ray 的配置文件放在 config 目录下,因此目录结构是这样的:

v2ray
├── config
│   └── config.json
└── docker-compose.yml

执行命令运行 V2Ray:

docker-compose up -d

如果你使用 nginx 作为反代,且偏爱 unix 域套接字的话,需要为套接字文件设置正确的权限,或者让容器以 nginx 用户运行。另外说一嘴,V2Ray 是可以转发 ssh 的流量的,因此从现在开始可以直接不允许 ssh 端口的流量入站,这样安全性有没有更高不清楚,至少不用担心有人盯着你的 ssh 端口了。


以上就是我对一台新 VPS 的常规配置。其实一个买境外服务器的人是要干嘛每个人都心知肚明,GFW 也算是特殊时代下的特殊产物了。希望有一天我们可以自信自由的接入互联网。