编辑
2021-04-08
魔法网络
00
请注意,本文编写于 1123 天前,最后修改于 655 天前,其中某些信息可能已经过时。

目录

安装clash
配置clash
添加服务
配置文件
说明
设置旁路网关
nftables方案
iptables实现
留坑
更多参考
懒人规则合集
更新

clash是强大的开源代理软件,支持在各种平台上面运行,但默认的配置是socks代理和http代理,想拿它做旁路网关还需要一些操作。

安装clash

github仓库

直接下载最新的 Release就行了。

配置文件在~/.config/clash/config.yaml <--! more -->

配置clash

添加服务

创建一个本地的systemd配置/etc/systemd/system/clash.service

[Unit] Description=clash service After=network.target [Service] Type=simple ExecStart=/usr/local/bin/clash -d /etc/clash/ Restart=on-failure [Install] WantedBy=multi-user.target
systemctl start clash.service systemctl enable clash.service # 然后测试下 socks 代理是否可用 curl --socks5 localhost:7891 google.com

配置文件

说明

clash里面有内置的dns,如果直接用那么大可不必开启内置的dns服务器,但是想用旁路网关,那么需要开启内置的dns。内置的dns服务器有redir-hostfake-ip两种模式:

  • redir-host对于转发过来的请求,一律先用nameserverfallback里面的dns服务器进行解析,如果是外国的地址,那么后续就用fallback里的dns服务器,如果是国内的那就直连。

  • fake-ip不管啥请求,先返回一个虚拟的ip,因为如果是代理,那么是代理服务器进行的远端解析,比redir-host节约一些开销。

  • 只要用了旁路网关,那就得把客户机的dns服务器也设置成clash的dns服务,因为clash需要用dns服务反推域名和ip的对应关系。

  • 可能我说的不清楚,我也理解的不太对,但是我在实际使用中发现,如果我把clash用做旁路网关,并且设置了fake-ip,那么我ping一个网址,或者wget下载一个东西,都直接对假ip进行连接了,换句话说除了浏览器之外别的服务不对劲了。所以旁路网关还是用redir-host模式吧,然后客户机的网关和dns都指向clash的主机,这样可以保证服务都没问题,udp的也ok。

所以我的解决方案就是:PVE里一个LXC容器里装Clash另一个装AdGuardHome,然后Clash里开启dns服务器,选择redir-host模式,不用fallback,就一个nameserver指向我的AdGuardHome。在AdGuardHome里,把dns设置成:

https://doh.pub/dns-query https://dns.alidns.com/dns-query

这两个都是支持DoH/DoT的,可以防止dns污染,这样所有的dns上游都是AdGuardHome了,可以用来防广告,就是不能根据客户端做单独的服务屏蔽了(这个我还没有好办法),但是我用iKuai做管控,所以没啥影响。

配置参考 配置完毕后就能用socks代理或者http代理直接用了,但是想要实现旁路网关,还需要设置转发。

设置旁路网关

参考:

旁路网关自身流量最好别走透明代理,为了实现旁路网关,我们需要转发流量,可以用iptalbes或者nftables,我用的后者而且测试ok,前者没试过.

nftables方案

  1. apt install nftables -y

  2. 创建私有地址定义文件/etc/nftables/private.nft(私有地址咱们不转发):

define private_list = { 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/4, 240.0.0.0/4 }
  1. 修改配置文件/etc/nftables.conf
#!/usr/sbin/nft -f include "/etc/nftables/private.nft" table ip nat { chain proxy { ip daddr $private_list return ip protocol tcp redirect to :7892 } chain prerouting { type nat hook prerouting priority 0; policy accept; jump proxy } }
  1. sudo sh -c "nft flush ruleset && nft -f /etc/nftables.conf"

设置服务:

systemctl enable nftables.service systemctl start nftables.service
  1. 开启ip转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p

iptables实现

没用过,不保证效果

iptables -t nat -N CLASH # 私有 ip 流量不转发,完整的在下面 # 设置的 fake-ip 请注意检查这里 iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN iptables -t nat -A CLASH -p tcp -j REDIRECT --to-ports 7892 iptables -t nat -A PREROUTING -p tcp -j CLASH
# 内部流量不转发给 CLASH 直通 iptables -t nat -A CLASH -d 0.0.0.0/8 -j RETURN iptables -t nat -A CLASH -d 10.0.0.0/8 -j RETURN iptables -t nat -A CLASH -d 127.0.0.0/8 -j RETURN iptables -t nat -A CLASH -d 169.254.0.0/16 -j RETURN iptables -t nat -A CLASH -d 172.16.0.0/12 -j RETURN iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN iptables -t nat -A CLASH -d 224.0.0.0/4 -j RETURN iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN

然后就是规则持久化,百度就行了。

留坑

这个nftables里面写的规则好像不包括udp协议,如果我想让clash接管udp流量,比如我p2p下载也想走代理,怎么搞……有空研究吧,我感觉我得多了解一下相关知识了。

更多参考

DNS污染对Clash(for Windows)的影响

使用 KoolClash 作为代理网关

在 Ubuntu18.04 上使用 clash 部署旁路代理网关(透明代理)

V2Ray 做透明代理

debian10 使用 nftables 替换 iptables

懒人规则合集

SS-Rule_Snippet

更新

我是基于懒人规则合集中例子配置的,最后我想配合adguardhome进行,所以我弄了俩,一个负责nameserver,里面都是国内的上游DoH和DoT,然后另一个负责fallback里面都是国外的。然后关闭fallback-filter,具体可以看我的另一片文章。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:mereith

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!