前言

由于我的服务器很多,所以我的macbook中一直有着一个比较复杂的~/.ssh/config配置文件,但是由于之前配置文件没有做的特别好(比较随意),造成了出现了一个conflict,于是今天好好的来解决一下。

正文

1. 具体问题

具体问题是,我在很久以前就在,我的macOS的~/.ssh/config中我设置了服务器177.177.177.177的publickey登录方式,如下:

Host 177.177.177.177:
	User root
	PasswordAuthentication no # 客户端无效,只是提示自己没有用password
	IdentitiesOnly yes
	IdentityFile ~/.ssh/id_rsa
	ForwardAgent yes

但是,同时我现在也开始用177.177.177.177做内网穿透的服务器,用其6000端口,命令如下ssh -oPort=6000 root@177.177.177.177,但是问这样就会出现一个问题,如果单纯这样设置的话,当我输入以上这条命令的时候,config会自动认为我要去登陆的是177.177.177.177:22这个端口,从而会自动进行公钥验证,但是事实上我只是用6000的端口进行转发,并不需要22登陆到177.177.177.177到服务器上,同时事实上这里的root也并不是服务器177.177.177.177上的root用户,而是转发frp的客户端的root用户。这就导致了conflict的出现,(一直出现如下报错。)

root@177.177.177.177: Permission denied (publickey,password).

因此,我们需要更详细的~/.ssh/config文件配置。

2. 解决问题

其实问题很简单,只需要给我们的Host一个具体的名字,和具体的端口(我们这里是6000)就可以了,添加新的host字段在~/.ssh/config中如下:

Host 177.177.177.177:
	User root
	PasswordAuthentication no # 客户端无效,只是提示自己没有用password
	IdentitiesOnly yes
	IdentityFile ~/.ssh/id_rsa
	ForwardAgent yes

#### 为frp ssh添加多一个Host即可
Host frp_server
	Hostname 177.177.177.177
	Port 6000
	User root
	PasswordAuthentication yes # 客户端无效,只是提示自己可以用password
	ForwardAgent yes

将这个加入后,我们只需要ssh frp_server,即可登录。

3. SSH配置文件介绍

写了这么多,我们来介绍一下SSH的配置文件吧。SSH (Secure Shell) 是一种广泛使用的网络协议,用于安全地访问和管理远程服务器。通过SSH,用户可以加密地执行命令、传输文件、以及进行网络服务的端口转发。SSH的配置可以通过多种方式进行优化和定制,以满足特定的安全性、性能和使用需求。

3.1 SSH配置文件

  • 客户端配置文件~/.ssh/config(对单个用户有效)和 /etc/ssh/ssh_config(系统范围内有效)是SSH客户端的配置文件。这些文件允许用户为特定的主机或所有主机定义连接参数,如密钥文件、端口号、用户名和其他选项。
  • 服务器配置文件/etc/ssh/sshd_config是SSH服务器的配置文件。服务器管理员可以通过修改此文件来改变SSH服务的运行方式,例如更改监听端口、启用或禁用特定的认证方法和调整安全选项。

3.2 客户端配置选项

3.2.1 Host (别名)

含义:Host指令在SSH配置中用于定义一个或一组主机的别名及其相关的配置规则。这些别名可以用于简化命令行参数,允许用户快速连接到常用的服务器或配置特定的连接参数,而不必每次都手动输入完整的命令。
使用场景: 如果你经常连接到同一个服务器,但每次都需要输入长串的连接信息和参数,你可以为该服务器设置一个Host别名。例如,为 ssh root@177.177.177.177 设置别名frp_server,之后只需输入 ssh frp_server 即可连接。

3.2.2 HostName (具体IP地址)

含义:HostName指令指定Host别名对应的实际主机名或IP地址。这是实际进行网络连接时SSH客户端尝试连接的地址。
使用场景: 在使用Host别名简化命令时,HostName提供了该别名背后具体的服务器地址。它使用户能够在配置文件中使用易记的名称,同时保持连接信息的准确性和灵活性。

3.2.3 Port

含义:Port指令用于指定SSH连接时使用的端口号。虽然SSH默认使用端口22,但这个指令允许用户指定一个不同的端口,用于连接到配置了不同监听端口的SSH服务器,(如此文中的6000)。
使用场景: 如果出于安全考虑或其他原因,服务器的SSH服务配置为监听非标准端口,使用Port指令可以指定正确的端口号进行连接。

3.2.4 User

含义:User指令用于指定SSH连接时使用的默认用户名。这避免了每次连接时都需要在命令行中指定用户名。
使用场景: 当你的本地用户名与远程服务器上的用户名不同时(请记住如果本地用户名和远程用户名不一样的时候,一定要输入远程用户名,如ssh <username>@<IP Address>,而不是直接ssh <IP Address>),可以使用此指令在配置文件中指定远程服务器的用户名,简化连接命令。

3.2.5 ForwardAgent

