Unix Toolbox

 主页   资讯   文章   代码   电子书 

Public key authentication

使用公钥认证而不是密码连接主机。方法是附加你的公钥文件到远程主机。本例中我们用客户端产生的 key 从_host-client_连接到host-server

  • 使用 ssh-keygen 生成密钥对。私钥放在 ~/.ssh/id_dsa,公钥在 ~/.ssh/id_dsa.pub
  • 拷贝你的公钥到服务器的 ~/.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 命令来完成。

  • 使用 ssh.com 客户端创建一对密钥:Settings - User Authentication - Generate New....
  • 我使用 DSA 密钥类型;密钥长度为 2048。
  • 拷贝 ssh.com 客户端产生的公钥到服务器的 ~/.ssh 目录。
  • 她的密钥对在 C:\Documents and Settings\%USERNAME%\Application Data\SSH\UserKeys。
  • 在服务器上使用 ssh-keygen 转换公钥:
# cd ~/.ssh
# ssh-keygen -i -f keyfilename.pub >> authorized_keys2

注意: 我们使用 DSA 密钥,使用 RSA 密钥也是可以的。这个密钥不受密码保护。

在 Windows 上使用 Putty

Puttyhttp://www.chiark.greenend.org.uk/~sgtatham/putty/download.html 是一个简单并且自由的(MIT许可)译注:free 不单单是免费 ssh Windows 客户端。

  • 使用 puTTYgen 程序创建密钥对。
  • 保存密钥对(比如:C:\Documents and Settings\%USERNAME%.ssh).
  • 拷贝公钥到服务器的 ~/.ssh 目录:
# scp .ssh/puttykey.pub root@192.168.51.254:.ssh/
  • 使用 ssh-keygen 在 OpenSSH 服务器上转换这个公钥:
# cd ~/.ssh
# ssh-keygen -i -f puttykey.pub >> authorized_keys2
  • 在 Putty 中设置指向私钥的位置:Connection - SSH - Auth

检查指纹

在首次连接时,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

安全文件传输

一些简单的命令:

# 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 sshfshttp://fuse.sourceforge.net/sshfs.html.

隧道(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 权限。一旦 ssh session 打开,二个服务就都可在本地端口访问。

# 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。

  • 对于 Putty 上使用源端口=10.1.1.1:139。它可以创建多重回路(multiple loop)设备和通道。在 Windows 2000 上,只有 Putty 为我工作。
  • 对于 ssh.com 的客户端,要禁用 "Allow local connections only"。因为 ssh.com 客户端绑定了所有地址,所以只能连接单个共享。

现在用 IP 地址 10.1.1.1 创建回路(loopback)接口:

  • 系统->控制面板->添加硬件 # 是,我已经连接了此硬件(Y) # 添加新的硬件设备(在列表最下面)。

  • 安装我手动选择的硬件 # 网络适配器 # Microsoft , Microsoft Loopback Adapter。

  • 配置这个假设备的 IP 地址为 10.1.1.1,掩码 255.255.255.0,没有网关。
  • 高级->WINS,开启 LMHOSTS 查询;禁用 TCP/IP 上的 NetBIOS。
  • 启用 Microsoft 网络客户端。# 禁用 Microsoft 网络文件和打印机共享

做完这些之后我有重启。现在用 \10.1.1.1 连接 SMB 共享和用 10.1.1.1:3388 连接远程桌面。

调试

如果不能工作:

  • 端口有没有转发:运行控制台运行 netstat -an 命令并查看有没有 0.0.0.0:139 或者 10.1.1.1:139
  • 有没有 telnet 到 10.1.1.1 139?
  • 你需要打开 "本地端口接受其他主机连接"。
  • "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