华清校园网观察日志¶
LZJ楼的高性能服务器有非常严格的管理权限, 经常连不上网, 且自装VPN会被信息化中心警告(亲身经历)...

在不断的尝试与前人经验教训总结中, 发现以下几点有意思的 "bypass":
(1) 关闭 ipv6, 能解决大多数被"墙"的问题¶
观察:
比如, 笔者在安装conda时,
| Bash | |
|---|---|
1 2 3 4 5 6 7 8 9 10 | |
很明显是被"墙"了
一般来说解法是两种方式:
- 在服务器上登录校园网:
- 使用现成的认证脚本: 华清校内有很多开源的命令行登录工具 (tunet 登录脚本)
- 联系实验室管理员
- 使用"离线打包"大法:
- 完全不可持续发展, 极力不推荐!
但是还有更简单的处理方法: "把ipv6关了"!
| Bash | |
|---|---|
1 2 3 4 5 6 7 8 | |
在输出的结果中, 如果找不到带有 inet6 字样的行, 就说明 IPv6 已经被成功关闭了. 系统从现在起所有的网络请求都会强制走 IPv4 通道
此时就work了!
| Bash | |
|---|---|
1 2 3 4 5 6 7 | |
结果:
(1) IPv4 和 IPv6 的"待遇"不同: NAT vs. 公网直连
- IPv4 的情况 (白名单或已认证的 NAT):
- 机房里所有的 IPv4 流量都会先汇总到实验室的一台核心路由器/网关上, 然后再统一转换(NAT)发往公网
- 重点在于: 实验室的管理员很可能已经在这台核心路由器上登录了校园网账号, 或者向学校网络中心申请了这批 IPv4 IP 的"免认证白名单"
- 所以, 当服务器走 IPv4 通道时 (比如我们之前
ping baidu.com, 解析出来的是 IPv4 地址111.xx.xx.xx) , 校园网网关一看: "哦, 这是 X 实验室那个已经认证过的路由器发来的", 就直接放行了
- IPv6 的情况 (SLAAC 自动分配的野生公网 IP) :
- IPv6 的地址多到用不完 (CERNET2 提供了海量的 IPv6 资源)
- 因此, 机房通常不使用 NAT, 而是让交换机直接给每一台服务器的网卡分配一个全球唯一的公网 IPv6 地址
重点在于: 这个直接分配到我们机器上的 IPv6 地址, 在校园网的计费/认证网关看来, 是一个 "全新的、未经身份绑定的野生设备".既然我们没有主动使用这个 IPv6 地址去登录
auth6, 网关自然就会把它的网络权限锁死
(2) 现代软件特征: 优先使用 IPv6
现代的软件 (Python 的底层网络库、curl、Conda) 都有一个默认机制: 如果目标域名同时拥有 IPv4 和 IPv6 地址, 优先尝试连接 IPv6
华清大学的 TUNA 镜像站 (mirrors.tuna.tsinghua.edu.cn) 是一定同时具备双栈解析的
- 当 Conda 尝试去连接华清源时, 它发现有 IPv6, 于是开心地顺着您的 IPv6 网卡发起了请求
- 结果一出门, 就撞上了校园网的 IPv6 认证网关...
(2) Tmux 保护远程连接不被中断的原理¶
复习: Tmux 常用指令
-
tmux 三个层级:
- Session: 一个独立的工作空间. 可以为不同的项目创建不同的会话
- Window: 一个会话里可以有多个窗口, 占据整个屏幕
- Pane: Window 内的分屏
-
tmux 常用指令: 只聚焦 Session 管理
- 新建会话:
tmux new -s <NAME> - 进入会话:
tmux attach -t <NAME> - 退出会话:
ctrl+b + d - kill指定会话:
tmux kill-session -t <NAME> - kill所有会话:
tmux kill-session
- 新建会话:
tmux 中的<super>键
在 tmux 的世界里:
对于快捷键, 都需要先按一个"前缀键"(Prefix), 叫 ctrl+b + <???>
操作: 先同时按下 Ctrl 和 b, 松开, 然后再按后面的功能键
ctrl+b + d: 分离会话, detach- 断开当前会话, 将其放回后台运行, 让用户回到普通的终端界面
ctrl+b + [: 进入复制/滚动模式- 默认情况下, 在 tmux 里用鼠标滚轮无法翻看之前的历史输出
- 可以用键盘的"上下方向键"看了, 看完后记得用
q退出该模式
ctrl+b + :: 进入CLI模式- 按下这个组合键后, 可以发现底部从绿色变成黄色
- 常用操作: 上下滚动查看历史日志
- 指令:
set -g mouse on - 看完后记得用
q退出该模式
复习: TTY 和 PTY
[1] TTY (Teletypewriter): 真正的物理终端
在现代 Linux 系统中,TTY 指的是"物理终端"
走进机房, 拿一把真实的键盘和一个真实的显示器, 直接插在这台服务器的主板上, 此时你面对的就是一个真正的 TTY
系统里的程序会认为: "哦, 有个真人正在通过硬件直接给我发指令"
[2] PTY (Pseudo-Terminal): 用软件伪造的"假终端"
时代变了! 现在我们都是用笔记本电脑, 通过互联网, SSH远程连接服务器
问题来了: 服务器上根本没有插着你这把键盘,也没有连着我们的屏幕.但是,Linux 系统里的各种程序 (比如 bash、vim、top) 都非常"死板", 它们在设计之初就认定: "我只和 TTY 硬件打交道,我只接收来自硬件的键盘输入,只把画面输出给硬件屏幕"
PTY 的诞生:
为了骗过这些死板的程序, 操作系统发明了 PTY (Pseudo-Terminal)
PTY 是一个纯软件模拟出来的虚拟设备
- 对内 (欺骗程序):
- PTY 假装自己是一个硬件 TTY
- bash 在里面快乐地运行, 以为自己"掌控"着真实的硬件
- 对外 (连接网络/软件):
- PTY 的另一头连接着像 SSH 服务端、或者图形界面的终端模拟器 (如:
iTerm2,kitty) - 这就是为什么
iTerm2之类的都叫 "终端模拟器" (Terminal)
- PTY 的另一头连接着像 SSH 服务端、或者图形界面的终端模拟器 (如:
结论: 把 TTY/PTY 带入 tmux 的防断网场景

(1) 不用 tmux 时的 SSH 连接:
- 你通过 SSH 连上服务器
- 服务器的 SSH 程序向系统申请: "快,给我生成一个 PTY"
- SSH 把你的网络连接, 和这个 PTY 绑在一起! 然后在这个 PTY 里面启动一个 Shell
- 断网时:
- 网络一断,SSH 程序就知道你走人了.它会立刻销毁这个 PTY
- PTY 一销毁,系统就发
SIGHUP信号,把PTY 里面运行的所有程序全部干掉
(2) 使用 tmux 时的魔法:
- 你依然通过 SSH 连上服务器,依然拥有一个 SSH 给你的 PTY(我们叫它 PTY-1)
- 你在 PTY-1 里输入 tmux 命令
- 关键来了: 后台的 tmux Server 启动后,它会绕过 SSH,自己向操作系统申请全新的虚拟 PTY(如 PTY-A)
- tmux Server 把你的代码、脚本统统放进这些它自己申请的 PTY-A 里面运行
- 前台的 tmux Client 只是在 PTY-1 和 PTY-A 之间搬运画面
- 断网时: 网络断开,SSH 依然会无情地销毁 PTY-1(前台的 tmux Client 也同样关闭)
- 为什么任务没死?
- 因为你的任务运行在 PTY-A 里面!
- 而 PTY-A 是由后台的 tmux Server 掌握的,和 SSH 毫无关系!
- 只要服务器不断电,tmux Server 不关,PTY-A 就一直存在,里面的程序就以为自己仍然坐在一个永不断电的显示器前,继续默默工作
(3) 如何给服务器翻🧱¶
参考: 曾经的笔记