2022年我如何在宿舍不计费上网

概述

我的网络环境:

  • 宿舍:笔记本连 WiFi,IPv4 上网流量计费,IPv6 上网不计费,均不限速
  • 实验室:多台服务器可用,上网均不计费,IPv4 上网限速 8Mbps,IPv6 上网不限速
  • VPS:月租,无流量计费,无带宽限制

目标:充分利用三者网络的特性,在宿舍上网实现:不计费;无感知魔法上网;尽可能不限速;安全.

目前方案如下图: Architecture

  • 不计费:用 Tailscale 在宿舍和实验室之间建立一个纯 IPv6 隧道,所有宿舍流量经过实验室代理
  • 魔法上网:国外流量全部走 VPS 代理,国内流量直连,本地设置透明代理,应用无需额外设置
  • 不限速:处理得不完美,国内流量为了时延走直连,只能保证 IPv6 不限速,但实际体验影响不大
  • 安全:用若干次必要或不必要的加密把不同软件分隔开,如果 clash 和 v2ray 不搞事情应该就安全…吧

方案并不完美,比如访问一个 HTTPS 网站中间需要经过4次加密 (两次Noise + Vmess + TLS),性能肯定不是很好,但我觉着自己用目前感觉还挺舒服,没觉得慢。 下面分别介绍其中用到的软件。

Clash

之前一直听说,最近才接触,是一个实现了各种代理协议外加转发规则的工具,我这里主要是为了用它现成的 TUN 模式,这样就可以全局代理而且不用自己手动配置应用和搞路由表了。 在 Windows 下还是需要一个 GUI 用起来比较方便,我看比较流行的 Clash for Windows 是闭源的而且它的作者坚决拒绝解释闭源的原因,有点奇怪(其实 clash 的 TUN 模式在内的一些功能也闭源,但有过解释),最后用的是另一个开源的 GUI 实现叫做 Clash-Verge。这个虽然感觉还不够成熟,但因为我需求过于简单所以没问题。

我的配置文件也很简单,就是配置一下其他软件在本地开的一个从实验室服务器映射过来的 socks5 端口,额外设置下本地地址直连,然后打开 TUN 模式代理所有流量.

proxies:
  - name: "socks"
    type: socks5
    server: 127.0.0.1
    port: 6000

proxy-groups:
  - name: Proxy
    type: select
    proxies:
      - socks

rules:
  - IP-CIDR,127.0.0.0/8,DIRECT

Tailscale

我的理解是一个可以内网穿透的 VPN 组网工具,之前的文章也多次介绍过了。 通过它,我在宿舍的电脑和实验室服务器可以通过 IPv6 直连。只要登录,无需配置,真的很好用。

TCP Proxy

这个是之前提到的自己写的一个简单的加密端口转发工具, 作用是将绑在本地的端口通过认证和加密分享给其他设备。这样即使实验室的 v2ray 服务绑定在本地端口我也可以安全访问到并将其映射到我自己电脑的本地端口。

用这个还有一个好处是因为实验室将 tailscale 的 IPv4 地址禁掉了而实验室 WiFi 又没有支持 IPv6,如果拿电脑去实验室用, 只需将这个端口转发工具的服务端地址改为局域网地址即可,其他的配置全都不用动。 为了这个,五一期间又写了个简单的系统托盘 GUI 用来切换不同的客户端,不用敲命令开启关闭服务了。

V2ray

应该是当前最流行的魔法上网代理软件了,除了去年特殊时期我被封了半年 443 端口外, 从19年用到现在感觉一直没什么问题。 之前我都是在自己电脑开 v2ray 的客户端,通过这次操作,v2ray 的客户端相关配置全部转移到实验室的服务器,通过端口转发在不同设备间共享配置,我电脑完全感知不到 v2ray 的存在了。

结论

通过这一套连招,我的计算机网络知识(传输层以上)得到了很好的锻炼……

补充 2022/05/23

以上主要针对客户端是 Windows, 在 linux 桌面下除了相关软件基本可以不用靠 GUI 外没什么区别.

clash 的 GUI 通常对配置做了特殊处理,附上在 linux 下对应的完整 clash 配置:

mixed-port: 7890
mode: rule
ipv6: true
external-controller: 127.0.0.1:9090
external-ui: /usr/share/yacd/

tun:
  enable: true
  stack: system
  auto-route: true
  auto-detect-interface: true

proxies:
  - name: "socks"
    type: socks5
    server: 127.0.0.1
    port: 6000

proxy-groups:
  - name: socks5
    type: select
    proxies:
      - socks

rules:
  - IP-CIDR,127.0.0.0/8,DIRECT
  - MATCH,socks5

客户端我是直接装的 AUR 源里的最新版本,打包时我看也给文件 set_cap 了,加上 clash 可以自动配置 tun 模式下的路由,用起来什么都不用关心了,挺好的。

以上配置其实也装了个 web GUI 叫 yacd, 后来发现对我来说好像用不到,我最多只是切换下模式,写个脚本就可以了

#!/usr/bin/python3
import requests

url = 'http://127.0.0.1:9090/configs'
res = requests.get(url).json()
match res['mode']:
    case 'rule':
        r = requests.patch(url, json={'mode': 'direct'})
        print("change clash mode to 'direct'")
    case 'direct':
        r = requests.patch(url, json={'mode': 'rule'})
        print("change clash mode to 'rule'")