“Ssh”的版本间的差异

来自Shiyin's note
跳到导航 跳到搜索
 
(没有差异)

2023年3月19日 (日) 11:27的最新版本


ssh免密码访问

  • 1.输入 ssh-keygen -t rsa

产生密钥,在提示保存私钥(key)和公钥(public key)的位置时,使用默认值。 如果需要私钥密码(passphrase),则输入一个私钥密码(如果使用私钥密码,使用 ssh 执行远程命令时需要输入私钥密码) 而既然我们的目的是不设密码访问,因此,直接回车即可。

  • 2.将该密钥附加到服务器端的.ssh目录下的 authorized_keys文件当中

ssh 202.127.29.3 cat ~/.ssh/id_rsa.pub >> authorized_keys

或者

ssh-copy-id -i .ssh/id_rsa.pub hostB
  • 曾经出现过设置authorized_keys后访问仍然需要密码的现象。通过检查/var/log/secure现这是由于/home/shen的目录权限设置的原因,设置权限过高,改成755后才得以通过。类似的需要检查的是.ssh目录和authorized_keys的权限。

ssh的端口转发

绑定本地端口

既然SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性。 假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写:

ssh -D 8080 user@host

SSH会建立一个socket,去监听本地的8080端口。一旦有数据传向那个端口,就自动把它转移到SSH连接上面,发往远程主机。可以想象,如果8080端口原来是一个不加密端口,现在将变成一个加密端口。

本地端口转发

有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的"端口转发"。为了区别后文的"远程端口转发",我们把这种情况称为"本地端口转发"(Local forwarding)。

假定host1是本地主机,host2是远程主机。由于种种原因,这两台主机之间无法连通。但是,另外还有一台host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过host3,将host1连上host2。 我们在host1执行下面的命令: 

$ ssh -L 2121:host2:21 host3

命令中的L参数一共接受三个值,分别是"本地端口:目标主机:目标主机端口",它们之间用冒号分隔。这条命令的意思,就是指定SSH绑定本地端口2121,然后指定host3将所有的数据,转发到目标主机host2的21端口(假定host2运行FTP,默认端口为21)。 这样一来,我们只要连接host1的2121端口,就等于连上了host2的21端口。 

$ ftp localhost:2121

"本地端口转发"使得host1和host3之间仿佛形成一个数据传输的秘密隧道,因此又被称为"SSH隧道"。

远程端口转发

既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发。 还是接着看上面那个例子,host1与host2之间无法连通,必须借助host3转发。但是,特殊情况出现了,host3是一台内网机器,它可以连接外网的host1,但是反过来就不行,外网的host1连不上内网的host3。这时,"本地端口转发"就不能用了,怎么办? 解决办法是,既然host3可以连host1,那么就从host3上建立与host1的SSH连接,然后在host1上使用这条连接就可以了。 我们在host3执行下面的命令: 

$ ssh -R 2121:host2:21 host1

R参数也是接受三个值,分别是"远程主机端口:目标主机:目标主机端口"。这条命令的意思,就是让host1监听它自己的2121端口,然后将所有数据经由host3,转发到host2的21端口。由于对于host3来说,host1是远程主机,所以这种情况就被称为"远程端口绑定"。 绑定之后,我们在host1就可以连接host2了:

$ ftp localhost:2121

这里必须指出,"远程端口转发"的前提条件是,host1和host3两台主机都有sshD和ssh客户端。

配置文件

系统的配置文件在/etc/ssh/目录下,ssh_config(客户端)sshd_config(服务段) 客户端使用本地目录在.ssh/ssh_config 文件

/etc/ssh/ssh_config

  • Host *
选项“Host”只对能够匹配后面字串的计算机有效。“*”表示所有的计算机。
  • ForwardAgent no
“ ForwardAgent”设置连接是否经过验证代理(如果存在)转发给远程计算机。
  • ForwardX11 no
“ForwardX11”设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)。
  • RhostsAuthentication no
“RhostsAuthentication”设置是否使用基于rhosts的安全验证。
  • RhostsRSAAuthentication no

“RhostsRSAAuthentication”设置是否使用用RSA算法的基于rhosts的安全验证。

  • RSAAuthentication yes
“RSAAuthentication”设置是否使用RSA算法进行安全验证。
  • PasswordAuthentication yes
“PasswordAuthentication”设置是否使用口令验证。
  • FallBackToRsh no
“FallBackToRsh”设置如果用ssh连接出现错误是否自动使用rsh。
  • UseRsh no
“UseRsh”设置是否在这台计算机上使用“rlogin/rsh”。
  • BatchMode no
“BatchMode”如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用。
  • CheckHostIP yes
“CheckHostIP”设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”。
  • StrictHostKeyChecking no
“StrictHostKeyChecking”如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接。
  • IdentityFile ~/.ssh/identity
“IdentityFile”设置从哪个文件读取用户的RSA安全验证标识。
  • Port 22
“Port”设置连接到远程主机的端口。
  • Cipher blowfish
“Cipher”设置加密用的密码。
  • EscapeChar ~
“EscapeChar”设置escape字符。

/etc/ssh/sshd_config

  • 关闭sftp
