Unix Toolbox

 主页   资讯   文章   代码   电子书 

自 4.3 版开始,OpenSSH 可以使用 tun/tap 译注: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@hserver
srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252   # 在服务端 shell 上执行

FreeBSD上的服务端

cli># ssh -w5:5 root@hserver
srv># 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@gateB
gateB># 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                # 看 NAT
gateA># 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 必须是开启的。