本文没有涉及任何加密协议、VPN、“翻墙”等违规内容

不知道学校抽了什么风,会去检测我SS VMESS之类的协议,通报批评。

众所周知,法不责众,但是接下来其他人大概是不敢用了,再被抓就要杀鸡儆猴了。

也想过不登录校园网,直接用DNS端口上网,但速率应该挺慢的。

于是我打算拿一个服务器作为跳板,搭建SOCKS5代理,让流量不要直接走校园网出去,从而避免检测。

服务器配置

1.查看网卡名

> ip route get 8.8.8.8
8.8.8.8 via 172.16.0.1 dev ens18 src 172.16.1.113 uid 0

得到出网卡是 ens18

2.安装 Dante

> apt update
> apt install -y dante-server

3.创建账号

创建一个linux账号,只用于SOCKET5代理登录。

> useradd -r -s /usr/sbin/nologin proxyusername
> passwd proxyusername
(设置密码)

4.配置 Dante

logoutput: syslog

internal: 0.0.0.0 port = 10808
external: ens18

socksmethod: username
clientmethod: none

user.privileged: root
user.unprivileged: nobody

client pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    log: connect disconnect error
}

socks pass {
    from: 0.0.0.0/0 to: 0.0.0.0/0
    command: connect bind udpassociate
    log: connect disconnect error
    socksmethod: username
}

直接使用上面的配置,覆盖到 /etc/danted.conf ,修改 external 为出网卡名。

重启服务:

> systemctl restart danted

检查是否启动成功:

如果服务器上有防火墙还需要放行端口

工具配置

接下来给小猫咪配置一个全局扩展脚本(订阅 > 全局扩展脚本)。

// Clash Verge Rev 全局扩展脚本
// 作用:让所有普通代理节点都先通过 Dante/SOCKS5 跳板拨号
// 链路:Clash/Mihomo -> DANTE-JUMP -> 你选择的任意节点 -> 目标网站

function main(config, profileName) {
  const JUMP_NAME = "DANTE-JUMP";

  // 修改为你的 Dante SOCKS5 信息
  const jumpProxy = {
    name: JUMP_NAME,
    type: "socks5",
    server: "x.x.x.x",
    port: 10808,
    username: "proxyuser",
    password: "xxx",
    udp: true
  };

  // 这些不是实际远端代理,不能加 dialer-proxy
  const builtinNames = new Set([
    "DIRECT",
    "REJECT",
    "REJECT-DROP",
    "PASS",
    "COMPATIBLE",
    JUMP_NAME
  ]);

  // 这些类型一般不要加 dialer-proxy
  // direct/reject 是内置类型;dns/http/socks5 里可能包含本地代理或跳板本身
  const skipTypes = new Set([
    "direct",
    "reject",
    "dns"
  ]);


  // 确保 proxies 存在
  config.proxies = config.proxies || [];

  // 先移除旧的同名跳板,避免重复
  config.proxies = config.proxies.filter(p => p && p.name !== JUMP_NAME);

  // 把跳板节点放到 proxies 最前面
  config.proxies.unshift(jumpProxy);

  // 给所有普通代理节点加 dialer-proxy
  config.proxies = config.proxies.map(proxy => {
    if (!proxy || !proxy.name) return proxy;

    const name = proxy.name;
    const type = String(proxy.type || "").toLowerCase();

    if (builtinNames.has(name)) return proxy;
    if (skipTypes.has(type)) return proxy;

    // 不要让跳板自己走自己
    if (name === JUMP_NAME) return proxy;

    return {
      ...proxy,
      "dialer-proxy": JUMP_NAME
    };
  });

  // 对 proxy-providers 里的订阅节点统一加 dialer-proxy
  // 如果你的订阅是 provider 形式,这一段很关键
  if (config["proxy-providers"]) {
    Object.keys(config["proxy-providers"]).forEach(providerName => {
      const provider = config["proxy-providers"][providerName];
      if (!provider) return;

      provider.override = provider.override || {};
      provider.override["dialer-proxy"] = JUMP_NAME;
    });
  }

  return config;
}


需要注意的是,server 必须填IP,不能填域名。


于是乎,我们就代理出去了。

以前被校园网制裁,Shadowsocks节点全部用不了,现在全都可用了。

我能想到的,最大的成功就是无愧于自己的心。