5.1 Public key authentication
使用公钥认证而不是密码连接主机.方法是附加你的公钥文件到远程主机.本例中我们用客户端产生的key从host-client连接到host-server.
1. 使用ssh-keygen生成密钥对.私钥放在~/.ssh/id_dsa,公钥在~/.ssh/id_dsa.pub.
2. 拷贝你的公钥到服务器的~/.ssh/authorized_keys2.
# ssh-keygen -t dsa -N ''
# cat ~/.ssh/id_dsa.pub | ssh you@host-server "cat - >> ~/.ssh/authorized_keys2"
使用来自ssh.com的Windows客户端
ssh.com的非商业性版本的客户端可下载自它主FTP站点:ftp.ssh.com/pub/ssh/.用ssh.com客户端产生的密钥需要在OpenSSH服务器上进行转换.可以使用ssh-keygen命令来完成.
1. 使用ssh.com客户端创建一对密钥:Settings - User Authentication - Generate New....
2. 我使用DSA密钥类型;密钥长度为2048.
3. 拷贝ssh.com客户端产生的公钥到服务器的~/.ssh目录.
4. 她的密钥对在C:\Documents and Settings\%USERNAME%\Application Data\SSH\UserKeys.
5. 在服务器上使用ssh-keygen转换公钥:
# cd ~/.ssh
# ssh-keygen -i -f keyfilename.pub >> authorized_keys2
注意:我们使用DSA密钥,使用RSA密钥也是可以的.这个密钥不受密码保护.
在Windows上使用Putty
Putty24是一个简单并且自由的(MIT许可)25 ssh Windows客户端.
1. 使用puTTYgen程序创建密钥对.
2. 保存密钥对(比如:C:\Documents and Settings\%USERNAME%\.ssh).
3. 拷贝公钥到服务器的~/.ssh目录:
# scp .ssh/puttykey.pub root@192.168.51.254:.ssh/
1. 使用 ssh-keygen 在 OpenSSH 服务器上转换这个公钥:
# cd ~/.ssh
# ssh-keygen -i -f puttykey.pub >> authorized_keys2
2. 在Putty中设置指向私钥的位置:Connection - SSH - Auth
5.2 检查指纹
在首次连接时,SSH会请求保存不知道的主机指纹.要避免中间人(man-in-the-middle)攻击,服务器的管理员可以发送密钥指纹给客户端,来让其在首次登陆时验证服务器的真实性.使用ssh-keygen -l获取服务器的指纹:
# ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub //RSA密钥
2048 61:33:be:9b:ae:6c:36:31:fd:83:98:b7:99:2d:9f:cd /etc/ssh/ssh_host_rsa_key.pub
# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub //DSA密钥(默认)
2048 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee /etc/ssh/ssh_host_dsa_key.pub
现在客户端在连接到服务器时可验证其服务器的真实性:
# ssh linda
The authenticity of host 'linda (192.168.16.54)' can't be established.
DSA key fingerprint is 14:4a:aa:d9:73:25:46:6d:0a:48:35:c7:f4:16:d4:ee.
Are you sure you want to continue connecting (yes/no)? yes
5.3 安全文件传输
一些简单的命令:
# scp file.txt host-two:/tmp
# scp joe@host-two:/www/*.html /www/tmp
# scp -r joe@host-two:/www /www/tmp
在Konqueror或Midnight控制台中,用地址fish://user@gate来访问远程文件系统是可行的,就是比较慢而已.
此外,也可以用基于SCP文件系统客户端的sshfs来挂载一个远程目录.看fuse sshfs26.
5.4 隧道(Tunneling)
SSH隧道可以让你通过SSH连接进行端口转发(转发/反向隧道),从而确保了传输及端口访问的安全.它只能工作在TCP协议上.通常端口转发命令如下(也可看ssh和NAT实例):
# ssh -L localport:desthost:destport user@gate //gate为目标主机网关
# ssh -R destport:desthost:localport user@gate //转发你的localport到目标端口
# ssh -X user@gate //转发X程序
这将会连接到gate并转发端口到目标主机desthost:destport.注意desthost为gate中的目标主机名.因此,如果连接到了gate,那么desthost就是localhost.也可以做更多的端口转发.在gate上直接转发假设我们想访问在gate上运行的CVS(2401端口)和HTTP(80端口).下面是个简单的例子,desthost就是localhost,我们使用本的端口8080代替80端口,所以我们不需要root权限.一旦sshsession打开,二个服务就都可在本地端口访问.
# ssh -L 2401:localhost:2401 -L 8080:localhost:80 user@gate
转发Netbios和远程桌面到第二个服务器
假设有一台在gate后面没有运行ssh的Winodws SMB服务器.我们需要访问SMB共享和远程桌面.
# ssh -L 139:smbserver:139 -L 3388:smbserver:3389 user@gate
现在这个SMB共享可以使用\\127.0.0.1\访问,但只能在本地共享关闭的情况下,因为本的共享也是在139端口监听的.
保持本的共享也是可行的,因此我们需要为这个通道使用新IP地址来新建一个虚拟设备,SMB共享将会使用此地址连接.此外,本地RDP已经在3389端口监听了,所以我们选择端口3388.对于这个例子,让我们使用一个虚拟IP地址10.1.1.1.
1. 对于Putty上使用源端口=10.1.1.1:139.它可以创建多重回路(multiple loop)设备和通道.在Windows2000上,只有Putty为我工作.
2. 对于ssh.com的客户端,要禁用"Allow local connections only".因为ssh.com客户端绑定了所有地址,所以只能连接单个共享.
现在用IP地址10.1.1.1 创建回路(loopback)接口:
1. #系统->控制面板->添加硬件#是,我已经连接了此硬件(Y)#添加新的硬件设备(在列表最下面).
2. #安装我手动选择的硬件#网络适配器#Microsoft,Microsoft Loopback Adapter.
3. 置这个假设备的IP地址为10.1.1.1,掩码255.255.255.0,没有网关.
4. 高级->WINS,开启LMHOSTS查询;禁用TCP/IP上的NetBIOS.
5. #启用Microsoft网络客户端.#禁用Microsoft网络文件和打印机共享
做完这些之后我有重启.现在用\\10.1.1.1连接SMB共享和用10.1.1.1:3388连接远程桌面.
调试
如果不能工作:
1. 端口有没有转发:运行控制台运行netstat -an命令并查看有没有0.0.0.0:139或者10.1.1.1:139
2. 有没有telnet到10.1.1.1 139?
3. 你需要打开"本地端口接受其他主机连接".
4. "Microsoft网络文件和打印机共享"有没有被禁用?
在NAT后面连接两个客户端
假设两个客户端在一个NAT网关后面,cliadmin客户端要连接到cliuser客户端(目的地),两者都可用ssh登录到正在运行sshd的gate上.你不需要root权限,只要端口大于1024即可.我们在gate上使用2022端口.而且,由于gate使用与本地,所以网关端口不是必须的.
开启cliuser客户端(从目标到gate):
# ssh -R 2022:localhost:22 user@gate //转发客户端22端口到gate:2022端口
开启cliadmin客户端(从主机到gate):
# ssh -L 3022:localhost:2022 admin@gate //转发客户端3022端口到gate:2022端口
现在admin可以直接连接cliuser客户端:
# ssh -p 3022 admin@localhost //local:3022->gate:2022->client:22
在NAT后面的VNC连接
假设一个在NAT后面,监听在端口5900上可被访问的Windows VNC客户端.
开启cliwin客户端到gate:
# ssh -R 15900:localhost:5900 user@gate
开启cliadmin客户端(从主机到gate):
# ssh -L 5900:localhost:15900 admin@gate
现在admin直接连接到VNC客户端:
# vncconnect -display :0 localhost
--转自