SSH高级使用技巧
SSH客户端配置文件
如果在Linux平台使用SSH远程登录服务器,通过SSH客户端配置文件可以快捷方便登录服务器,减少命令输入。
SSH客户端配置文件语法介绍可以通过man ssh_config
查看。
配置文件不区分大小写,#
开头的行当做注释处理,可以使用如*
的通配符设置参数。
常用参数:
- Host 限制随后的配置应用于匹配的主机
- User 登录用户
- Hostname 登录服务器地址,常用IP地址
- Port 登录端口号,默认不填为22
- IdentityFile 指定本地认证私钥文件
- ForwardAgent yes 允许ssh-agent转发
- IdentitiesOnly 指定ssh是否仅使用密钥认证,yes/no
- StrictHostKeyChecking 当设为ask时表示第一次连接陌生服务器时提示是否添加,同时如果远程服务器公钥改变时拒绝连接;yes表示不会自动添加服务器公钥到
~/.ssh/known_hosts
中,同时如果远程服务器公钥改变时拒绝连接;no表示自动增加新的主机键到~/.ssh/known_hosts
中。
示例:
配置文件设置
# ~/.ssh/config
Host remote
user test
hostname 10.10.10.10
port 22
连接命令:
$ ssh remote
$ scp hello.txt remote:/path/to/dir
跳板机
跳板机:jump host, jump server, bastion server
可以使用ProxyCommand
或者ProxyJump
指令。
对于较新的OpenSSH,建议使用ProxyJump
。
使用示例:
$ ssh -J <jump_server> <remote_server>
通过多个跳板机命令
$ ssh -J <jump_server1>,<jump_server2>,<jump_server3> <remote_server>
如果使用ProxyCommand
命令,
$ ssh -o ProxyCommand="ssh -W %h:%p <jump_server>" <remote_server>
以上是命令行使用方法,还可以在SSH客户端配置文件~/.ssh/config
中进行跳转配置。
# ~/.ssh/config
Host remote
HostName IP
User test
IdentityFile ~/.ssh/<key>
Port 2048
# ProxyJump
ProxyJump user@<jump_server>
# if you want to use ProxyCommand
#ProxyCommand ssh -W %h:%p <jump_server>
完成跳转机配置后,直接使用以下命令登录远程机器
$ ssh remote
条件跳转
场景:笔记本电脑在家办公直接连接家庭网络访问家中的服务器,而在外面需要通过跳转机访问家中的服务器。
OpenSSH可以通过Match exec
指令实现以上目的。
Match host server1 !exec "ifconfig en0 | grep 192.168.100.10"
ProxyJump user@<jump server>
Host server1
Hostname 192.168.100.20
检查网卡en0的IP地址是否是192.168.100.10
,如果grep执行成功,SSH将执行跳板机配置,否则忽略跳转配置。
ProxyCommand配合netcat命令
ProxyCommand支持netcat(nc)命令,而netcat支持SOCKS v4/v5及HTTPS代理协议。
- SOCKS v4
/usr/bin/nc -X 4 -x PROXY_ADDRESS:PORT %h %p
- SOCKS v5
/usr/bin/nc -X 5 -x PROXY_ADDRESS:PORT %h %p
- HTTPS
/usr/bin/nc -X connect -x PROXY_ADDRESS:PORT %h %p
配合ProxyCommand使用示例:
ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:1080 %h %p
以上命令实现SOCKS v5代理。
免密码密钥登录
对于Windows OpenSSH服务器,在%programdata%/ssh/administrators_authorized_keys
(管理员账号)或者标准用户home目录下.ssh/authorized_keys
文件中添加公钥。
然后使用管理员身份执行PowerShell,执行命令
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
改变SSH默认端口
SSH默认端口为22,为了安全性建议改变该端口为其它端口,一般建议10000以上。
在/etc/ssh/sshd_config
中找到#Port 22
这一行,开启端口设置
Port 10001
重启SSHD服务
$ systemctl restart sshd
如果此时测试新端口不能登陆,可能需要设置防火墙规则。
对于Centos,设置firewalld和SELinux。
- firewalld
$ firewall-cmd --state # 查看firewalld是否开启
$ firewall-cmd --zone=public --add-port=10001/tcp --permanent # 添加新端口规则
$ firewall-cmd --reload # 重启firewalld
$ firewall-cmd --zone=public --query-port=10001/tcp # 如返回yes说明添加成功
- SELinux
$ /usr/sbin/sestatus -v # 查看SELinux是否开启
$ semanage port -l | grep ssh # 查看SELinux是否放行SSH端口
$ semanage port -a -t ssh_port_t -p tcp 10001 # 添加SSH端口
$ semanage port -l | grep ssh # 查看是否添加成功
X11 Forwarding
很多时候需要在服务器上打开图像软件,需要开启X11 Forwarding功能。
首先OpenSSH服务器端配置文件/etc/ssh/sshd_config
必须支持X11 Forwarding。
X11Forwarding yes
SSH客户端登录时加上-X
选项。
$ ssh -X remote
remote > xclock # xlock 命令测试
参考资料
Tutorial: How to Use SSH ProxyJump and SSH ProxyCommand
OpenSSH Server configuration for Windows

