某些 Windows 系统内置的应用, 比如 SMB 或者 RDP, 不能设置 Socks5 代理.
这样如果希望在公网上访问到家里服务器的 SMB 文件共享就不太方便了.
还有一些应用 (比如 QQ / git) 不会默认使用系统代理, 需要手动设置, 也相对比较麻烦.
上一篇文章中基于软路由网关的透明代理模式可以解决这种问题.
可是笔记本不是只在一个固定的路由器下使用, 而需要携带到不同的网络环境下使用时, 设置基于 TUN 的全局代理则会更加方便.
首先需要安装 VPN 的客户端软件. 用的是小猫咪 Clash, 因为配置起来相对比较方便.
此处 Clash 的作用是从公网建立一条到内网的加密隧道, 同时使用其自带的功能创建 TUN 设备代理流量, 功能类似各个高校 / 单位会提供的用于访问内网资源的 VPN.
在软件界面启动 Mixin 和 Service Mode, 不需要启动 System Proxy.
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
24mixin: # 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"在配置文件中设置可用的服务器信息, 同时设置 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 网站:
- 用户访问域名, 先向原本的 DNS 服务器发送请求, 请求发送到 Clash 的网卡被拦截. Clash 从保留的 fake-ip 网段中 (198.18.0.0/16) 分配一个虚假的 ip 地址返回. 同时向设置的 DNS 服务器发送查询请求, 获取域名对应的真实 ip 备用.
- 用户使用虚假的 ip 发送数据包, 再次被虚拟网卡拦截, 根据虚假 ip 反查出对应的域名, 使用域名和真实的 ip 匹配代理规则, 如果需要代理, 将域名和已经建立的 TCP 连接打包成 socks5 代理的形式通过代理.
- 如果连接不需要代理, 直接访问真实地址, 返回数据.
如果通过 ip 地址访问:
- 直接通过 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/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