ssh配置
我们一般通过ssh连接VPS服务器,这里有两个条件:VPS上运行ssh服务,本地运行ssh客户端。一般网络服务的架构都是这种C/S架构(客户端/服务器端)。就像微信APP连接腾讯的微信服务器,大家才能聊天。
服务端
Linux一般都安装和运行了ssh服务,可以运行systemctl status sshd
查看ssh服务状态,没有的话执行如下命令。
# 安装ssh服务
dnf install -y openssh-server
# 启动ssh服务并设置为开机启动
systemctl enable --now sshd
客户端
一般介绍
Windows上常用的图形界面ssh客户端有putty、moba等等,输入服务器地址、端口号、用户名、密码就能登录上去了。
Windows上还有ssh客户端命令行工具。在Windows 10中,在“设置”中查看“可选功能”,确认是否安装了“OpenSSH 客户端”,没有的话就安装一下,这时候运行“cmd”打开命令行环境,执行如下命令,看看ssh命令是否存在。
C:\Users\test>where ssh
C:\Windows\System32\OpenSSH\ssh.exe
运行ssh [-p port] user@ip连接服务器,如果port是默认的22,则可以不用带-p port。
C:\Users\test>ssh -p 22 root@127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:kNxwoLgfOAlBQ8iIVNjVaWBicRAYal2M5mOyEkznwpo.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
如果第一次登录ssh服务器的话,会显示这个服务器的指纹(一个独一无二的服务器ID)。这里需要手动输入“yes”。
root@127.0.0.1's password:
然后输入密码,这里输入密码不会回显,不要以为是键盘坏了。
如果重装Linux,这个服务器指纹会变,再用ssh登录就会提示指纹不对,无法登录。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:kNxwoLgfOAlBQ8iIVNjVaWBicRAYal2M5mOyEkznwpo.
Please contact your system administrator.
Add correct host key in C:\\Users\\test/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in C:\\Users\\test/.ssh/known_hosts:22
Host key for 127.0.0.1 has changed and you have requested strict checking.
Host key verification failed.
这时需要把本地保存的服务器指纹删除。根据这一行信息:“Offending ED25519 key in C:\Users\test/.ssh/known_hosts:22”,把C:\Users\test\.ssh\known_hosts的第22行删掉就可以了。
免密码登录
ssh还支持不用输入密码就可以直接登录,这就需要密钥。
先介绍一下非对称加密,使用者有一对密钥,公钥和私钥,公钥是公开的,任何人使用公钥加密一段数据发给使用者,使用者用私钥解密才能解开,没有私钥就解不开,因此这种加密方式也可以用作身份验证。
免密码登录的机制是这样的
- ssh客户端生成一对密钥,将公钥保存到服务器上
- ssh服务器根据登录客户端的用户名和ip检索到公钥,随机生成一个字符串加密后发给客户端
- ssh客户端解密后将字符串发还给服务器,字符串一样的话就通过认证
执行如下操作生成和放置密钥
- 运行
ssh-keygen -t ed25519
,在C:\Users\test\.ssh下会生成id_ed25519、id_ed25519.pub两个文件,其中id_ed25519.pub就是公钥。 - 将id_ed25519.pub的内容追加到服务器的/root/.ssh/authorized_keys文件
- 运行
chmod 0600 /root/.ssh/authorized_key
,确保authorized_keys的文件权限
主机别名
在C:\Users\test\.ssh\config中定义主机别名,可以更快捷的登录ssh。
Host test
HostName xx.xx.xx.xx
Port 22
User root
运行ssh test
就相当于运行ssh -p 22 root@xx.xx.xx.xx
。
sftp
ssh不但可以登录服务器,还可以传送文件。
下载一个WinSCP,输入ssh登录信息,就可以上传下载文件,注意传输协议要选择sftp。
高级设置
互联网上有很多程序在扫描ssh端口并且尝试暴力破解。登录ssh能看到如下信息,从上次登录成功到现在有n次失败的登录,就是有人在尝试破解。
Last failed login: Fri Jan 3 12:02:00 CST 2025 from 185.147.124.182 on ssh:notty
There were 71 failed login attempts since the last successful login.
Last login: Fri Jan 3 11:44:02 2025 from x.x.x.x
可以通过设置增加破解的难度。
修改ssh端口
互联网上的黑客程序都是扫描ssh的默认端口,修改端口会减少很多风险。
- 修改/etc/ssh/sshd_config,将“Port 22”改成“Port 10086”,就把ssh的端口改成10086。
- 如果Port前面有“#”,需要删掉这个字符。配置文件中,“#”后面的内容会被忽略。
- 重启ssh服务,让新的端口生效。
- 将新端口添加到防火墙。
使用fail2ban
fail2ban可以把登录失败次数超过限制的IP封掉。
- 安装fail2ban。
- 运行
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
,生成jail.local文件。 - 修改 jail.local 中的sshd块
[sshd]
# 启动sshd保护
enabled = true
# 设置ssh端口,没有修改ssh端口的话可以保持不变
port = 10086
# 失败3次就封ip
maxretry = 3
# 永久封禁
bantime = -1
- 重启fail2ban服务
- 查看状态
fail2ban-client status
- 查看被封的ip
fail2ban-client get sshd banned
- 解封某个ip
fail2ban-client unban x.x.x.x