含义:ForwardAgent指令用于启用或禁用SSH代理转发功能。当设置为yes时,允许SSH客户端将本地机器上的SSH agent请求转发到远程机器上,使得可以在远程机器上使用本地机器的SSH密钥进行进一步的SSH连接。(简而言之就是是否允许远程机器使用本地机器的SSH密钥进行进一步的SSH连接。)
使用场景: 代理转发特别有用于通过跳板机(或跳转主机)访问其他内网服务器的场景,因为它允许用户在不直接将私钥文件复制到跳板机上的情况下进行多级SSH连接。

3.2.6 ProxyJump

含义: ProxyJump 指令提供了一种简化的方法来配置通过一个或多个跳板机(SSH中继)来访问目标主机。它允许用户定义一个跳板机链,无需手动管理多次SSH连接的复杂性。(显而易见的功能,跳板。)
使用场景: 当需要通过一个或多个中间服务器来访问最终目标服务器时,ProxyJump使得配置和命令行都简化了很多。例如,如果你需要先连接到一个公网服务器才能访问位于内网的另一台服务器,ProxyJump可以让这个过程变得无缝和直接。

3.3 服务端配置选项

3.3.1 Port

含义:Port用于指定SSH服务器监听的端口号,默认为22
配置建议: 出于安全考虑,常改为非标准端口,以减少自动化攻击。

3.3.2 ListenAddress

含义: ListenAddress指定SSH服务器绑定和监听的IP地址,用于控制只在特定地址接受连接请求。
配置建议: 在多网卡环境中,限定特定网卡接受SSH连接以增强安全性。

3.3.3 PermitRootLogin

含义: PermitRootLogin控制是否允许root用户直接登录,可设置为yesnoprohibit-passwordwithout-password
配置建议: 出于安全考虑,推荐设置为noprohibit-password,后者允许密钥认证但禁止密码认证。

3.3.4 MaxAuthTries

含义:MaxAuthTries定义在断开连接之前允许的最大认证尝试次数。
配置建议: 减少尝试次数可减轻暴力破解攻击的风险。

3.3.5 PasswordAuthentication

含义:PasswordAuthentication控制是否允许密码认证。
配置建议: 出于安全考虑,建议禁用密码认证(no),优先使用更安全的密钥认证。

3.3.6 PubkeyAuthentication

含义:PubkeyAuthentication指定是否启用公钥认证方式。
配置建议: 启用(yes)公钥认证以提高安全性。

3.3.7 AuthorizedKeysFile

含义:AuthorizedKeysFile指定存储公钥的文件路径,用于公钥认证。
配置建议: 默认值通常是~/.ssh/authorized_keys,可根据需要自定义。

3.3.8 ChallengeResponseAuthentication

含义:ChallengeResponseAuthentication控制是否启用挑战-响应式认证,如一次性密码。
配置建议: 如果使用一次性密码或其他挑战-响应系统,启用此选项(yes)。

3.3.9 UsePAM

含义:UsePAM选项用于决定是否使用可插拔认证模块(PAM)进行用户认证。
配置建议: 启用(yes)以允许通过PAM模块进行更灵活的认证策略。

3.3.10 AllowUsers / AllowGroups

含义:AllowUsersAllowGroups用于限制只有特定的用户或组成员才能登录SSH。
配置建议: 指定允许的用户或组列表增加安全性,尤其是在面向公网的服务器上。

3.3.11 DenyUsers / DenyGroups

含义:DenyUsersDenyGroups 用于指定不允许通过SSH连接的用户或组。
配置建议: 在有明确禁止登录需求时配置,与AllowUsers/AllowGroups一起使用以精确控制访问。

3.3.12 PermitTunnel

含义:PermitTunnel控制是否允许SSH隧道(端口转发)功能。
配置建议: 根据需要启用或禁用。禁用可以减少潜在的安全风险。

3.3.13 ClientAliveInterval 和 ClientAliveCountMax

含义: 这两个配置项用于设置SSH服务器端的保活机制。ClientAliveInterval设置间隔多少秒发送一次保活消息给客户端,ClientAliveCountMax设置在没有接收到客户端响应的情况下发送保活消息的最大次数。
配置建议: 合理设置这些值可以帮助识别挂起的SSH连接并自动断开,减轻服务器负担,同时避免连接由于长时间无活动而被意外断开。

3.4 安全性增强

  • 使用密钥而非密码:使用基于密钥的认证替代密码认证可以大幅提高安全性。密钥对包括一个私钥(客户端保管)和一个公钥(放置在服务器上的~/.ssh/authorized_keys文件中)。
  • 禁用root登录:禁止使用root账户直接登录可以防止潜在的安全威胁。
  • 更改默认端口:通过更改SSH的默认监听端口(22),可以减少自动化攻击和扫描的风险。
  • 使用SSH代理转发:SSH代理转发允许用户安全地将SSH密钥从本地机器转发到远程服务器,从而进行进一步的SSH连接,而不必在远程服务器上存储私钥。

总结

就是酱紫,学~!

学到了SSH config 配置文件的一些小知识~!

ChatGPT 是真有用的!

参考

[1] ChatGPT
[2] 自己

Q.E.D.


立志做一个有趣的碳水化合物