跳转至

华清校园网观察日志

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

alt text

在不断的尝试与前人经验教训总结中, 发现以下几点有意思的 "bypass":

(1) 关闭 ipv6, 能解决大多数被"墙"的问题

观察:

比如, 笔者在安装conda时,

Bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
bxhu@ubuntu ~ [1]> curl -s http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64/repodata.json | head -n 20

<html>
<head>
<script type="text/javascript">location.href="http://auth6.tsinghua.edu.cn/index_169.html"</script>
</head>
<body>
Authentication is required. Click <a href="http://auth6.tsinghua.edu.cn/index_169.html">here</a> to open the authentication page.
</body>
</html>

很明显是被"墙"了

一般来说解法是两种方式:

  1. 在服务器上登录校园网:
    • 使用现成的认证脚本: 华清校内有很多开源的命令行登录工具 (tunet 登录脚本)
    • 联系实验室管理员
  2. 使用"离线打包"大法:
    • 完全不可持续发展, 极力不推荐!

但是还有更简单的处理方法: "把ipv6关了"!

Bash
1
2
3
4
5
6
7
8
# Step 1: Update conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
# Step 2: Reload and apply
sysctl -p
# Step 3: Check
ip a

在输出的结果中, 如果找不到带有 inet6 字样的行, 就说明 IPv6 已经被成功关闭了. 系统从现在起所有的网络请求都会强制走 IPv4 通道

此时就work了!

Bash
1
2
3
4
5
6
7
bxhu@ubuntu ~> conda create -n sat-env python=3.10 -c http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ --override-channels

Channels:
 - http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: done

结果:

(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 常用指令

  1. tmux 三个层级:

    • Session: 一个独立的工作空间. 可以为不同的项目创建不同的会话
    • Window: 一个会话里可以有多个窗口, 占据整个屏幕
    • Pane: Window 内的分屏
  2. 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, 松开, 然后再按后面的功能键

  1. ctrl+b + d: 分离会话, detach
    • 断开当前会话, 将其放回后台运行, 让用户回到普通的终端界面
  2. ctrl+b + [: 进入复制/滚动模式
    • 默认情况下, 在 tmux 里用鼠标滚轮无法翻看之前的历史输出
    • 可以用键盘的"上下方向键"看了, 看完后记得用q退出该模式
  3. 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)

结论: 把 TTY/PTY 带入 tmux 的防断网场景

alt text

(1) 不用 tmux 时的 SSH 连接:

  1. 你通过 SSH 连上服务器
  2. 服务器的 SSH 程序向系统申请: "快,给我生成一个 PTY"
  3. SSH 把你的网络连接, 和这个 PTY 绑在一起! 然后在这个 PTY 里面启动一个 Shell
  4. 断网时:
    • 网络一断,SSH 程序就知道你走人了.它会立刻销毁这个 PTY
    • PTY 一销毁,系统就发 SIGHUP 信号,把PTY 里面运行的所有程序全部干掉

(2) 使用 tmux 时的魔法:

  1. 你依然通过 SSH 连上服务器,依然拥有一个 SSH 给你的 PTY(我们叫它 PTY-1)
  2. 你在 PTY-1 里输入 tmux 命令
  3. 关键来了: 后台的 tmux Server 启动后,它会绕过 SSH,自己向操作系统申请全新的虚拟 PTY(如 PTY-A)
  4. tmux Server 把你的代码、脚本统统放进这些它自己申请的 PTY-A 里面运行
  5. 前台的 tmux Client 只是在 PTY-1 和 PTY-A 之间搬运画面
  6. 断网时: 网络断开,SSH 依然会无情地销毁 PTY-1(前台的 tmux Client 也同样关闭)
  7. 为什么任务没死?
    • 因为你的任务运行在 PTY-A 里面!
    • 而 PTY-A 是由后台的 tmux Server 掌握的,和 SSH 毫无关系!
    • 只要服务器不断电,tmux Server 不关,PTY-A 就一直存在,里面的程序就以为自己仍然坐在一个永不断电的显示器前,继续默默工作

(3) 如何给服务器翻🧱

参考: 曾经的笔记