若已有两台机器 A 和 B 的 root 权限,并且两台机器之间能够建立 ssh 连接(tcp 端口 22 是开放、互通的),那么我们希望能够让 ssh 帮我们把其中一台机器的 IP Packet 嵌进 A 与 B 的 ssh 数据流中,并且放到另外一台机器上才开始转发,也就是说利用 ssh 连接作为一个 IP 隧道。我们在本文讲解具体如何实现。
/etc/ssh/sshd_config
配置文件;/etc/ssh/sshd_config
. 将 PermitTunnel 选项设为 yes, 登录 A, 也将 PermitTunnel 设为 yes; 运行 systemctl restart sshd
使新的配置生效;sudo ip tuntap add mode tun tun0
;sudo ip link set tun0 up
;sudo ssh -F /home/ubuntu/.ssh/config -vNT -w 0:0 peer
这里假设 peer 已经保存在了 ssh 的用户配置文件中,0:0 对应两台机器上 tun 网卡的名称 tun0 和 tun0;
我们主要是利用了 ssh 命令行工具通过 -w
参数提供的功能,以及 Linux 内核提供的 tun 网络虚拟设备功能,具体来说,当运行那一行 ssh 命令时,ssh 程序会打开 (open) tun0 网络设备,对它进行配置,使得它能够将收到的 IP Packet 进行合理的封装并交由 ssh 发送。
192.168.0.0/24 这个子网是这两台机器所处的实际环境所没有的,我们通过建立虚拟网卡,并且为虚拟网卡分配网络地址,人为地将这个子网虚拟了出来,而这对虚拟网卡所依据的仍然是 encapculation, 也就是将一个 packet 塞进另一个 packet 中进行发送的这种处理方式,可见 encapsulation 过程本身就代表了一系列很强大的网络虚拟化技术(包括 IPIP, GRE, VLAN 和 VXLAN 等)。
透过这个由 ssh 建立的 tunnel, 可以使得两台机器具备交换 UDP 数据包的能力,即使它们本来所处的环境不允许他们之间这么做。