Linux ssh使用技巧

date: 2015.12.05; modification:2019.06.19

目录:

1 ssh登陆慢的问题

1.1 DNS反向解析的问题

OpenSSH在用户登录的时候会验证IP, 它根据用户的IP使用反向DNS找到主机名, 再使用DNS找到IP地址, 最后匹配一下登录的IP是否合法. 如果客户机的IP没有域名, 或者DNS服务器很慢或不通, 那么登录就会很花时间.

解决办法:

在目标服务器上修改sshd服务器端配置, 并重启sshd

vi /etc/ssh/sshd_config, 设置UseDNS为no即可.

1.2 GSSAPIAuthentication问题

vi /etc/ssh/sshd_config, GSSAPIAuthentication 改为 no.

1.3 非ssh问题

我的ubuntu18.04 server登录会很慢, 而且不只是ssh远程登录慢(3s左右), 直接登录也慢. 后来经过如下两个操作后, 变快很多, 基本上是立即登录了:

sudo apt-get remove landscape-client landscape-common # 这个好像是用来在登录的时候显示cpu, 内存占用情况等信息的.
sudo mv /etc/update-motd.d /etc/update-motd.d.bak     # 这个不知道干嘛的, 反正改掉后变快很多.

2 共享连接

如果你需要在多个窗口中打开到同一个服务器的连接, 而不想每次都输入用户名, 密码, 或是等待连接建立, 那么你可以配置SSH的连接共享选项, 在本地打开你的SSH配置文件, 通常它们位于~/.ssh/config, 然后添加下面2行:

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r

现在试试断开你与服务器的连接, 并建立一条新连接, 然后打开一个新窗口, 再创建一条连接, 你会发现, 第二条连接几乎是在瞬间就建立好了.

3 使用主机别名ssh登陆

如果嫌每次都敲入ssh -p 23 myuser@www.myhostxxx.com比较麻烦的话, 可以在客户机的~/.ssh/config中加入:

Host myhost
HostName www.myhostxxx.com
User myuser
Port 23

这样, 以后就可以直接用ssh myhost来登陆了.

4 ssh作为socks5代理(Dynamic tunnel)

ssh -ND 12345 user@TargetServer


+-----------+             +--------------+
|   local   | --tunnel--> | TargetServer |
+-----------+             +--------------+
Listen 12345
     ^
     |
     |通过设定socks5代理为localhost:12345访问
     |
+-----------+
|  browser  |
+-----------+

这样, 本地浏览器通过设定socks5代理为localhost:12345, 访问ssh监听的本地端口, 进而将数据通过tunnel转发到TargetServer, 也就相当于从TargetServer向需要访问的网站发请求.

如果需要允许其他机器访问该12345端口, 可以加-g选项(注意这样可能不会不安全).

查看-g选项是否生效, 可以用:

sudo netstat -lnp | grep 12345

不加-g选项时, 该命令显示:

tcp        0      0 127.0.0.1:12345         0.0.0.0:*               LISTEN      22123/ssh       
tcp6       0      0 ::1:12345               :::*                    LISTEN      22123/ssh   

加-g后, 显示:

tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN      27355/ssh       
tcp6       0      0 :::12345                :::*                    LISTEN      27355/ssh    

5 使用ssh反向通道登陆内网机器

见: Ubuntu使用ssh反向通道登陆内网机器

6 sshfs将远程目录通过ssh挂载到本地

sudo apt install sshfs
sshfs user@remoteserver:/media/data ~/data/

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

如果有一段时间在SSH连接上无数据传输, 连接就会断开. 解决此问题有两种方法.

7.1 方案一: 在客户端设置

方法很简单, 只需在客户端电脑上编辑/etc/ssh/ssh_config(或者~/.ssh/config), 并添加如下一行:

ServerAliveInterval 60

此后该系统里的用户连接SSH时, 每60秒会发一个KeepAlive请求, 避免被踢.

7.2 方案二: 在服务器端设置

如果有相应的权限, 也可以在服务器端设置, 即编辑/etc/ssh/sshd_config, 并添加:

ClientAliveInterval 60

重启SSH服务器后该项设置会生效. 每一个连接到此服务器上的客户端都会受其影响. 注意: 启用该功能后, 安全性会有一定下降(比如忘记登出时...)

8 sshd log

在文件:
tail -f /var/log/auth.log

// 失败log:
incorrect password          # 输错密码
authentication failure      # 输错密码
Connection closed by authenticating # 没有添加key

9 保存连接信息到~/.ssh/config(以便快速连接)

Host myserver
HostName 192.168.1.123
User hello
Port 12345
IdentityFile ~/.ssh/id_rsa_for_myserver

10 选项

-1: 强制使用ssh协议版本1;
-2: 强制使用ssh协议版本2;
-4: 强制使用IPv4地址;
-6: 强制使用IPv6地址;
-A: 开启认证代理连接转发功能;
-a: 关闭认证代理连接转发功能;
-b: 使用本机指定地址作为对应连接的源ip地址;
-C: 请求压缩所有数据;
-F: 指定ssh指令的配置文件;
-f: 后台执行ssh指令;
-g: 允许远程主机连接主机的转发端口;
-i: 指定身份文件;
-l: 指定连接远程服务器登录用户名;
-N: 不执行远程指令;
-o: 指定配置选项;
-p: 指定远程服务器上的端口;
-q: 静默模式;
-X: 开启X11转发功能;
-x: 关闭X11转发功能;
-Y: 开启信任X11转发功能.

11 参考资料

https://www.cnblogs.com/piperck/p/6200439.html

http://man.linuxde.net/ssh

https://blog.csdn.net/lcathm/article/details/50156285

Ubuntu 中登录相关的日志: https://www.cnblogs.com/sparkdev/p/7694202.html

Linux服务器限制ssh登录, 查看登录日志: https://blog.csdn.net/sasoritattoo/article/details/9319769

阿里云主机 /var/log/auth.log文件不存在问题的解决: http://nferzhuang.com/varlogauth-log%E6%96%87%E4%BB%B6%E4%B8%8D%E5%AD%98%E5%9C%A8/