通过隧道的互联网连接之小记
前言
现有一台用于高性能计算的GPU服务器,因相关管理限制,无法直接访问互联网。但是,我们需要在服务器上进行一些需要访问互联网的操作,例如下载数据集、安装软件包等。因此,我们需要一种方法,使服务器能够访问互联网。
此博客文章用于记录实现该需求的具体方法,以及过程中遇到的问题和解决方案。
基本思路
服务器限制只可访问校内网络,因此基本的思路是,在校内运行一台服务器,该服务器可以访问互联网,而后在其与GPU服务器之间建立一条隧道,通过隧道实现GPU服务器访问互联网。
该思路本身没有什么问题,但在实操中会遇见大量问题。本文将详细记录实现该思路的具体步骤。
具体步骤
使用到的工具
使用wireguard
建立隧道,自建的PowerDNS
服务器作为域名的权威名称服务器并支撑DDNS。以及若干自己写的脚本。
隧道建立
两台服务器上安装wireguard
。校内用于转发的服务器,配置DDNS,将其IP解析到一个域名上。两台服务器参考官方文档配置wireguard
,并在用于转发的服务器的上级路由器配置静态路由将GPU服务器的隧道IP指向用于转发的服务器的内网IP。由于IP变换十分不频繁,因此不对GPU服务器上Wireguard
进行定期重启。(跑不了了再手动重启)
路由配置
上一步配置结束后,GPU服务器可以访问校内服务器,且校内服务器已开启转发,NAT由路由器进行,因此GPU服务器经过适当的路由配置后可访问互联网的IP。经测试实际确实如此。但默认路由仍需进行配置。
配置默认路由很简单,指令如下:
ip route add default via <tunnel_ip> dev <interface>
但是直接运行会遇到报错:
RTNETLINK answers: File exists
这是因为默认路由已经存在,需要先删除原有的默认路由,再添加新的默认路由。
ip route del default via <old_gateway> dev <old_interface>
此时按下回车,会发现SSH连接已经卡死,因为默认路由被删除后,不存在到客户端的路由,因此SSH连接断开。此时您需要使用IPMI或者KVM等方式重新连接服务器,再次将原先的默认路由添加回来。
那怎么办
仔细分析我们的需求,可以发现我们只需让访问校内IP的路由仍走原先物理接口及网关,其余的路由走隧道即可。因此,我们可以对所有校内前缀先添加路由,再删除原先的默认路由,最后添加新的默认路由。
此时问题的关键变为了,如何找到所有的校内路由。西安交通大学作为CERNET的节点校,显然其拥有自己的ASN,因此可以通过查询相关网站的方式找到其宣告的前缀。但是该方法过于繁杂。好在,GPU服务器的连接方式为通过校内下发给个人的OpenVPN连接,OpenVPN服务器又恰好下发了校内服务IP的路由,因此通过在运行OpenVPN的客户端机器上查看路由表(Windows: netsh interface ipv4 show route
,Linux: ip route show
)即可找到所有校内IP的路由。再之后便是通过正则表达式魔法将其变为添加路由的脚本。再在其之后加入重新指定默认路由的指令即可。
结语
上述配置经实践表现良好,可以满足目前访问互联网的需求,但是仍然需要人工干预。同时通过手写且硬编码的方式添加路由不够优雅,也许可以通过BGP的方式自动化路由的添加。但是由于相关配置的时间成本与其带来的收益不相符合,因此目前未使用。排障采取人工方式,因未配置路由表持久化,重启后需人工重新运行脚本配置,但也保证了重启后网络恢复默认状态不会使得无法连接。