💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 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/](http://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 [Putty](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) 是一个简单并且自由的(MIT许可) 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 sshfs](http://fuse.sourceforge.net/sshfs.html). ## 隧道(Tunneling) SSH 隧道可以让你通过 SSH 连接进行端口转发(转发/反向隧道),从而确保了传输及端口访问的安全。它只能工作在 TCP 协议上。通常端口转发命令如下(也可看 [ssh 和 NAT 实例](http://cb.vu/unixtoolbox_zh_CN.xhtml#sshnat)): # 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