SSH配置

ssh基本配置

/etc/ssh/sshd_config

1
2
3
4
5
  Port 22
  PermitRootLogin yes
  PubkeyAuthentication yes
  AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
  PasswordAuthentication yes

SSH文件权限设置

为了正确配置.ssh目录及其内涵的文件权限,可以按照以下步骤操作:

将.ssh目录的权限设置为700:运行以下命令:chmod 700 ~/.ssh;

将私钥文件的权限设置为600:运行以下命令:chmod 600 ~/.ssh/id_rsa;

将公钥文件的权限设置为644:运行以下命令:chmod 644 ~/.ssh/id_rsa.pub。

这样做的目的是,只允许当前用户读写.ssh目录和私钥文件,而其他用户只能读取公钥文件,从而保证.ssh目录和密钥文件的安全性。

当然,你可以使用如下命令批量化的处理.ssh权限问题:

1
  chmod 600 ~/.ssh/* && chmod 644 ~/.ssh/*.pub && chmod 700 ~/.ssh

SSH 连接失败: no matching host key type found. Their offer: ssh-rs

1
2
  $ ssh root@192.168.1.10
  Unable to negotiate with 192.168.1.10 port 22: no matching host key type found. Their offer: ssh-rsa

这个问题经常出现在ssh 服务端版本和客户端版本不匹配。 要解决问题,需要在命令加上一个选项: -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa 比如:

1
  ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa  root@192.168.1.10

如果是sftp连接的话,只需要将ssh换成sftp即可,比如:

1
  sftp -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa  root@192.168.1.10

也可以加参数加到 ssh config file, /etc/ssh/ssh_config

1
2
  HostKeyAlgorithms = +ssh-rsa
  PubkeyAcceptedAlgorithms = +ssh-rsa

或者追加到~//.ssh/config文件中也是可以的,如:

1
2
  HostKeyAlgorithms = +ssh-rsa
  PubkeyAcceptedAlgorithms = +ssh-rsa

另一个选择是在创建密钥对时使用不同的算法。

要查看 Linux 系统上 SSH 命令支持的算法,可以使用 ssh -Q 命令。具体来说,可以使用以下命令来查看支持的加密算法、散列算法和公钥算法:

1
2
3
  ssh -Q cipher # 查看支持的加密算法 
  ssh -Q mac # 查看支持的散列算法 
  ssh -Q key # 查看支持的公钥算法

ubuntu自动配置sshd_config

操作步骤

1
  ./sshd_config.sh /etc/ssh/sshd_config

脚本内容-sshd_config.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 通过输入sshd_config文件绝对路径来运行该脚本,脚本在运行前会先进行针对sshd_config进行备份,然后再配置
apt install -y openssh-server
if [ -f ${1} ]; then
	cp $1 $1_backup	
else
	echo "$1 not exists!"
fi

#删除带有指定关键字的行
delete_line_with_special_word () {
	if [[ $# -lt 2 ]]; then
		return
	fi
	FILE=$1
	WORD=$2

	sed -i "/${WORD}/d" ${FILE}
}
#文件内容追加
append_line_into_file () {
	if [[ $# -lt 2 ]]; then
		return
	fi
	FILE=$1
	LINE=$2
	echo do
	echo $LINE >> $FILE
}
CONFIG="/etc/ssh/sshd_config"
# CONFIG="./sshd_config"
cp $CONFIG $CONFIG.old

string_1="Port 22"
string_2="PermitRootLogin"
string_3="PubkeyAuthentication"
string_4="AuthorizedKeysFile"
string_5="PasswordAuthentication yes"

string_6="Port 22"
string_7="PermitRootLogin yes"
string_8="PubkeyAuthentication yes"
string_9="AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2"
string_10="PasswordAuthentication yes"

## 配置过程
delete_line_with_special_word   $CONFIG  "$string_1"
append_line_into_file           $CONFIG  "$string_1"
delete_line_with_special_word   $CONFIG  "$string_2"
append_line_into_file           $CONFIG  "$string_7"
delete_line_with_special_word   $CONFIG  "$string_3"
append_line_into_file           $CONFIG  "$string_8"
delete_line_with_special_word   $CONFIG  "$string_4"
append_line_into_file           $CONFIG  "$string_9"
delete_line_with_special_word   $CONFIG  "$string_5"
append_line_into_file           $CONFIG  "$string_10"

客户端.ssh目录下config文件基本配置

.ssh/config

1
2
3
4
5
6
7
8
9
  Host *
  ServerAliveInterval 60
  ServerAliveCountMax 120

  Host            
  HostName        
  User            
  Port            
  IdentityFile

这个配置是一个 SSH 配置文件(通常是 ~/.ssh/config)。在这个配置中,ServerAliveInterval 和 ServerAliveCountMax 是全局参数,会应用到所有的主机连接上,而其他的部分是针对特定主机的配置。

  • ServerAliveInterval 设置为 60 秒表示,无论连接的是哪个主机,客户端都会每隔 60 秒发送一个空闲检查以确认服务器是否活动。
  • ServerAliveCountMax 设置为 120 表示,无论连接的是哪个主机,客户端都会允许服务器连续未响应 120 次空闲检查,然后才会断开连接。

其他部分(Host、HostName、User、Port、IdentityFile)是用于指定特定主机连接的配置,其中:

  • Host 是用于指定主机别名的标识符。
  • HostName 是指定主机的域名或 IP 地址。
  • User 是指定连接主机时要使用的用户名。
  • Port 是指定连接主机时要使用的端口号。
  • IdentityFile 是指定用于身份验证的私钥文件路径。

如果你想为特定主机设置这些参数,你可以在 Host 后面指定主机别名,然后在其后设置相应的参数。例如:

1
2
3
4
5
6
  Host example.com
  ServerAliveInterval 60
  ServerAliveCountMax 120
  User username
  Port 22
  IdentityFile ~/.ssh/id_rsa

这样的话,上述的 ServerAliveInterval 和 ServerAliveCountMax 参数将只会应用到 example.com 主机的连接上,而其他主机的连接则不受影响。

如何不让ssh连接断开

  • 客户端设置可以确保客户端定期向服务器发送空闲检查,以确保服务器仍然活跃。如果服务器在一段时间内没有响应,客户端可以主动断开连接,避免连接僵死。
  • 服务端设置可以确保服务器定期向客户端发送空闲检查,以确保客户端仍然活跃。如果客户端在一段时间内没有响应,服务器可以主动断开连接,释放资源并提高安全性。

总结:如果客户端和服务端都设置保活选项,就可以确保连接的双向活跃性和稳定性。这样的设置可以在两个方向上都进行检查,以确保连接始终保持活跃,并及时处理失活的连接。

可以只设置客户端或只设置服务端,这取决于你想要达到的目的,也可以通过同时设置客户端和服务端,可以确保连接的稳定性和可靠性,从而更好地管理连接并提高系统的安全性和稳定性。

只在客户端设置 SSH 保活选项

您可以在 SSH 客户端的配置文件中设置保活选项,以防止连接因为长时间无活动而断开。这通常在客户端的 ~/.ssh/config 文件中设置:

1
2
3
  Host *
  ServerAliveInterval 60
  ServerAliveCountMax 120

ServerAliveInterval:指定客户端向服务器发送空闲包的时间间隔(秒)。例如,60 表示每 60 秒发送一次。 ServerAliveCountMax:在没有收到任何服务器响应的情况下,客户端发送保活包的最大次数。120 意味着在没有响应的情况下最多发送 120 次。

  • 优点:客户端可以定期向服务器发送空闲检查,以确保服务器仍然活跃。如果服务器在一段时间内没有响应,客户端可以主动断开连接,这有助于防止连接僵死。
  • 缺点:如果客户端没有设置超时检测(例如服务器端没有响应客户端的空闲检查),可能导致服务器一直保持连接,造成资源浪费。

只在服务器端设置 SSH 保活选项

同样,您也可以在 SSH 服务器端设置保活选项,来防止客户端连接由于超时而断开。在服务器的 SSH 配置文件 /etc/ssh/sshd_config 中设置:

1
2
  ClientAliveInterval 60
  ClientAliveCountMax 120

ClientAliveInterval:服务器向客户端发送请求的时间间隔(秒),用于检查客户端是否仍然连接。 ClientAliveCountMax:在没有收到客户端响应的情况下,服务器尝试发送请求的最大次数。

1
  sudo systemctl restart sshd
  • 优点:服务端可以定期向客户端发送空闲检查,以确保客户端仍然活跃。如果客户端在一段时间内没有响应,服务端可以主动断开连接,这有助于释放资源并提高安全性。
  • 缺点:如果服务端没有设置超时检测(例如客户端无法及时响应服务端的空闲检查),可能导致服务端一直保持连接,造成资源浪费。

总结:单独设置客户端或服务端的一个方面可以达到一定的活跃性和稳定性,但是为了最佳效果,建议同时设置客户端和服务端。这可以确保连接在双向上都得到监视和保持活跃,从而更好地管理连接和资源。

ssh连接,如果超过3秒没有连上则断开

要在 SSH 连接时设置超时时间,可以在命令行中直接指定 -o 选项来设置 ConnectTimeout。以下是一个示例:

1
  ssh -o ConnectTimeout=3 user@hostname

在这个命令中,-o ConnectTimeout=3 表示设置连接超时时间为 3 秒。你可以将 user@hostname 替换为实际的用户名和主机名。

这样,在执行以上命令时,如果连接未能在指定的时间内建立,则会自动断开连接。

使用 tmux 或 screen 会话

termux教程:https://ynhugo.github.io/p/tmux%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/

screen教程:https://ynhugo.github.io/p/screen%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/

使用 tmux 或 screen 可以在连接断开后保持您的工作会话。即使 SSH 连接断开,您也可以重新连接到同一个 tmux 或 screen 会话,继续之前的工作。

安装 tmux 或 screen(取决于您的系统)

1
2
  sudo apt install tmux screen -y  # 对于 Ubuntu/Debian
  sudo yum install tmux screen -y  # 对于 CentOS/RHEL

开始一个新会话:

1
  tmux

如果连接断开,您可以重新连接:

1
  tmux attach

查看 ssh 版本

1
  ssh -V

处理 ssh 版本信息

ssh -V 命令输出的版本信息是直接打印在标准错误输出(stderr)中,而不是标准输出(stdout)。因此需要使用重定向来处理。

以下是一个示例来提取 OpenSSH 的版本号:

1
  ssh -V 2>&1 | awk '{print $1}'

这个命令将会执行 ssh -V 命令,并将标准错误输出(stderr)转发到标准输出(stdout),然后使用 awk 命令提取第一 个字段,即版本号。

对于 OpenSSH 版本信息的输出,它通常类似于 "OpenSSH_x.x" 的格式,通过使用 $1 来提取第一个字段,可以获取到版本号。

判断 ssh 版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
  ssh_version=$(ssh -V 2>&1 | awk '{print $1}' | tr '_' ' ' | awk '{print $2}' | awk -F 'p' '{print $1}')
  echo "ssh_version: ${ssh_version}"

  # 将版本号以小数点分隔,并提取整数部分
  major_version=$(echo "${ssh_version}" | cut -d '.' -f 1)
  minor_version=$(echo "${ssh_version}" | cut -d '.' -f 2)

  if [[ ${major_version} -lt 7 || (${major_version} -eq 7 && ${minor_version} -lt 8) ]]; then
	echo "debug_1"
  else
	echo "debug_2"
  fi

注意事项

  • 长时间保持 SSH 连接可能会有安全风险,特别是在公共或不受信任的网络中。
  • 确保您有足够的权限来修改 SSH 配置文件。
  • 在修改服务器配置时,谨慎操作,错误的配置可能会导致无法通过 SSH 连接到服务器。

通过上述方法,您可以有效地防止 SSH 连接因为长时间无活动而断开,提高远程工作的连续性和便捷性。

ssh公钥登录远程服务器配置

每次通过ssh登陆远程服务器都要输入用户名和密码,很麻烦,比如:

1
  ssh 用户名@192.168.xxx.xxx

我们可以通过公钥的方式,无密码登陆远程服务器。

第一步,ssh-keygen命令生成公钥私钥

全过程有三步,第一步是输入公钥私钥的保存路径,第二步和第三步是设置私钥密码和确认密码。

1
  ssh-keygen

如果是第一次生成公钥,则直接一路回车确认就行。公钥和私钥会自动生成到/Users/[用户名]/.ssh路径下。默认公钥文件名为id_rsa.pub,私钥文件名为id_rsa。如果不想覆盖之前已有的公钥,那在第一步指定一个保存路径即可。

第二步,使用ssh-copy-id命令将公钥复制到远程服务器

在用户路径下,执行命令:

1
  ssh-copy-id -i .ssh/id_rsa.pub 用户名@192.168.xxx.xxx

注意:

  1. 如果上一步你自己指定了单独的公钥路径,请在-i后面输入指定的公钥路径
  2. 这里是将你的公钥同步到远程服务器上你要登录的用户名,所以只会对该用户登录时有效。

本质上,这一步的操作,是将你的公钥追加到服务器/home/[用户名]/.ssh/authorized_keys文件后面。如果你手动复制进去,也可以,但是麻烦哦。

第三步,检查服务端.ssh/的权限

以上配置之后,就可以无需密码直接登陆了,命令:

1
  ssh 用户名@192.168.xxx.xxx

如果无效,则需要检查服务器.ssh/文件的权限。如果用户组权限有写权限,则用公钥ssh登录是不生效的。需要去除掉用户组的写权限,使用命令:

1
  chmod g-w ./.ssh/

为什么有这个限制呢?其实思考一下就能理解。因为你想通过公钥快捷登录A用户。而实现方式是将自己的公钥追加到A用户目录下的authorized_keys。这种情况下,如果同用户组的B用户,也有对.ssh/路径下的写权限,那么其他人就可以通过登录B用户,修改A用户下的authorized_keys,将自己的公钥追加进去,这样就可以直接用A用户登录了。所以这会出现漏洞。

第四步,配置快捷命令

目前为止,登录还需要输入用户名和ip,依旧比较麻烦。我们可以在本地的.ssh/config文件中,配置快捷登录命令。

将以下格式的信息追加到config文件后面:

1
2
3
4
Host [你能记住的名字]
Hostname [ip]
Port [端口]
User [登录用户名]

比如:

默认端口为22,termux的端口为8022,下边这个例子是针对termux的,如果非termux的话将8022改成22即可

1
2
3
4
Host vipad
Hostname 192.168.xx.xx
Port 8022
User u0_a77

之后使用命令:

1
  ssh vipad

就可以直接登录了。

Licensed under CC BY-NC-SA 4.0