Ssh

来自Shiyin's note
Shen讨论 | 贡献2015年2月4日 (三) 11:43的版本 →‎ssh代理
跳到导航 跳到搜索


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

  • 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/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

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下proxyfier
  • linux下proxychain

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