首页  >  All tags  >  proxy

Clash 作为网关的透明代理

距离上一篇介绍该主题的文章已经过去了接近三年,[Clash 作为网关的透明代理]({% post_url 2020-11-27-clash-transparent-proxy %}) 中间使用到的方案其实多次变更,例如使用了很长一段时间 的 shellclash,这个方案胜在省心,可以直接在支持的 路由器上部署,但是内核更新缓慢,作者对配置加了很多自定义设置,虽然出发点是为了方便大部分小白用户,但是 严重降低了自定义的能力。而且默认的一些设定大概率会导致 DNS 泄漏问题,关于这个话题可以参考 不良林的相关视频。这是不可接受的,因此前段时间又回归到使用 PVE 上虚拟机的方案。

简单摸索了一下最新方案发现 redir-host 模式已经被 Clash 官方放弃,不建议再使用。 TProxy 模式当然 没啥问题,但是毕竟得自己处理 iptables 规则。在没有性能瓶颈的情况下,更推荐使用 tun 模式,可以自动 处理路由等问题。下面简单介绍一下相关配置。

首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p

其次 Clash 配置文件头部添加如下

tun:
  enable: true
  stack: system # or gvisor
    #dns-hijack:
    #    - any:53
    #    - tcp://any:53
  auto-route: true
  auto-detect-interface: true
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:53
  enhanced-mode: fake-ip       # redir-host or fake-ip
  fake-ip-range: 198.18.0.1/16    # Fake IP addresses pool CIDR
  use-hosts: true                 # lookup hosts and return IP record
  nameserver:
    - 114.114.114.114

最后在局域网的 DHCP 服务器设置网关为该机器 IP 即可,也可以手动在希望走代理机器的网关设置未该机器 IP。

Clash 作为网关的透明代理

注意:作者目前使用的方案已经更新,请参考[最新文章]({% post_url 2023-07-14-clash-gateway %}),使用 TUN 方案,不需要自己维护 iptables 规则

一直以来的方式是在各个终端进行代理,因为没有一定网关/路由层面处理的理由。之前也在路由器上折腾过几次,成功大抵算是成功,但是偶尔的稳定性问题,以及不方便更改代理状态和调试,最终还是放弃。

前段时间折腾了 DIYNAS,安装了 PVE 系统,折腾了虚拟机好久。想着既然没什么后顾之忧,不如在虚拟机上试试软路由?使用 OpenWRT 原生系统 + openclash 使用了一周左右,稳定性尚可,就是更新频繁(强迫症无法不点更新啊),配置文件看得人眼花缭乱。

在翻 Clash 的 GitHub 仓库时,发现最近 TProxy 支持了转发 TCP1,遂想起来在 Ubuntu 上折腾一下透明代理作为网关,成功后发现这种方式相对于 OpenWRT + openclash 简单省心,维护一份配置文件,不用频繁更新。记录方案于此。

提前声明本人网络知识欠缺,配置大多参考他人,尽力给出原始链接供参考。

普通 linux 主机设置🔗

首先,在网关机器上打开 ipv4 转发, echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf && sysctl -p Clash 配置文件添加如下

# Transparent proxy server port for Linux (TProxy TCP and TProxy UDP)
tproxy-port: 7893

设置路由和 iptables 的脚本

# ROUTE RULES
ip rule add fwmark 1 table 100
ip route add local 0.0.0.0/0 dev lo table 100

# CREATE TABLE
iptables -t mangle -N clash

# RETURN LOCAL AND LANS
iptables -t mangle -A clash -d 0.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 127.0.0.0/8 -j RETURN
iptables -t mangle -A clash -d 169.254.0.0/16 -j RETURN
iptables -t mangle -A clash -d 172.16.0.0/12 -j RETURN
iptables -t mangle -A clash -d 192.168.50.0/16 -j RETURN
iptables -t mangle -A clash -d 192.168.9.0/16 -j RETURN

iptables -t mangle -A clash -d 224.0.0.0/4 -j RETURN
iptables -t mangle -A clash -d 240.0.0.0/4 -j RETURN

# FORWARD ALL
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7893 --tproxy-mark 1
iptables -t mangle -A clash -p tcp -j TPROXY --on-port 7893 --tproxy-mark 1

# REDIRECT
iptables -t mangle -A PREROUTING -j clash

最后在局域网的 DHCP 服务器设置网关为该机器 IP 即可,也可以手动在希望走代理机器的网关设置未该机器 IP。

OpenWrt 设置🔗

下载好对应版本的 clash 执行文件,移动或软链接至系统路径。 编写自动启动文件 # /etc/init.d/clash

#!/bin/sh /etc/rc.common
START=99
STOP=15
 
start() {
  echo start
  clash &
  /root/.config/clash/iptables.sh
}
 
stop() {
  echo stop
  killall clash
}

配置文件中的 iptables.sh 即为上文中的 iptales 设置命令。

参考链接: