Windows 下 TUN 全局透明代理的设置

 

某些 Windows 系统内置的应用, 比如 SMB 或者 RDP, 不能设置 Socks5 代理.

这样如果希望在公网上访问到家里服务器的 SMB 文件共享就不太方便了.

还有一些应用 (比如 QQ / git) 不会默认使用系统代理, 需要手动设置, 也相对比较麻烦.

上一篇文章中基于软路由网关的透明代理模式可以解决这种问题.

可是笔记本不是只在一个固定的路由器下使用, 而需要携带到不同的网络环境下使用时, 设置基于 TUN 的全局代理则会更加方便.

首先需要安装 VPN 的客户端软件. 用的是小猫咪 Clash, 因为配置起来相对比较方便.

此处 Clash 的作用是从公网建立一条到内网的加密隧道, 同时使用其自带的功能创建 TUN 设备代理流量, 功能类似各个高校 / 单位会提供的用于访问内网资源的 VPN.

  1. 在软件界面启动 Mixin 和 Service Mode, 不需要启动 System Proxy.

    设置设置

  2. Settings 中设置 profile mixin 的 YAML 配置文件, 写入以下内容.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    mixin: # object
    tun:
    enable: true
    stack: gvisor
    dns-hijack:
    - 198.18.0.2:53
    auto-route: true
    auto-detect-interface: false
    interface-name: WLAN # 这个 WLAN 根据自己的实际情况, 修改为用于上网的网卡的名称

    dns:
    enable: true
    enhanced-mode: fake-ip
    listen: 127.0.0.1:53
    nameserver:
    # - 114.114.114.114 如果不需要 dns over https/tls 的可以使用普通的 dns 加快访问速度
    # - 8.8.8.8
    - tls://223.5.5.5
    - tls://223.6.6.6
    - tls://dot.pub
    fake-ip-filter:
    - "dns.msftncsi.com"
    - "www.msftncsi.com"
    - "www.msftconnecttest.com"
  3. 在配置文件中设置可用的服务器信息, 同时设置 proxy-group, 并为内网网段设置分流规则.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 仅供参考 根据实际情况修改!
    proxy-groups:
    - name: LAN192
    type: select
    proxies:
    - DIRECT
    - home-ipv6

    rules:
    - IP-CIDR,192.168.1.0/24,LAN192
    - MATCH,DIRECT

这样设置完成后理论上就可以 Clash 的虚拟网络设备代理局域网流量到指定的服务器了.

连接连接

再具体解释一下其中的工作原理.

如果通过域名访问 http 网站:

  1. 用户访问域名, 先向原本的 DNS 服务器发送请求, 请求发送到 Clash 的网卡被拦截. Clash 从保留的 fake-ip 网段中 (198.18.0.0/16) 分配一个虚假的 ip 地址返回. 同时向设置的 DNS 服务器发送查询请求, 获取域名对应的真实 ip 备用.
  2. 用户使用虚假的 ip 发送数据包, 再次被虚拟网卡拦截, 根据虚假 ip 反查出对应的域名, 使用域名和真实的 ip 匹配代理规则, 如果需要代理, 将域名和已经建立的 TCP 连接打包成 socks5 代理的形式通过代理.
  3. 如果连接不需要代理, 直接访问真实地址, 返回数据.

如果通过 ip 地址访问:

  1. 直接通过 ip 地址匹配规则, 如果需要代理, 就直接将数据包打包加密后发送给远端代理服务器.

我并不是很信任南大看起来很混乱的内网和没有密码的公开 Wi-Fi. 也不希望我的任何数据会以明文的方式传输(虽然大部分已经是 https), 所以打通一条全局的加密隧道是一种可行的解决方案.

另: 我发现 Clash 对 DNS 请求的拦截并不会真正的阻断原本的 DNS 请求, 使用 Wireshark 抓包还是可以看到从 DHCP 获取的 DNS 服务器的回应. 所以如果不希望使用学校提供的 DNS 的话, 也可以手动将 Wi-Fi 的 DNS 服务器设置为 127.0.0.1, 这样可以只使用 DoT/DoH 服务器的解析结果.

本文采用 CC BY-NC-SA 4.0 许可协议发布.

作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/configuring-tun/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