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