SSH

2015-11-30

SSH to Windows

1.安装openssh

win -> 添加可选功能 -> 可选功能 -> openssh 服务器

或者通过powershell安装

Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

参考:https://learn.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_install_firstuse

2.配置文件

cat C:\ProgramData\ssh\sshd_config

Port 2223
PubkeyAuthentication yes
PasswordAuthentication yes
AuthorizedKeysFile	.ssh/authorized_keys
Subsystem	sftp	sftp-server.exe
Match User ml
    ForceCommand "c:\Program Files\Git\bin\bash.exe"

其他注释掉

3.开放端口

netsh advfirewall firewall add rule name="1ml" protocol=tcp localport=2223 action=allow dir=in

4.认证文件

echo "xxxxx cat id_rsa.pub" > C:\Users\ml\.ssh\authorized_keys

5.把bash初始化文件创建

.bash_profile
.bashrc
.bash_aliases
.git-prompt.sh

6.重启服务

net stop sshd
net start sshd

hosts

vim /c/Windows/System32/drivers/etc/hosts

解决wsl2下ssh服务无法启动

wsl2切换到镜像网络后ssh服务无法启动,检查后发现,配置了端口映射

查看

netsh interface portproxy show all

配置映射

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=192.168.50.2 connectport=22

该配置导致主机22端口被占用,镜像网络后wsl2内部也共用端口,所以其他服务也会出现端口冲突情况,在wsl2镜像网络模式下需注意!

删除映射配置:

netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22

解决Windows自带OpenSSH服务器无法实现密码登录

问题出现在win10下已有aaa账号:

修改系统密码;修改pin密码;和git-bash环境下passwd修改密码均无效。

重新创建新账号bbb可登录!

ssh自动化

基于python库:asyncssh、netmiko、paramiko

安装:

pip install asyncssh
pip install netmiko
pip install paramiko

clusterssh

Install

apt install clusterssh

Config

$ cat ~/.clusterssh/config
terminal_args=-fa 'DejaVu Sans Mono:style=Bold' -fs 8

$ cat ~/.bashrc
alias f1='cssh --fillscreen m8 m9 m10'

$ cat ~/.ssh/config
Host m8
    HostName m4
    User root
    Port 1822

SSH反向连接

首先2台主机都要安装ssh服务端:

apt install openssh-server

如果有需要开启root远程登录,可以修改/etc/ssh/sshd_config

找到 PermitRootLogin 一行,改为 PermitRootLogin yes

重启sshd服务

service ssh restart

A要控制B

A主机:外网,ip:123.123.123.123,sshd端口:22

B主机:内网,sshd端口:22

无论是外网主机A,还是内网主机B都需要跑ssh daemon

1.首先在B上执行

ssh -NfR 1234:localhost:22 user1@123.123.123.123 -p22

这句话的意思是将A主机的1234端口和B主机的22端口绑定,相当于远程端口映射(Remote Port Forwarding)。

2.这时在A主机上sshd会listen本地1234端口

ssh localhost -p1234

自动登录

方法1.在内网B主机上生产公钥和私钥

$ ssh-keygen

…(一直按Enter,最后在~/.ssh/下生成密钥)

$ ls ~/.ssh/
id_rsa id_rsa.pub known_hosts

生成指定名称的公私钥

$ ssh-keygen -t rsa -f name_rsa

复制B主机上生成的id_rsa.pub公钥到外网A主机上,并将内容加入到~/.ssh/authorized_keys中

方法2.直接在B主机上执行

$ ssh-copy-id user1@123.123.123.123

SSH-keygen 根据私钥生成公钥

$ ssh-keygen -y -f id_rsa

用Autossh保持ssh反向隧道一直连接

autossh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221

注:默认autossh没有配置环境变量,需要自己设定

export AUTOSSH_PIDFILE=/var/run/autossh.pid
export AUTOSSH_POLL=60
export AUTOSSH_FIRST_POLL=30
export AUTOSSH_GATETIME=0
export AUTOSSH_DEBUG=1

为了保证开机时就启动,需要把以上环境变量写入/etc/profile中

然后在/etc/init/rc.local中添加:

autossh -NfR 1234:localhost:2223 user1@123.123.123.123 -p2221

使用curl让反向隧道保持连接

在A主机上配置计划任务:

*/1 * * * * netstat -lnt4p|grep "sshd: root"|awk '{print $4}'|awk -F ':' '{print $2}'|xargs -i curl localhost:{}

定时向本地的隧道端口请求数据

其他技巧

ssh实现SOCKS动态端口转发

示例:

ssh -D 9990 -N -f -C -q user@remote.host

说明:

-D 启动一个SOCKS服务并监听本地对应端口
-f 后台运行
-C 压缩请求数据
-q 使用静默模式
-N 不执行远程命令

ssh使用代理连接

使用ncat.exe进行代理连接,该工具在nmap套件里面,下载地址:https://nmap.org/dist/

比如下载 https://nmap.org/dist/nmap-7.92-win32.zip 在里面找到ncat.exe文件

或下载安装:https://nmap.org/dist/nmap-7.95-setup.exe 默认ncat配置到环境变量中了,安装完成后需重启系统,以让环境变量生效。

连接时使用代理参数:

ssh -o "ProxyCommand=ncat --proxy-type socks5 --proxy 127.0.0.1:50001 %h %p" root@111.12.12.12

如果放bat脚本里可这么写:

wt -w 0 new-tab cmd /k ssh -o """ProxyCommand=ncat --proxy-type socks5 --proxy 127.0.0.1:50001 %%h %%p""" root@111.12.12.12

git ssh使用代理

编辑文件:~/.ssh/config

host github.com
    user git
    hostname github.com
    port 22
    proxycommand ncat --proxy-type socks5 --proxy 127.0.0.1:50001 %h %p

ssh中继隧道连接

默认只能通过ssh localhost -p来连接,如果要实现远程登录内网B主机,可以在A主机上再开一个本地端口转发:

ssh -g -L 80:localhost:1234 localhost

远程就可以通过A主机的80端口去连接B主机了。

我们甚至可以启动socket5隧道:

ssh -N -f -D 0.0.0.0:8888 root@localhost -p1234

ssh 指定私钥文件:

ssh -i /root/.ssh/idrsa root@malu.me -p 2111

ssh取消主机密钥检查

1.使用ssh连接远程主机时加上“-o StrictHostKeyChecking=no”的选项,如下:

ssh  -o StrictHostKeyChecking=no  192.168.xxx.xxx

2.一个彻底去掉这个提示的方法是,修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

ssh取消警告

取消每次ssh登录,弹出Warning:Permanently added (RSA) to the list of known hosts的警告

修改配置文件 /etc/ssh/ssh_config

StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts

避免SSH连接因超时闲置断开

在服务器上打开 /etc/ssh/sshd_config 加入配置:

ClientAliveInterval 1200
ClientAliveCountMax 3

异常

登录时候卡在:debug1: expecting SSH2_MSG_KEX_ECDH_REPLY

解决办法:

从 MAC 算法列表中删除 hmac-md5,仅使用hmac-sha1

在 /etc/ssh/ssh_config 中编辑下一行:

#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
MACs hmac-sha1