使用 SSH 建立 VPN
自 4.3 版开始,OpenSSH 可以使用 tun/tap译注:tun 为虚拟点对点设备,tap 为虚拟以太网设备。
设备来加密一个隧道。其非常类似于基于 TLS 的 VPN 解决方案(像 OpenVPN)。对于 SSH
的一个优势是,她不需要安装和配置额外的软件。另外隧道使用 SSH 认证(像共享密钥)。
其缺点是,对于一个缓慢的连接, 其传输效率较低。并且这个隧道依赖于单个(易断的) TCP 链接。这个技术对于快速设置一个基于 IP 的 VPN
来说非常有用。她对于用单个 TCP 端口转发没有限制,并且在所有 3/4 层 协议像 ICMP、TCP/UDP
等上都可用。不管怎么样,下面这些选择在 sshd_conf 文件中是必须的:
设备来加密一个隧道。其非常类似于基于 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 必须是开启的。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/59162.html