Linux / Unix 用户的 OpenSSH 配置文件示例
我们可以为 SSH 客户端设置全局或本地配置文件,可以为 sshd 服务器创建快捷方式,包括高级 ssh 客户端选项。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 不 |
要求 | Linux 终端 |
类别 | 终端/ssh |
先决条件 | OpenSSH 客户端 |
操作系统兼容性 | *BSD • Linux • macOS • Unix • WSL |
预计阅读时间 | 7 分钟 |
您可以配置 OpenSSH ssh 客户端以节省输入常用 ssh 客户端命令行选项(如端口号、用户名、主机名/IP 地址、身份文件等)的时间。除此之外,它还将提高 Linux/macOS 或 Unix 桌面的工作效率。
系统范围的 OpenSSH 配置文件客户端配置
- /etc/ssh/ssh_config:此文件为该台式机/笔记本电脑上所有 OpenSSH 客户端用户设置默认配置,并且系统上的所有用户必须能够读取它。
用户特定的 OpenSSH 文件客户端配置
- ~/.ssh/config或者$HOME/.ssh/config:这是用户自己的配置文件,它将覆盖全局客户端配置文件 /etc/ssh/ssh_config 中的设置。
~/.ssh/config 文件规则
创建 ssh 配置文件的规则如下:
- 您需要~/.ssh/config使用文本编辑器(例如 vi)进行编辑。
- 配置文件中每行允许一个配置参数,参数名称后跟其值。语法为:
config value config1 value1 value2
- 您可以在参数名称和值之间使用等号 (=) 代替空格。
config=value config1=value1 value2
- 所有空行和以井号 (#) 开头的行都将被忽略。
- 请注意,所有值都区分大小写,但参数名称不区分大小写。
mkdir -p $HOME/.ssh chmod 0700 $HOME/.ssh
示例
为了演示目的,我的示例设置如下:
- 本地桌面客户端 - Apple macOS/OS X/Ubuntu Linux。
- 远程 Unix 服务器 – 运行最新 OpenSSH 服务器的 OpenBSD 服务器。
- OpenSSH 远程服务器 ip/主机:75.126.153.206(server1.example.com)
- 远程 OpenSSH 服务器用户:示例
- OpenSSH 目标端口:4242
- 本地 ssh 私钥文件路径:/nfs/shared/users/example/keys/server1/id_rsa
根据以上信息,我的 ssh 命令如下:
$ ssh -i /nfs/shared/users/example/keys/server1/id_rsa -p 4242 example@server1.example.com
或者
$ ssh -i /nfs/shared/users/example/keys/server1/id_rsa -p 4242 -l example server1.example.com
看看我需要输入多少。我需要记住远程主机名/IP、端口号、ssh 密钥路径、用户名等。输入太多,不会提高我的工作效率。但不要害怕,有一个简单的解决方法。
使用 ssh 配置文件
您可以避免在登录远程计算机和/或在远程计算机上执行命令时输入所有 ssh 命令参数。您所要做的就是创建一个 ssh 配置文件。打开终端应用程序并通过输入以下命令来创建您的配置文件:
## edit file in $HOME dir vi ~/.ssh/config
或者
## edit file in $HOME dir vi $HOME/.ssh/config
按照我们的示例设置,添加/附加以下配置选项作为 server1 的快捷方式:
Host server1
HostName server1.example.com
User example
Port 4242
IdentityFile /nfs/shared/users/example/keys/server1/id_rsa
通过按下Esc键、键入:w并按下键来保存并关闭 vi/vim 中的文件Enter。要打开与 server1.example.com 的新 SSH 会话,请键入以下命令:
$ ssh server1
添加另一台主机
将以下内容附加到您的~/.ssh/config文件:
Host nas01 HostName 192.168.1.100 User root IdentityFile ~/.ssh/nas01.key
您只需输入:
$ ssh nas01
理解主机模式
Host 指令的模式不过是 IP 地址、DNS 主机名或特殊通配符的组合。例如,?通配符与一个字符完全匹配。另一方面,通配符与零个或多个字符匹配。它允许我们定义使用模式。例如,要指定并允许来自、、和*的登录,我可以使用以下模式:laptop.sweet.homedesktop.sweet.homerpi.sweet.homecorerouter.sweet.home
Host *.sweet.home Hostname 192.168.2.17 User vivek IdentityFile ~/.ssh/id_ed25519.pub
以下模式将匹配192.168.2.[0-9]网络范围内的任何主机:
Host 192.168.2.? Hostname 192.168.2.18 User admin IdentityFile ~/.ssh/id_ed25519.pub
我们还可以设置一个模式列表。它是一个以逗号分隔的模式列表。模式列表中的模式可以通过!在 authorized_keys 中在其前面加上感叹号 ( ) 来否定。以下是来自远程服务器上文件的示例~/.ssh/authorized_keys。首先,登录到远程框:
$ ssh vivek@192.168.2.17
现在编辑文件,运行:
$ vim ~/.ssh/authorized_keys
按如下方式更新它:
# Allow login from 192.168.2.0/24 subnet but not from 192.168.2.25 from="!192.168.2.25,192.168.2.*" ssh-ed25519 my_random_pub_key_here vivek@example # Allow login from *.sweet.home but not from router.sweet.home from="!router.sweet.home,*.sweet.home" ssh-ed25519 my_random_pub_key_here vivek@example
综合起来
这是我的示例~/.ssh/config文件,它解释、创建、设计和评估使用 ssh 客户端进行远程访问的不同需求:
### default for all ## ## Set override as per host ## Host server1 HostName server1.example.com User example Port 4242 IdentityFile /nfs/shared/users/example/keys/server1/id_rsa ## Home nas server ## Host nas01 HostName 192.168.1.100 User root IdentityFile ~/.ssh/nas01.key ## Login AWS Cloud ## Host aws.apache HostName 1.2.3.4 User wwwdata IdentityFile ~/.ssh/aws.apache.key ## Login to internal lan server at 192.168.0.251 via our public uk office ssh based gateway using ## ## $ ssh uk.gw.lan ## Host uk.gw.lan uk.lan HostName 192.168.0.251 User example ProxyCommand ssh example@gateway.uk.example.com nc %h %p 2> /dev/null ## Our Us Proxy Server ## ## Forward all local port 3128 traffic to port 3128 on the remote vps1.example.com server ## ## $ ssh -f -N proxyus ## Host proxyus HostName vps1.example.com User breakfree IdentityFile ~/.ssh/vps1.example.com.key LocalForward 3128 127.0.0.1:3128 ## Now set defaults for all if not matched by any hosts ## Host * ForwardAgent no ForwardX11 no ForwardX11Trusted yes User example Port 22 Protocol 2 ServerAliveInterval 60 ServerAliveCountMax 30
了解~/.ssh/config条目
- Host:定义配置部分适用于哪些主机。该部分以新的主机部分或文件结尾结束。*可以使用单个作为模式来为所有主机提供全局默认值。
- HostName:指定要登录的真实主机名。数字 IP 地址也是允许的。
- User:定义 SSH 连接的用户名。
- IdentityFile:指定从中读取用户的 DSA、ECDSA 或 DSA 身份验证身份的文件。对于协议版本 1,默认为 ~/.ssh/identity;对于协议版本 2,默认为 ~/.ssh/id_dsa、~/.ssh/id_ecdsa 和 ~/.ssh/id_rsa。SSHIdentityFile配置或 CLI 中的选项指的是私钥文件,该文件必须保密。
- ProxyCommand:指定用于连接服务器的命令。命令字符串延伸到行尾,并使用用户的 shell 执行。在命令字符串中,任何出现的 %h 将被替换为要连接的主机名,%p 将被替换为端口,%r 将被替换为远程用户名。命令基本上可以是任何内容,并且应该从其标准输入读取并写入其标准输出。此指令与其代理支持结合使用非常有用。例如,以下指令将通过 192.1.0.253 上的 HTTP 代理进行连接:
ProxyCommand /usr/bin/nc -X connect -x 192.1.0.253:3128 %h %p - LocalForward:指定本地计算机上的 TCP 端口通过安全通道从远程计算机转发到指定的主机和端口。第一个参数必须是 [bind_address:]port,第二个参数必须是 host:hostport。
- Port:指定远程主机上连接的端口号。
- Protocol:按优先顺序指定 ssh(1) 应支持的协议版本。可能的值为 1 和 2。
- ServerAliveInterval:设置超时间隔(以秒为单位),如果在此间隔后未从服务器收到任何数据,则将通过加密通道发送一条消息以请求服务器做出响应。有关详细信息,请参阅博文“ Open SSH Server 连接在几分钟或 N 分钟不活动后断开”。
- ServerAliveCountMax:设置可发送的服务器活动消息数,而无需从服务器接收任何消息。如果在发送服务器活动消息时达到此阈值,ssh 将断开与服务器的连接,终止会话。
加速 ssh 会话
多路复用只不过是通过单个连接发送多个 ssh 连接。OpenSSH 可以将现有的 TCP 连接重用于多个并发 SSH 会话。这可以减少创建新 TCP 连接的开销。更新您的 ~/.ssh/config:
Host server1 HostName server1.example.com ControlPath ~/.ssh/controlmasters/%r@%h:%p ControlMaster auto
有关详细信息,请参阅“ Linux / Unix:OpenSSH 多路复用器加速 OpenSSH 连接”。在此示例中,我通过一台主机到达另一台服务器,即使用 ProxyCommand 跳转主机:
## ~/.ssh/config ## Host internal HostName 192.168.1.100 User vivek ProxyCommand ssh vivek@vpn.example.net.in -W %h:%p ControlPath ~/.ssh/controlmasters/%r@%h:%p ControlMaster auto
有关详细信息,请参阅以下教程:
覆盖 ssh 配置文件选项
ssh 命令按以下顺序读取其配置:
- ssh 命令行选项
- ~/.ssh/config 选项
- /etc/ssh/ssh_config 选项
假设您在 ~/.ssh/config 中设置了以下选项:
Host ln.openvpn-sg-vpn1 ln.wireguard-sg-vpn1
Hostname 172.16.0.1
User vivek
port 22
IdentityFile ~/.ssh/id_ed25519.pub
StrictHostKeyChecking no
现在想要使用 ~/.ssh/config 中的所有其他选项,但使用管理员用户而不是 vivek 进行连接,然后:我们可以指定另一个每个用户的配置文件,例如 /dev/null,通过传递以下内容
$ ssh -o "User=admin" ln.openvpn-sg-vpn1
来禁用 ~/.ssh/config:-F
$ ssh -F /dev/null admin@172.16.0.1
$ ssh -F /dev/null vivek@172.16.0.1
$ ssh -F /dev/null -i ~/.ssh/aws/id_ed25519.pub vivek@172.16.0.1
关于 shell 别名的说明(过时的方法)
## create a new bash shell alias as follow ## alias server1="ssh -i /nfs/shared/users/example/keys/server1/id_rsa -p 4242 example@server1.example.com"
然后,要通过 ssh 进入 server1,您无需输入完整的ssh -i /nfs/shared/users/example/keys/server1/id_rsa -p 4242 example@server1.example.com命令,而只需输入命令“server1”并按 [ENTER] 键:
$ server1
结论
本页解释了 ssh 客户端配置文件语法和示例,以提高您在 Linux、macOS 或 Unix shell 上的工作效率。请参阅以下资源或使用 man 命令阅读:
$ man 5 ssh_config
另请参阅:
- 20 个 OpenSSH 服务器最佳安全实践
- 如何在 Linux / Unix 系统上设置 SSH 密钥
- Linux / Unix 用户的 OpenSSH 配置文件示例
- 审计 Linux/Unix 上的 SSH 服务器和客户端配置
- 如何在 FreeBSD 上安装和升级 OpenSSH 服务器
- Ubuntu Linux 安装 OpenSSH 服务器
- 在 Alpine Linux 上安装 OpenSSH 服务器(包括 Docker)
- Debian Linux 安装 OpenSSH SSHD 服务器
- 配置 OpenSSH 以监听 IPv6 地址
- OpenSSH 服务器连接在几分钟不活动后断开
- 在 OpenSSH 身份验证之前显示横幅/消息
- 强制 OpenSSH(sshd)仅监听选定的多个 IP 地址
- OpenSSH 使用 ssh-keygen 命令更改密码
- 重复使用 SSH 连接以通过多路复用加速远程登录过程
- 重新启动 SSHD 服务器之前检查语法错误
- 更改 Linux 或 Unix 服务器上的 ssh 端口
- OpenSSH 拒绝或限制用户和组的访问
- Linux OpenSSH 服务器拒绝 root 用户访问/登录
- 在 Linux 上禁用 ssh 密码登录以提高安全性
- SSH ProxyCommand 示例:通过一台主机到达服务器
- OpenSSH 多路复用器可加速 OpenSSH 连接
- 在远程 Linux / UNIX 服务器中安装 / 附加 SSH 密钥 Authorized_keys
- 使用 ssh-copy-id 与监听不同端口的 OpenSSH 服务器配合使用