自 4.3 版開始,OpenSSH 可以使用 tun/tap?設備來加密一個隧道。其非常類似于基于 TLS 的 VPN 解決方案(像 OpenVPN)。對于 SSH 的一個優勢是,她不需要安裝和配置額外的軟件。另外隧道使用 SSH 認證(像共享密鑰)。 其缺點是,對于一個緩慢的連接, 其傳輸效率較低。并且這個隧道依賴于單個(易斷的) TCP 鏈接。這個技術對于快速設置一個基于 IP 的 VPN 來說非常有用。她對于用單個 TCP 端口轉發沒有限制,并且在所有 3/4 層 協議像 ICMP、TCP/UDP 等上都可用。不管怎么樣,下面這些選擇在 sshd_conf 文件中是必須的:
PermitRootLogin?yes
PermitTunnel?yes
## 單個 P2P 連接
這里,我們用點對點隧道連接 hclient 和 hserver 兩個主機。這個連接是_從 hclient 開始_到 hserver 的,并且是用 root 來做。這個通道的連接點是 10.0.1.1(服務端)和 10.0.1.2(客戶端),然后我們創建設備 tun5(當然也可以是其它數字)。這個過程非常簡單:
-
使用 SSH 的通道選項 -w 來連接
-
設置隧道的 IP 地址。服務端和客戶端各一次。
## 連接到服務端
連接始于客戶端,然后再服務端執行命令。
### Linux上的服務端
cli>#?ssh?-w5:5?
root@hserversrv>#?ifconfig?tun5?10.0.1.1?netmask?255.255.255.252???#?在服務端?shell?上執行
### FreeBSD上的服務端
cli>#?ssh?-w5:5?root@hserversrv>#?ifconfig?tun5?10.0.1.1?10.0.1.2??????????????????#?在服務端?shell?上執行
## 連接到客戶端
在客戶端上執行命令:
cli>#?ifconfig?tun5?10.0.1.2?netmask?255.255.255.252???#?Linux上的客戶端
cli>#?ifconfig?tun5?10.0.1.2?10.0.1.1??????????????????#?FreeBSD上的客戶端
現在兩個主機都連上了,并且可以在任何 3/4 層協議上使用此通道 IP 地址透明的通訊。
## 連接兩個網絡
除上面的 p2p 設置外,一個更有用的是SSH VPN 用兩個 gate 連接兩個私有網絡。假設有這樣一個例子,netA 為 192.168.51.0/24 還有 netB 為 192.168.16.0/24。設置過程同上面相似,我們只需要添加 routing。如果 gate 不同于默認網關,那在私有網絡接口上必須開啟 NAT。
192.168.51.0/24 (netA)|gateA <-> gateB|192.168.16.0/24 (netB)
-
使用隧道選項 -w 連接 SSH。
-
配置隧道的 IP 地址。服務端和客戶端各一次。
-
為兩個網絡添加 routing。
-
如果需要,在 gate 的私有網絡接口上開啟 NAT。
設置是_從 netA 中的 gasteA 開始的_.
## 連接 gateA 到 gateB
連接從 gateA 開始,命令執行于 gateB。
### Linux 上的 gateB
gateA>#?ssh?-w5:5?
root@gateBgateB>#?ifconfig?tun5?10.0.1.1?netmask?255.255.255.252?#?在?gateB?的?shell?中執行
gateB>#?route?add?-net?192.168.51.0?netmask?255.255.255.0?dev?tun5
gateB>#?echo?1?>?/proc/sys/net/ipv4/ip_forward?????????#?如果不是默認網關
gateB>#?iptables?-t?nat?-A?POSTROUTING?-o?eth0?-j?MASQUERADE
### FreeBSD 上的 gateB
gateA>#?ssh?-w5:5?root@gateB??????????????????????????#?創建?tun5?設備
gateB>#?ifconfig?tun5?10.0.1.1?10.0.1.2???????????????#?在?gateB?的?shell?中執行
gateB>#?route?add?192.168.51.0/24?10.0.1.2
gateB>#?sysctl?net.inet.ip.forwarding=1???????????????#?如果不是默認網關
gateB>#?natd?-s?-m?-u?-dynamic?-n?fxp0????????????????#?看?NATgateA>#?sysctl?net.inet.ip.fw.enable=1
## 配置 gateA
在 gateA 上執行命令:
### Linux 上的 gateA
gateA>#?ifconfig?tun5?10.0.1.2?netmask?255.255.255.252
gateA>#?route?add?-net?192.168.16.0?netmask?255.255.255.0?dev?tun5
gateA>#?echo?1?>?/proc/sys/net/ipv4/ip_forward
gateA>#?iptables?-t?nat?-A?POSTROUTING?-o?eth0?-j?MASQUERADE
### FreeBSD 上的 gateA
gateA>#?ifconfig?tun5?10.0.1.2?10.0.1.1
gateA>#?route?add?192.168.16.0/24?10.0.1.2
gateA>#?sysctl?net.inet.ip.forwarding=1
gateA>#?natd?-s?-m?-u?-dynamic?-n?fxp0????????????????#?看?NAT
gateA>#?sysctl?net.inet.ip.fw.enable=1
現在兩個私有網絡都可以通過 SSH VPN 來透明的連接。如果 gate 不是默認網關,那么 IP 轉發和 NAT 設置都是必須的。在這種情況下,客戶端將不知道在哪里轉發響應(response),并且 NAT 必須是開啟的。