惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
V
Vulnerabilities – Threatpost
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
SecWiki News
SecWiki News
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
B
Blog
TaoSecurity Blog
TaoSecurity Blog
The Last Watchdog
The Last Watchdog
H
Hacker News: Front Page
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园_首页
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Y
Y Combinator Blog
W
WeLiveSecurity
N
News and Events Feed by Topic
F
Fortinet All Blogs
PCI Perspectives
PCI Perspectives
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Recent Announcements
Recent Announcements
Forbes - Security
Forbes - Security
T
Tailwind CSS Blog
Hacker News: Ask HN
Hacker News: Ask HN
爱范儿
爱范儿
腾讯CDC
Last Week in AI
Last Week in AI
月光博客
月光博客
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
Help Net Security
Help Net Security
V
V2EX
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
H
Heimdal Security Blog
L
LINUX DO - 最新话题
GbyAI
GbyAI
The Hacker News
The Hacker News
罗磊的独立博客
S
SegmentFault 最新的问题
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 【当耐特】
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
O
OpenAI News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

Zhullyb's Blog

Nuxt SSG 博客的尾斜杠到底怎么加? | 竹林里有冰的博客 小米 Xiaomi Book Pro 14 (Ultra X7) Linux 兼容性实测 | 竹林里有冰的博客 国内(大陆)版小米 FCM 熄屏断连:Rootless 环境下的尝试与可能的解决方案 | 竹林里有冰的博客 我没法访问 dl.google.com —— 记一次 TUN 下的网络 debug | 竹林里有冰的博客 Vercel 的缓存控制,你注意过吗? | 竹林里有冰的博客 小记 —— Caddy 在 Layer 4 上的流量代理实践 | 竹林里有冰的博客 你的域名后缀拖慢你的网站速度了嘛?——再谈 DNS 冷启动 | 竹林里有冰的博客 DNS 冷启动:小型站点的“西西弗斯之石” | 竹林里有冰的博客 HTTP/2 Server Push 已事实性“死亡”,我很怀念它 | 竹林里有冰的博客 Nuxt Content v3 中数组字段的筛选困境与性能优化 | 竹林里有冰的博客 后 OCSP 时代,浏览器如何应对证书吊销新挑战 | 竹林里有冰的博客 初试 Github Action Self-hosted Runner,想说爱你不容易 | 竹林里有冰的博客 DNS 解析延迟毁了我的图床优化 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(下):告别 DOM 操作,拥抱 AST 与函数式渲染 | 竹林里有冰的博客 Vue Markdown 渲染优化实战(上):从暴力刷新、分块更新到 Morphdom 的华丽变身 | 竹林里有冰的博客 node-sass 迁移至 dart-sass 踩坑实录 | 竹林里有冰的博客 前端中的量子力学——一打开 F12 就消失的 Bug | 竹林里有冰的博客 2025 年,如何为 web 页面上展示的视频选择合适的压缩算法? | 竹林里有冰的博客 el-image 和 el-table 怎么就打架了?Stacking Context 是什么? | 竹林里有冰的博客 2025年,前端如何使用 JS 将文本复制到剪切板? | 竹林里有冰的博客 Cudy TR3000 吃鹅(daed)记 | 竹林里有冰的博客 使用 Cloudflare Workers 监控 Fedora Copr 构建状态 | 竹林里有冰的博客
ssh 拯救世界——通过 ssh 隧道在内网服务器执行 APT 更新 | 竹林里有冰的博客
竹林里有冰 · 2025-03-30 · via Zhullyb's Blog

事情的起因是因为精弘的前技术总监抱怨学校的内网服务器无法连接外网,从而导致 apt 安装与更新异常困难,需要手动从源中下载软件包、软件包的依赖及其依赖的依赖。。。然后将这些包通过 sftp/rsync 一类的手段传到服务器上手动安装。

于是本文应运而生,我们可以在本机使用 Caddy (Nginx 当然也行)反代一个 APT 源镜像站,通过 ssh 隧道建立端口转发,这样就可以在内网服务器上访问到本地的 Caddy 服务器,进而访问到外网的镜像站。

前提条件#

  • 主控机(你自己的电脑)能够通过 ssh 直接连接电脑(可以是使用一些网络工具),而不是先通过 ssh 登陆到一台中转机,再从中转机登陆到目标服务器。后面这种情况当然也可以使用类似的手段实现我们的目标,但会更复杂一些。
  • 主控机(你自己的电脑)在连接内网服务器的同时,能够连接公网镜像站(不行的话要不然你提前本地同步一份镜像做离线镜像站)。

反代镜像站#

我这里选择了 Caddy 而非 Nginx,一方面是 Caddy 的配置文件写起来简单,另一方面 Caddy 是 Golang 编写,一个二进制走天下,Windows 也能直接下载运行。

我们以最常见的清华 tuna 镜像站为例,一个简单的 caddy 配置文件是这样的

:8080 {
    reverse_proxy https://mirrors.tuna.tsinghua.edu.cn {
        header_up Host {http.reverse_proxy.upstream.hostport}
    }
}

将上面这段代码保存为 Caddyfile 文件名,随后使用 caddy 命令在保存路径运行

caddy run --config ./Caddyfile

如果没有报错,那你应该能在本地的 8080 端口看到清华的镜像站

你可能注意到,反代后的页面和清华的镜像站有些许差异,没有清华的 logo,这大概是因为页面的 js 对 host 进行了判断,如果不是清华或者北外的页面,就不会添加学校的名称,但这不影响我们从这些镜像站获取更新。

建立隧道时,需要使用如下的命令

ssh -R 8085:localhost:8080 root@remote.example.com

-R 表示建立反向隧道,其他的参数选项可以参考这一篇博客「SSH 隧道技术」,也是精弘的学长写的。

此时,我们建立了一个内网服务器 8085 端口到本机 8080 端口的 ssh 端口转发。(使用 8085 端口是我为了区分其和 8080 端口,实际上可以使用任何空余端口)

我们可以在服务器上使用 curl 来测试一下是否能够正常访问,我这里简单访问了下 Debian 源根目录下的一个 README 文件。

curl http://localhost:8085/debian/README

换源#

所以现在我们在内网服务器的 8085 端口上有一个清华开源镜像站的反代,我们可以通过 8085 端口访问镜像站中的所有内容。

先遵循清华开源镜像站的指示,进行换源,记得一定要勾选「强制安全更新使用镜像」

随后,我们将源中的所有 https://mirrors.tuna.tsinghua.edu.cn 替换成 http://localhost:8085

sed -i 's|https\?://mirrors\.tuna\.tsinghua\.edu\.cn|http://localhost:8085|g' `grep -rlE 'http(s)?://mirrors\.tuna\.tsinghua\.edu\.cn' /etc/apt/`

执行 apt update执行 apt update

使用 apt 安装 unzip使用 apt 安装 unzip

可以看到,我们通过 ssh 隧道实现了在内网服务器执行 APT 更新及安装软件。

温馨提示,ssh 隧道在本世纪 10 年代初经常被用来进行搭建一些跨境访问,但因为其独特的流量特征很快淡出了历史舞台,因此不要使用 ssh 进行大量的跨境网络传输,容易被封禁。

当然,实现这一目标的方法是很多的,其他一些例如 frp 的工具同样能做到这种效果,只不过 ssh 隧道这种方案随开随用,随关随停,不需要更多的配置,因此我主要推荐。