Breakertt Blog

一起实现梦想的故事!

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

Breakertt's Avatar 2019-08-20 Linux

Apple TV 4K 到货前的准备工作

最近打算购入一台 Fire TV 4K, 又因为众所周知的原因, Fire TV 4k 在没有代理的情况下是根本没法用的,所以就萌生了拿之前买的 nuc 来做一个旁路代理网关的想法。

在Ubuntu上部署一个透明代理网关主要是三块:安装 clash, 简单配置 clash, 高级配置 clash, 配置 iptables 转发。

安装 clash

使用 clash 的最主要原因是它自带 redir 服务,且使用 go 语言开发安装非常方便。

cd ~
wget https://github.com/Dreamacro/clash/releases/download/v0.15.0/clash-linux-amd64-v0.15.0.gz #下载二进制文件
gzip -d clash-linux-amd64-v0.15.0.gz #解压
mv clash-linux-amd64-v0.15.0 /usr/local/bin/clash #移动到bin
chmod +x /usr/local/bin/clash #添加执行权限

然后我们把 clash 设置成 service,下面是我的/etc/systemd/system/clash.service

[Unit]
Description=clash service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/clash
Restart=on-failure # or always, on-abort, etc

[Install]
WantedBy=multi-user.target

然后我们把clash激活为开机启动

systemctl daemon-reload
systemctl enable clash

简单配置 clash

在这个环节中主要是简单配置 clash 及其 dashboard,让其能作为一个局域网的代理服务器存在。

cd ~/.config/
mkdir clash
touch config.yaml
wget https://github.com/haishanh/yacd/archive/gh-pages.zip
unzip gh-pages.zip
mv yacd-gh-pages/ dashboard/

然后我们给config.yaml加上内容:

port: 7890
socks-port: 7891
redir-port: 7892
allow-lan: true
mode: Rule
log-level: info
external-controller: 0.0.0.0:9090
secret: ""
external-ui: dashboard
#此处内容请安装一个gui版本的clash然后在里面配置好代理然后抄过来
Proxy:
Proxy Group:
#
Rule:
- IP-CIDR,127.0.0.0/8,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- FINAL,Proxy

然后我们执行service clash start,就有一个可以使用的局域网代理服务器了,甚至可以在浏览器里面访问http://serverip:9090/ui/来调试 clash!如果是公网的话我推荐 secret 处加上内容以保证安全性。

高级配置 clash

这里的配置主要是两块:

clash dns

因为我们要拿 clash 做一个透明网关,那么 dns 服务必然是一个问题,clash 自带的 dns 服务很神奇,我研究了一个上午,如果想了解可以看这两篇文章:DNS污染对Clash(for Windows)的影响代替 Surge 增强模式——使用 KoolClash 作为代理网关

最后我用的就是第一篇文章中所用到的方案,在 clash 的设置文件中加入了以下内容:

dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: redir-host
nameserver:
- 'tls://dns.rubyfish.cn:853'
fallback:
- 'tls://1.1.1.1:853'
- 'tcp://1.1.1.1:53'
- 'tcp://208.67.222.222:443'
- 'tls://dns.google'

为什么不用 fake-ip 呢?因为我觉得目前的 redir-host 方案足够我本人使用了。

国内外分流

clash 这个软件的一大特色就是他的分流功能,所以我想还是得用起来,不说好用,至少可以堪用。

然后我就找到了网上已经有现成的规则文件了,可以抄过来用。

如果需要分流的话就把这个文件中的 rules 部分抄进目前的config.yaml

配置iptables转发

这是我们的最后一步,主要是使用 iptables 配置 nat 的转发到 clash,很大一部分都是参考了 Clash TProxy Mode,不过这里面的规则有问题,会导致 dns 的回环。

最后修复后的规则如下,这个规则网关本身是不走代理的,反正我可以用 proxychains-ng 对本机进行代理:

iptables -t nat -N 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
iptables -t nat -A clash -d <local host ip> -j RETURN
iptables -t nat -A clash -p tcp -j REDIRECT --to-port 7892
iptables -t nat -I PREROUTING -p tcp -d 8.8.8.8 -j REDIRECT --to-port 7892
iptables -t nat -I PREROUTING -p tcp -d 8.8.4.4 -j REDIRECT --to-port 7892
iptables -t nat -A PREROUTING -p tcp -j clash

ip rule add fwmark 1 table 100
ip route add local default dev lo table 100
iptables -t mangle -N clash
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.0.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
iptables -t mangle -A clash -d <local host ip> -j RETURN
iptables -t mangle -A clash -p udp -j TPROXY --on-port 7892 --tproxy-mark 1
iptables -t mangle -A PREROUTING -p udp -j clash

规则持久化

当然我们还不希望这些规则重启就没,那么我们就需要安装一些辅助工具来持久化iptables的规则:

sudo apt install iptables-persistent netfilter-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

具体可以看这里:how-to-save-rules-of-the-iptables

一个问题

我遇到了主路由映射端口无效的问题,加了一行 iptables 规则就好了。
如果还没好的话,把你需要访问的服务在内网 bind 的端口加到下面的这行里面。

iptables -t nat -I PREROUTING -p tcp -m multiport --sports 21,22,80,443,3389,5900,5901,5902,5902 -j RETURN

尾声

那么就可以把旁路网关地址以及dns设置在需要的机器上了!我也要开始下单 Apple TV 了!

本文最后更新于 天前,文中所描述的信息可能已发生改变