本文最后更新于 2023 年 3 月 11 日
本文以 Ubuntu 22.04 为例,介绍如何对服务器进行初步配置,本文同样完全适用于 Debian 10 系统。
本例中,普通用户名采取 sammy
为例,服务器 ip 采取 xx.xxx.xx.xxx
为例,请根据自己的实际情况做相应修改。
创建新用户
登录服务器
本地执行:
1 | ssh [email protected] |
如产生问题,请先查看本文 Troubleshooting 一节。
更改密码
1 | passwd |
更新系统
1 | apt update && apt full-upgrade -y && apt autoremove -y |
安装必要软件
1 | apt install sudo vim -y |
创建用户
服务器上,以 root 用户执行:
1 | adduser sammy |
根据提示填写信息。
赋予 sudo 权限
服务器上,以 root 用户:
1 | usermod -aG sudo sammy |
登录此用户
在本地尝试登录此用户:
1 | ssh [email protected] |
设置 SSH 登录
在本地机器上执行:
1 | ssh-keygen -a 1000 -t ed25519 -f ~/.ssh/sammy_server -C "sammy@sammy_host" |
本地生成钥匙对后,将其中的公钥上传到服务器上:
1 | ssh-copy-id -i ~/.ssh/sammy_server.pub [email protected] |
按照提示输入密码。本地建立 config 文件:
1 | vim ~/.ssh/config |
添加如下内容:
1 | Host sammy_host # 别名 |
修改本地 config 文件权限:
1 | chmod 600 ~/.ssh/config |
利用私钥的登录方式,本地执行:
1 | ssh sammy_host |
接下来的所有配置,都请以 sammy
用户的身份进行。
自启用户的 systemd 服务
有时需要某些 sammy
用户的服务在开机启动,然而当 sammy
没有登录时,这些服务并不会随开机启动。但可以使用 loginctl
来进行设置。服务器上:
1 | sudo loginctl enable-linger sammy |
安全设置
强烈建议进行一些必要的安全设置。
禁止 root 登录
服务器编辑 /etc/ssh/sshd_config
文件:
1 | sudo vim /etc/ssh/sshd_config |
将 PermitRootLogin
改为 no
:
1 | PermitRootLogin no |
保存文件后重启服务:
1 | sudo systemctl restart sshd |
禁止密码登录
服务器编辑 /etc/ssh/sshd_config
文件:
1 | sudo vim /etc/ssh/sshd_config |
将 PasswordAuthentication
改为 no
:
1 | PasswordAuthentication no |
保存文件后重启服务:
1 | sudo systemctl restart sshd |
更改 SSH 端口
服务器编辑 /etc/ssh/sshd_config
文件:
1 | sudo vim /etc/ssh/sshd_config |
将 Port
改为自定义端口,本例为 12333
:
1 | Port 12333 |
保存文件后重启服务:
1 | sudo systemctl restart sshd |
本地编辑 ssh 的 config 文件,做相应修改:
1 | Host sammy_host |
使用 ufw
安装 ufw :
1 | sudo apt update && sudo apt install ufw -y |
允许 SSH 登录:
1 | sudo ufw allow 12333 |
启用防火墙:
1 | sudo ufw enable |
查看状态:
1 | sudo ufw status |
启用二步验证
服务器安装 Google Authenticator
1 | sudo apt update && sudo apt install libpam-google-authenticator -y |
配置 Google Authenticator
1 | google-authenticator |
将出现一些问题:
1 | Do you want authentication tokens to be time-based (y/n) |
y
回答完此问题后,会出现二维码、Key,还有备用码,用手机的 Google Authenticator 扫描二维码或手动键入 Key,即可添加二步验证码,另外保存好备用码到一个安全的地方,以防手机丢失。
1 | Do you want me to update your "~/.google_authenticator" file (y/n) |
y
1 | Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) |
y
1 | By default, a new token is generated every 30 seconds by the mobile app. |
n
1 | If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) |
y
修改 sshd_config 文件
1 | sudo vim /etc/ssh/sshd_config |
找到 ChallengeResponseAuthentication
将其值改为 yes
,结果如下所示:
1 | # Change to yes to enable challenge-response passwords (beware issues with |
在此文件末尾添加一行:
1 | AuthenticationMethods publickey,keyboard-interactive |
接下来有两个不同的步骤
两个方案的优劣留待有大佬在评论区发表见解。
方案一
之后修改配置文件:
1 | sudo vim /etc/pam.d/sshd |
注释掉 @include common-auth
一行,结果如下所示:
1 | # Standard Un*x authentication. |
在此文件末尾添加一行:
1 | auth required pam_google_authenticator.so |
方案二
之后修改配置文件:
1 | sudo vim /etc/pam.d/sshd |
在文件顶端添加一行:
1 | auth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so |
重启 sshd 服务
1 | sudo systemctl restart sshd |
本地尝试登录
1 | ssh user@serverip |
显示:
1 | Verification code: |
输入二步验证码即可。
UFW 与 Docker
如果服务器计划部署 docker container,请注意其可能与 UFW 有冲突。此时,需要对 UFW 做一些调整,或采用服务商提供的防火墙。详情见:
- 我的 ufw 怎么又不好用了?使用 docker 时如何拒绝非 cloudflare 访问
- To Fix The Docker and UFW Security Flaw Without Disabling Iptables
优化设置
调整 swap 空间
创建交换文件:
1 | sudo fallocate -l 1G /swapfile # 或者 sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576 |
使用交换文件:
1 | sudo mkswap /swapfile |
查看效果:
1 | sudo swapon --show |
开机自动挂载:
1 | sudo cp /etc/fstab /etc/fstab.bak |
编辑 /etc/fstab
删掉之前的 swap 挂载行:
1 | sudo vim /etc/fstab |
安装 rsync
本地和服务器均安装 rsync ,方便日后文件传输:
1 | sudo apt update && sudo apt install rsync -y |
启用 BBR
启用之前,先检查是否已经启用了。
1 | sudo sysctl net.ipv4.tcp_congestion_control |
如果没有启用,则设置启用 BBR:
1 | echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.conf |
检查是否已启用成功:
1 | lsmod | grep bbr |
Troubleshooting
SSH 超时
由于防火墙的原因,SSH 链接会因超时自动断开,为防止这一现象,可在本地 config 中添加设置:
1 | vim ~/.ssh/config |
1 | Host * |
Too many authentication failures
这可能是由于你在本地拥有多个 ssh 私钥导致的,如不做配置,ssh 默认将优先尝试所有 IdentityFile ,而服务端在你连续做了 6 次尝试后将禁止你的再次尝试。
解决此问题的方法有两个。
修改本地配置
在进行首次尝试登录之前,在本地的 ~/.ssh/config
中添加:
1 | Host * |
更改服务器的设置
如果已经报了这个错误,那么你将无法通过第一个方法解决这个问题,不过你仍可以按照第一种方法进行设置,以避免后续再发生类似问题。
以 root
用户登录到服务器,修改 /etc/ssh/sshd_config
文件,将 MaxAuthTries
去掉注释并改为更高的数值,例如 100 。
1 | MaxAuthTries 100 |
重启 sshd
服务:
1 | systemctl restart sshd |
当你处理好这个问题之后(比如添加了 private key 的登录方式后不会有此困扰),记得把这个设置再次注释掉,并重启服务。
服务器时间不准
请查阅 Linux 服务器时间同步问题 一文。
References
How can I get autologin at startup working on Ubuntu Server 16.04.1?
Automatically Login on Debian 9.2.1 Command Line
Systemd Service stops when closing the last SFTP / SSH Session
Configure SSH to use two-factor authentication
Trying to get SSH with public key (no password) + google authenticator working on Ubuntu 14.04.1
SSH two-factor authentication: How to enable on your VPS
Two factor linux authentication using Google Authenticator
How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04
how to stop your firewall from timing out your ssh session
How to Keep Alive SSH Sessions
SSH aborts with Too many authentication failures
How to recover from “Too many Authentication Failures for user root”
Increase Linux Internet speed with TCP BBR congestion control
Debian 9/10 quickly opens Google BBR to achieve efficient unilateral acceleration