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