“Subsystem sftp /usr/libexec/openssh/sftp-server”注销掉
  • Port 22
“Port”设置sshd监听的端口号。
  • ListenAddress 192.168.1.1
“ListenAddress”设置sshd服务器绑定的IP地址。
  • HostKey /etc/ssh/ssh_host_key
“HostKey”设置包含计算机私人密匙的文件。
  • ServerKeyBits 1024
“ServerKeyBits”定义服务器密匙的位数。
  • LoginGraceTime 600
“LoginGraceTime”设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位)。
  • KeyRegenerationInterval 3600
“KeyRegenerationInterval”设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。
  • PermitRootLogin no
“PermitRootLogin”设置root能不能用ssh登录。这个选项一定不要设成“yes”。
  • IgnoreRhosts yes
“IgnoreRhosts”设置验证的时候是否使用“rhosts”和“shosts”文件。
  • IgnoreUserKnownHosts yes
“IgnoreUserKnownHosts”设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts”
  • StrictModes yes
“StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。
  • X11Forwarding no
“X11Forwarding”设置是否允许X11转发。
  • PrintMotd yes
“PrintMotd”设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。
  • SyslogFacility AUTH
“SyslogFacility”设置在记录来自sshd的消息的时候,是否给出“facility code”。
  • LogLevel INFO
“LogLevel”设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。
  • RhostsAuthentication no
“RhostsAuthentication”设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。
  • RhostsRSAAuthentication no
“RhostsRSA”设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。
  • RSAAuthentication yes
“RSAAuthentication”设置是否允许只有RSA安全验证。
  • PasswordAuthentication yes
“PasswordAuthentication”设置是否允许口令验证。
  • PermitEmptyPasswords no
“PermitEmptyPasswords”设置是否允许用口令为空的帐号登录。
  • AllowUsers admin
AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或[email=user@host]user@host[/email]这样的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。

SSH Server 发送“心跳”信号来维持持续连接

 ClientAliveInterval 60
ClientAliveCountMax 6000

~/.ssh/config

上述的ssh -L 2010:192.168.200.110:23 命令可以在SSH的配置文件ssh_config 中加入LocalForward 2010:192.168.200.110:23 来实现。

通过中间主机建立SSH连接

ssh -t reachable_host ssh unreachable_hostUnreachable_host表示从本地网络无法直接访问的主机,但可以从reachable_host所在网络访问,这个命令通过到reachable_host的“隐藏”连接,创建起到unreachable_host的连接。

ssh代理

  • 安装Bitvise SSH client,设置启用scoks5代理,设定端口
  • ssh -D 端口号 your server

本地端口转发

ssh host1 -N -f -L 1700:host2:1700 -L 59713:host:59713

通过host1做代理,将host2的1700端口和59713端口转发到本地。(host1是可以访问host2的1700和59713端口的)

远程端口转发

ssh host1 -R  1700:host2:21 (在host3上执行)

对于host3来说,就是让远程host1的1700端口内容转发到host2的21端口,因此在host1上访问本地的1700端口相当于访问host2的21端口。

Firefox

  • 安装插件Autoproxy,注意端口的匹配
  • 可参考http://u.fishnote.net/

IE

  • ssh使用的是socks5代理,IE必须将socks5代理转化成http代理
  • 下载软件 Privoxy 地址:http://sourceforge.net/projects/ijbswa/
  • 安装完成后,在privoxy的主界面中选择“Options”—>”Edit Main Configuration” ,之后会打开一个txt文档,在最后面追加两行代码,如下:
listen-address 127.0.0.1:8118 
forward-socks5 / 127.0.0.1:7070 . 

别忘了7070后有个小点。 7070是代理软件Tunelier端口,8181是自己设置的任意端口。

  • IE的连接里(Internet选项--连接--局域网设置)配置代理地址为 127.0.0.1 8118

全局代理软件

  • windows下proxifier (注意proxyfier是另外一个软件)
  1. 先打开一个ssh代理,比如ssh -D 8080 yourserver
  2. 在proxifier下,建立一个新的代理服务器指向localhost 127.0.0.1,端口是8080
  3. 注意这个软件的早期版本会导致windows8和10中的Metro程序无法联网。

openssh 手工升级

cd openssh-6.6p1    
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords  --with-pam  
sudo make install

scp错误

ssh连接正常,但是当使用sftp或者scp时出现错误,这个通常是由于在服务器端,有过多的输出造成的,例如在~/.bashrc下加入了很多echo,命令。参考[1]

解决办法,把echo或者cat的输出转移到csh.login文件下,该配置文件在scp的时候不执行。

在bash当中,可以通过脚本判断是否是交互式shell

$- == *i*  && cat /var/www/html/welcome
  • subsystem request failed on channel 0 scp

try to use -O option with scp. This solved the same issue in my case with 9.0p1. It forces to use the legacy SCP protocol for file transfers instead of the SFTP protocol. Use of the SCP protocol may be necessary for servers that do not implement SFTP, for backwards-compatibility for particular filename wildcard patterns and for expanding paths with a ‘~’ prefix for older SFTP servers.