使用 SSH 建立 VPN

最后更新于:2022-04-01 22:43:24

自 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 必须是开启的。
';