【Squid】内网集群访问外部网络资源
简介
在日常的科研工作中,我们经常需要登录学校的高性能计算集群(例如基于 Slurm 调度的集群)来提交大型计算任务。出于安全考虑,这些内网集群通常被严格限制,无法直接连接外部网络。这给我们在集群上使用wget获取测试数据、或者使用pip和conda配置环境带来了极大的不便。
如果你的个人 Windows 主机同时具备外网访问权限和校园网环境,我们可以利用 WSL(Windows Subsystem for Linux)中的 Ubuntu 系统运行 Squid 代理服务,并结合 SSH 的“反向端口转发”技术,将本机的网络安全、优雅地“借”给集群使用。
准备工作
在开始之前,请确保你的 Windows 电脑已经开启并安装了 WSL Ubuntu 子系统,并且你的电脑当前正处于能够连接到目标集群的校园网环境中。
WSL 端安装 Squid
首先,我们需要在本地的 WSL Ubuntu 中安装 Squid 代理服务器。打开你的 WSL 终端,更新软件源并进行安装:
sudo apt update sudo apt install squid -y图 1:在 WSL 终端中安装 Squid
安装完成后,Squid 默认会监听3128端口,并且默认允许来自localhost的请求。我们可以启动 Squid 服务并检查其运行状态:
sudo service squid start sudo service squid status图 2:检查 Squid 服务运行状态
确保看到服务正在运行(active),Squid 正在监听3128端口。
建立 SSH 反向隧道
这是整个方案的核心步骤。由于集群无法主动连接到我们隐藏在 Windows 防火墙和 Hyper-V 虚拟网络后的 WSL,我们需要通过 SSH 主动向集群发起连接,并建立一条稳定的反向隧道。
在WSL 终端中,运行以下命令(你可以根据实际情况替换账户名或端口号):
ssh -R 3128:127.0.0.1:3128 -p 76509 <your_username>@12.34.56.123 -N \ -o ServerAliveInterval=60 \ -o ServerAliveCountMax=3 \ -o TCPKeepAlive=yes图 3:建立稳定 SSH 反向隧道
这条命令的含义是:通过76509端口连接12.34.56.123集群,同时在集群端开放3128端口。集群上发往3128端口的所有网络请求,都会沿着这条加密的 SSH 隧道,原路返回到我们本地 WSL 的localhost:3128(即 Squid 服务)进行代理转发。
相比基础配置,这段命令加入了几个非常实用的进阶参数来保障隧道的稳定性:
-N:表示仅建立端口转发隧道,不打开远程终端执行命令。-o ServerAliveInterval=60等心跳包参数:每隔 60 秒与集群通讯一次,防止因网络长时间没有数据传输,被校园网防火墙或集群节点自动切断连接。
请注意:保持这个 SSH 终端窗口处于开启状态,代理隧道才会持续生效。因为使用了-N参数,按下回车后终端会处于“挂起”状态,不返回任何新的命令行提示符,这是完全正常的现象,说明隧道正在默默为你工作。此时你需要新开一个终端窗口来登录集群。
测试代理配置
现在,你已经通过上面的命令成功登录到了计算集群的终端。我们需要在集群的环境变量中声明代理,让 Linux 系统知道如何将流量导向本地的3128端口。
在集群终端中运行:
export http_proxy="http://127.0.0.1:3128" export https_proxy="http://127.0.0.1:3128"接下来,我们可以使用curl命令测试一下是否能够成功获取外部网站的响应头:
curl -I https://www.baidu.com图 4:测试集群代理连通性
如果终端返回了HTTP/2 200或相关的正常响应信息,而不是卡住或提示网络不可达,说明代理已经配置成功!现在你可以自由地在集群上拉取外部资源了。
进阶技巧:一键启动隧道与环境自动配置
为了进一步提高日常科研效率,我们可以在本地和集群两端分别做一些快捷配置,省去每次手动输入命令的繁琐。
1. 本地端(WSL):编写一键启动脚本
每次需要代理时都手动输入长串的 SSH 命令会显得有些繁琐。为了提高效率,我们可以在 WSL 中编写一个简单的 Shell 脚本,实现“一键启动服务 + 建立隧道”。
在你的 WSL 主目录下(例如~/),创建一个名为proxy.sh的文件:
nano ~/proxy.sh将以下内容粘贴到文件中(将<your_username>替换为你的集群账户名):
#!/bin/bash # 启动 Squid 服务 sudo systemctl start squid # 建立 SSH 反向隧道 ssh -R 3128:127.0.0.1:3128 -p 76509 <your_username>@12.34.56.123 -N \ -o ServerAliveInterval=60 \ -o ServerAliveCountMax=3 \ -o TCPKeepAlive=yes保存并退出(在 nano 中按Ctrl+O,回车确认,然后按Ctrl+X退出)。接着,赋予该脚本可执行权限:
chmod +x ~/proxy.sh如何使用:
以后每次你需要让集群联网时,只需打开 WSL 终端并运行:
./proxy.sh脚本会先提示你输入sudo密码以启动 Squid,随后立刻建立 SSH 隧道(可能会要求输入集群密码)。看到光标挂起时,就意味着隧道已经稳稳建立。
2. 集群端:环境变量自动配置
为了方便,我们可以将export命令添加到集群用户目录下的~/.bashrc文件末尾,这样每次登录集群后就无需重复配置代理环境变量了。
在集群终端中,使用编辑器打开.bashrc文件:
nano ~/.bashrc在文件的最底部,添加以下两行(同样,注意端口号要与你隧道开放的端口一致):
export http_proxy="http://127.0.0.1:3128" export https_proxy="http://127.0.0.1:3128"保存并退出。为了让配置立即生效,可以运行一次以下命令(或者重新登录集群):
source ~/.bashrc至此,只要你的 WSL 运行着./proxy.sh,你在集群上的所有网络操作(如wget数据、conda install依赖等)都会自动通过这条隐形的隧道无缝连接外网!
如果需要在特定的工具链(如 Git 或 Conda)中单独配置代理,可以查阅对应软件的官方代理设置文档,将代理地址同样指向http://127.0.0.1:3128即可。
