一台云服务器Windows篇:04、OpenSSH-WIN64与SSH隧道应用

在Windows 2012 R2上安装、配置、使用OpenSSH-WIN64 v9.8.1.0p1

OpenSSH-WIN64 安装与配置

高版本Windows已经内置openssh服务器与客户端的组件,启用就可以了。但在2012 R2还没有,需要手工下载与安装。

下载:Releases · PowerShell/Win32-OpenSSH

安装

打开PowerShell

cd 解压目录
powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

有提示sshd and ssh-agent services successfully installed,会自动将安装目录添加到path变量中。

netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22

注意:云服务器安全组的22端口也需要开放。

配置系统服务为自动启动

就可以使用Windows用户与密码通过ssh登录了,登录成功后shell为cmd.exe。

PowerShell为默认shell

  1. CMD/PowerShell 本身没有类似vi/vim的在线文本编辑器
    1. 编辑文本文件内容时,需要使用sftp工具下载到客户端本地编辑,完成后再上传Windows服务器。
    2. 可以使用echo >>方式追加内容到文本文件中。
    3. 在本地环境中,可下载 vim for windows 安装版本:download : vim online,在安装过程中,选中安装控制台版本。(实践下来,在ssh客户端中使用不了,但本地没有问题。vi 文本编辑器快速上手 – 未名)
    4. Microsoft Edit 需要在Win 2016/10及以上版本环境,还没有在ssh客户端中实践过。
  1. 将默认 OpenSSH shell 从 CMD 更改为 PowerShell,在PowerShell中执行:
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

如果要切换回去,删除注册表中 HKLM\SOFTWARE\OpenSSH 的 DefaultShell 值就可以了。

密钥对登录

在C:\ProgramData\ssh\sshd_config配置文件中,指定的密钥验证文件路径与名称

准备 administrators_authorized_keys 文件

Windows 上的 OpenSSH,SSH 服务器从 C:\ProgramData\ssh\administrators_authorized_keys 文件中读取公钥。但这个文件默认不存在,且要求只能Administrators 组和SYSTEM 帐户有权访问。

PowerShell 中执行(或手工操作也行):

New-Item -Type File -Path C:\ProgramData\ssh\administrators_authorized_keys
get-acl C:\ProgramData\ssh\ssh_host_rsa_key | set-acl C:\ProgramData\ssh\administrators_authorized_keys

确认,此时为空文件,NTFS权限如下图。

在客户端上操作

创建密钥对

PowerShell 或 CMD中,先进入%USERPROFILE%\.ssh目录,没有就创建;再执行

ssh-keygen

全回车

%USERPROFILE%\.ssh目录里生成二个文件,一个公钥(id_xxx.pub),一个私钥(id_xxx)

这二个文件保护好,可在不同设备上使用。

将客户端中生成的公钥,添加到服务器里

方式一:PowerShell中运行

$public_key = Get-Content ~/.ssh/id_xxx.pub
ssh xxx@ip "'$($public_key)' | Out-File C:\ProgramData\ssh\administrators_authorized_keys -Encoding UTF8 -Append"

输入正确的密码,登录成功后就可以退出了。

再去服务器上看,C:\ProgramData\ssh\administrators_authorized_keys文件就有内容了。

之后,在PowerShell 或 CMD中执行ssh xxx@ip,就可以不用输入密码。

方式二:CV大法
如果感觉方式一麻烦,可以复制客户端上公钥(id_xxx.pub)文件内容,粘贴到服务器的administrators_authorized_keys文件里。

在putty与filezilla使用

Putty需要使用puttyGen打开私钥文件,保存为ppk文件后,再读取ppk文件。

Filezilla client已经同时ppk与pem格式,可以直接使用pem格式的私钥(id_xxx)文件。

禁止密码登录

在C:\ProgramData\ssh\sshd_config配置文件中,将

#PasswordAuthentication yes
改为
PasswordAuthentication no
#PubkeyAuthentication yes
改为
PubkeyAuthentication yes

重启 sshd 与 ssh-agent 系统服务,就生效了。

Windows 标准用户使用SSH

在Windows 2012上:

  • 官方文档操作,增加 AllowUsers 行,直接失败,而且连管理员用户都登录不上ssh。
  • 改为增加 AllowGroups 行,管理员用户连接没有影响,但标准用户的ssh登录成功后,不出shell,白搭。

C:\ProgramData\ssh\sshd_config 全文如下

PubkeyAuthentication yes
# 原 administrators_authorized_keys 文件路径,要变为 %USERPROFILE%\.ssh\authorized_keys
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication no
Subsystem	sftp	sftp-server.exe

AllowGroups administrators bisync

openSSH server中用户的允许和拒绝连接到服务器的指令,按以下顺序进行处理: DenyUsers、 AllowUsers、 DenyGroups最后 AllowGroups。

所有帐户名称都必须以小写形式指定,账户名中,除了用户名,还有可以有ip地址,看示例:

DenyUsers contoso\admin@192.168.2.23
DenyUsers contoso\*
AllowUsers localuser@192.168.2.23
AllowGroups sshusers
AllowGroups contoso\sshusers contoso\serveroperators

SSH隧道使用:sftp与端口转发

  1. Sftp可以替代FTP,如果只是自己使用,就不需要安装filezilla server,也不需要开放ftp相关端口。
  2. 在dbeaver中利用ssh隧道,不需要在防止墙中开放DB端口,配置方法:

本地端口转发:监听本地端口,将数据转发到远程端口。

以将本地13306端口数据转到远程rIP:3306为例(rIP可以ssh服务器本身,也可以ssh服务器可访问的机器)。

ssh -p 22 sshUser@sshIP -L 13306:rIP:3306 -i"%USERPROFILE%\.ssh\id_xxx" -N -o ServerAliveInterval=60 -o ServerAliveCountMax=3

参数含义:(更多见文档 ssh(1) – OpenBSD manual pages

-L [监听IP:]监听端口13306:目标主机rip:目标端口3306
-C 启用压缩(谨慎使用,会影响app), -N 不启动shell, -i 指定私钥文件
-o 两个参数用来保证ssh隧道不会自动关闭
  1. 可在本地查看端口是否被占用 netstat -ano|findstr “:13306″,只有占用了代表监听端口成功
  2. 在应用中,原配置rIP:3306的地方,改为localhost:13306。
  3. WIN自带远程桌面应用支持这种方式,rIP不要写为127.0.0.1,要写服务器网卡的IP地址(一般是内网IP段的IP地址)。这样就不需要开放公网的3389端口。
ssh sshUser@sshIP -L 33890:rIP:3389

动态应用转发:把sshd当做socks5使用

REM -D [监听IP:]监听端口
ssh sshUser@sshIP -D 1080
  1. 运行成功后,再打开一个cmd运行 netstat -ano|findstr “:1080” 发现本地1080被监听。
  2. 在应用上配置socks5的ip为127.0.0.1,端口为1080。应用的数据就通过ssh服务器转发了。

远程端口转发:监听远程端口,将数据转发到本地端口。

与本地端口转发(应用服务器在rIP上)正好相反。应用服务在本地网络上,ssh服务器或ssh服务网络里有应用客户端要连接应用服务器(使用场景比较少)。

ssh sshUser@sshIP -R [监听IP:]监听端口:目标主机:目标端口

端口转发在putty中的配置

和命令行效果一样,也有本地/远程/动态方式。注意:谨慎开启压缩参数,在端口转发场景下,应用有明显卡顿出现。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注