SSH

ssh

概要

ssh	[-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] 
[-F configfile] [-I pkcs11] [-i identity_file] [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] 
[-o option] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] 
[user@]hostname [command]

描述

ssh(SSH 客户端)是一个用于登录远程机器并在远程机器上执行命令的程序。它旨在在不可信任的主机之间提供安全加密通信,即使在不安全的网络上也可以进行通信。X11 连接、任意 TCP 端口和 UNIX 域套接字也可以通过安全通道转发。

  • 简单示例
$   ssh root@139.196.28.125

ssh 连接并登录到指定的主机(可选用户名)。用户必须使用下面的几种方法之一向远程机器证明自己的身份(见下文)。如果指定了命令,则该命令将在远程主机上执行,而不是登录 shell。

如果指定了命令,则该命令将在远程主机上执行,而不是登录 shell。 选项如下:

选项 描述
-1 强制 ssh 仅尝试协议版本 1。
-2 强制 ssh 仅尝试协议版本 2。
-4 强制 ssh 仅使用 IPv4 地址。
-5 强制 ssh 仅使用 IPv6 地址。

SSH 免密登录

如果你想在 A 中无需密码登录 B,你可以像这样做:

1、在 A 中生成 SSH 密钥

ssh-keygen -t rsa

可能会提示三次输入,直接按回车即可。它将在 .ssh 目录下生成 id_rsaid_rsa.pub

2、将 Aid_rsa.pub 导入到 B

ssh-copy .ssh/id_rsa.pub root@139.196.28.125

如果 A 没有安装 ssh-copy,我们可以这样做:

  • id_rsa.pub 复制到 B
houbinbindeMacBook-Pro:.ssh houbinbin$ scp ~/.ssh/id_rsa.pub root@139.196.28.125:id_rsa.pub
root@139.196.28.125's password:
id_rsa.pub
  • 将其导入到 B.ssh/authorized_keys
cat id_rsa.pub > .ssh/authorized_keys

如果你登录的用户没有 .ssh 目录,创建一个:

root@iZuf60ahcky4k4nfv470juZ:~# pwd
/root
root@iZuf60ahcky4k4nfv470juZ:~# mkdir .ssh

3、登录测试

houbinbindeMacBook-Pro:~ houbinbin$ ./ali.sh
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-86-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
New release '16.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Welcome to aliyun Elastic Compute Service!

root@iZuf60ahcky4k4nfv470juZ:~#

SSH 内网穿透技术

ssh-inner-inject

假设已有:

  1. 一台公网主机(B)
  2. 可以联公网的主机的主机A、C

问: 如何让C访问A呢?

思路

1、C可以直接访问B,A可以访问B,所以要通过B作为二者沟通的桥梁。 2、当我们使用C访问B时,如何让B把消息传递给A呢?(SSH)

实现

  • A来征服
ssh -N -f -R 2323:127.0.0.1:22 139.196.28.125

作用:告诉139.196.28.125(B), 如果有人请求你的2323端口, 你就把这个请求转到我(A)的22号端口

-N: 告诉B, 我这个命令你什么也不要做, 只需要做转发就行了 -f:让这条命令在A的后台执行(不会因为关掉命令窗口而断开链接) -R: 格式-R X:Y:Z, 作用是做端口映射, 把远程机器的端口X映射(转发)到本地机器Y的Z端口

  • C来见证

1、C访问B

ssh root@139.196.28.125

2、访问指定端口

让B访问自己的2323端口,等于直接访问A的22端口(22为默认ssh端口)

ssh -p 2323 root@localhost

将内网服务器设置为外网可以访问

指定转发脚本: conn.sh

# kill ssh

echo "kill all ssh..."
ps -ef | grep ssh | grep -v sshd | cut -c 9-15 | xargs kill -9

# ssh

ssh -C -f -N -g -L  8080:42.196.156.22:18080 -p 12222 houbinbin@42.196.156.22
ssh -C -f -N -g -L  8081:42.196.156.22:18081 -p 12222 houbinbin@42.196.156.22
ssh -C -f -N -g -L  9000:42.196.156.22:19000 -p 12222 houbinbin@42.196.156.22
ssh -C -f -N -g -L  80:42.196.156.22:10080 -p 12222 houbinbin@42.196.156.22

定时执行:

# crontab -e

添加内容如下:

# 每小时进行一次转发重连

0 */1 * * * /root/shell/conn.sh

SSH 访问其他服务器卡顿

ssh 访问很慢的原因和解决办法

原因:访问服务器的时候会把服务器的 ip 地址反向解析为域名,如果无法解析就会导致登陆时很慢

下面三种方法都可以解决这个问题

1、清空/etc/resolv.conf文件中nameserver记录

2、在客户机的/etc/hosts文件中添加服务器域名的解析记录

3、修改客户机的 /etc/ssh/ssh_config 文件中:

GSSAPIAuthentication no

我使用的方法 3,调整后重启机器。感觉好了很多。

拓展阅读

更安全的 ssh