“Ssh”的版本间差异
无编辑摘要 |
|||
第127行: | 第127行: | ||
==== SSH Server 发送“心跳”信号来维持持续连接==== |
==== SSH Server 发送“心跳”信号来维持持续连接==== |
||
ClientAliveInterval 60 |
ClientAliveInterval 60 |
||
ClientAliveCountMax |
ClientAliveCountMax 6000 |
||
===~/.ssh/config=== |
===~/.ssh/config=== |
2017年2月11日 (六) 08:49的版本
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 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是另外一个软件)
- 先打开一个ssh代理,比如ssh -D 8080 yourserver
- 在proxifier下,建立一个新的代理服务器指向localhost 127.0.0.1,端口是8080
- 注意这个软件的早期版本会导致windows8和10中的Metro程序无法联网。
- 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