【Squid】内网集群访问外部网络资源

张开发
2026/5/1 3:48:17 15 分钟阅读

分享文章

【Squid】内网集群访问外部网络资源
简介在日常的科研工作中我们经常需要登录学校的高性能计算集群例如基于 Slurm 调度的集群来提交大型计算任务。出于安全考虑这些内网集群通常被严格限制无法直接连接外部网络。这给我们在集群上使用wget获取测试数据、或者使用pip和conda配置环境带来了极大的不便。如果你的个人 Windows 主机同时具备外网访问权限和校园网环境我们可以利用 WSLWindows 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 服务运行状态确保看到服务正在运行activeSquid 正在监听3128端口。建立 SSH 反向隧道这是整个方案的核心步骤。由于集群无法主动连接到我们隐藏在 Windows 防火墙和 Hyper-V 虚拟网络后的 WSL我们需要通过 SSH 主动向集群发起连接并建立一条稳定的反向隧道。在WSL 终端中运行以下命令你可以根据实际情况替换账户名或端口号ssh -R 3128:127.0.0.1:3128 -p 76509 your_username12.34.56.123 -N \ -o ServerAliveInterval60 \ -o ServerAliveCountMax3 \ -o TCPKeepAliveyes图 3建立稳定 SSH 反向隧道这条命令的含义是通过76509端口连接12.34.56.123集群同时在集群端开放3128端口。集群上发往3128端口的所有网络请求都会沿着这条加密的 SSH 隧道原路返回到我们本地 WSL 的localhost:3128即 Squid 服务进行代理转发。相比基础配置这段命令加入了几个非常实用的进阶参数来保障隧道的稳定性-N表示仅建立端口转发隧道不打开远程终端执行命令。-o ServerAliveInterval60等心跳包参数每隔 60 秒与集群通讯一次防止因网络长时间没有数据传输被校园网防火墙或集群节点自动切断连接。请注意保持这个 SSH 终端窗口处于开启状态代理隧道才会持续生效。因为使用了-N参数按下回车后终端会处于“挂起”状态不返回任何新的命令行提示符这是完全正常的现象说明隧道正在默默为你工作。此时你需要新开一个终端窗口来登录集群。测试代理配置现在你已经通过上面的命令成功登录到了计算集群的终端。我们需要在集群的环境变量中声明代理让 Linux 系统知道如何将流量导向本地的3128端口。在集群终端中运行export http_proxyhttp://127.0.0.1:3128 export https_proxyhttp://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_username12.34.56.123 -N \ -o ServerAliveInterval60 \ -o ServerAliveCountMax3 \ -o TCPKeepAliveyes保存并退出在 nano 中按CtrlO回车确认然后按CtrlX退出。接着赋予该脚本可执行权限chmod x ~/proxy.sh如何使用以后每次你需要让集群联网时只需打开 WSL 终端并运行./proxy.sh脚本会先提示你输入sudo密码以启动 Squid随后立刻建立 SSH 隧道可能会要求输入集群密码。看到光标挂起时就意味着隧道已经稳稳建立。2. 集群端环境变量自动配置为了方便我们可以将export命令添加到集群用户目录下的~/.bashrc文件末尾这样每次登录集群后就无需重复配置代理环境变量了。在集群终端中使用编辑器打开.bashrc文件nano ~/.bashrc在文件的最底部添加以下两行同样注意端口号要与你隧道开放的端口一致export http_proxyhttp://127.0.0.1:3128 export https_proxyhttp://127.0.0.1:3128保存并退出。为了让配置立即生效可以运行一次以下命令或者重新登录集群source ~/.bashrc至此只要你的 WSL 运行着./proxy.sh你在集群上的所有网络操作如wget数据、conda install依赖等都会自动通过这条隐形的隧道无缝连接外网如果需要在特定的工具链如 Git 或 Conda中单独配置代理可以查阅对应软件的官方代理设置文档将代理地址同样指向http://127.0.0.1:3128即可。

更多文章