经常能在NS上关于ssh连接的讨论,常见的解决方式有使用iptable封IP的基础上,ssh改高位端口、禁用密码登录使用密钥认证以及Cloudflare Tunnel(Tunnel这个我还没试过,有教程吗 ),好像还有端口转发来着?实际上禁用密码使用密钥验证也够了。由于我没有富强需求,所有用途都可以1panel解决,所以我一般干脆把ssh关了,看见一堆失败日志就不爽 ,要用的时候再去面板给开了
之前突发奇想问AI能不能实现ssh连接使用流行的六位动态验证码认证,AI回答说可以,还是AI权威 研究了一下给搞出来了。这里作为娱乐向的技术分享,出一个ssh连接使用密钥+TOTP验证的教程(以前其实分享过,干巴巴扔了个博客链接,感谢酒神不杀之恩 )

第一步是安装chrony模块并设置时区

ssh连接服务器后运行以下指令,如果安装过程中问你y/n,回答y,这是系统自带的轻量级 NTP 客户端,名为systemd-timesyncd,和chrony互斥

sudo apt updatesudo apt install chrony

安装之后运行:

timedatectl

NTP service显示的是active就好了

接下来设置时区

运行指令,依次回复5,69,设置时区为上海

sudo dpkg-reconfigure tzdata

安装 Google Authenticator

运行指令,问题回y

sudo apt install libpam-google-authenticator

配置Google Authenticator,Do you want authentication tokens to be time-based (y/n) 回复y

google-authenticator

将会返回一个二维码,使用支持TOTP的应用扫描二维码,如Google Authenticator,Apple Password,Authy等
在Enter code from app (-1 to skip):后输入你的验证码应用中的六位动态验证码

之后回车,会有四个问题,以安全优先的原则的话,分别回复yyny

这四个问题的中文翻译为:

您是否希望我更新您的“/root/.google_authenticator”文件?(y/n)
您是否希望禁止多次使用同一个身份验证令牌?这会将您限制为大约每 30 秒登录一次,但这会增加您发现甚至阻止中间人攻击的机会 (y/n)
默认情况下,移动应用每 30 秒生成一个新令牌。为了补偿客户端和服务器之间可能存在的时间偏差,我们允许在当前时间前后各生成一个额外的令牌。这允许身份验证服务器和客户端之间最多存在 30 秒的时间偏差。如果您遇到时间同步不佳的问题,可以将窗口大小从默认的 3 个允许代码(一个前一个代码、当前代码、下一个代码)增加到 17 个允许代码(8 个前一个代码、当前代码和 8 个后一个代码)。这将允许客户端和服务器之间最多 4 分钟的时间偏差。是否要启用?(y/n)
如果您登录的计算机未针对暴力破解登录尝试进行强化,您可以为身份验证模块启用速率限制。默认情况下,这会将攻击者每 30 秒的登录尝试次数限制为不超过 3 次。是否要启用速率限制?(y/n) y

为SSH开启2FA

编辑 PAM 配置文件以启用 Google Authenticator
路径为/etc/pam.d/sshd,在顶部添加以下内容(这里推荐使用服务器面板进行编辑)并注释@include common-auth,这将配合后面的配置禁用密码验证(这里建议使用可视化面板)

auth required pam_google_authenticator.so


编辑 SSH 配置文件:/etc/ssh/sshd_config,需要有以下内容,有预设则修改,无预设则添加:

PermitRootLogin yesPasswordAuthentication noKbdInteractiveAuthentication yesUsePAM yesAuthenticationMethods publickey,keyboard-interactive

PermitRootLogin是允许root登录,本来应该关闭,但是关了这个有点玄学,会导致增加2fa的ssh失败,无论是user还是root。开了就正常了 ,所以还是开了吧。
重启ssh,会在完成公钥验证之后要求验证码认证

本文博客链接https://blog.gusmin.net/2025/06/19/add-2fa-to-ssh/