avatar
@bangbang93

给服务器上clash透明代理

6/6/2021, 10:14:04 AM

下载之类的就不在赘述了,直接从配置开始

首先在服务器上最重要的需求之一就是尽量不要影响到服务的流量性能,所以和家用代理会有一些细微的规则调整。

Clash本体

我的网关机器上原始是没有dns服务的,直接转发给114,所以现在要让clash接管53端口,但是又不希望clash进程跑在root用户下,所以需要给特殊权限
setcap 'cap_net_admin,cap_net_bind_service+ep' /usr/local/bin/clash
配置目录也给到nobody
chown nobody /etc/clash
然后就可以写service文件了

# /etc/systemd/system/clash.service
[Unit]
Description=clash daemon

[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/clash -d /etc/clash
Restart=on-failure

[Install]
WantedBy=multi-user.target

把家里路由器的规则,复制到/etc/clash/config.yaml,就可以先把clash进程拉起来了

此时还没有设置防火墙规则,所以不会有任何流量走向clash,不妨先试试dns能不能生效。
nslookup www.google.com 127.0.0.1

防火墙规则

规则说明

由于服务器环境的特殊性,我不希望任何服务流量经过clash,所以最简单的区分方法就是端口号范围,以下规则1-32767端口不会经过clash,linux系统的默认设置会使用32768-60999端口发起请求,所以主动发起的请求会在高位端口,这些流量是需要经过clash的,之后在设置服务器时,可以根据端口范围决定是否需要将流量经过clash

以下规则魔改openclash

ipset

使用ipset规则过滤本地网络流量

ipset create localnetwork hash:net family inet hashsize 1024 maxelem 65536
ipset add localnetwork 1.1.1.1  #本地公网IP
ipset add localnetwork 127.0.0.0/8
ipset add localnetwork 10.0.0.0/8
ipset add localnetwork 172.16.0.0/12
ipset add localnetwork 192.168.0.0/16
ipset add localnetwork 0.0.0.0/8
ipset add localnetwork 169.254.0.0/16
ipset add localnetwork 224.0.0.0/4
ipset add localnetwork 240.0.0.0/4

以下服务器跳过clash

ipset create lan_ac_black_ips hash:net family inet hashsize 1024 maxelem 65536
ipset add lan_ac_black_ips 10.0.0.1

写个脚本自动更新chnroute

#!/bin/bash
ipset create china_ip_route hash:net maxelem 65536
wget --no-check-certificate -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest'| awk -F\| '/CN\|ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }'>/etc/chnroute.txt
ipset flush china_ip_route
while read ip;do
 ipset add china_ip_route $ip
done</etc/chnroute.txt
ipset save china_ip_route >/etc/china_ip_route.conf
0 0 1 * * /usr/local/bin/chnroute.sh > /dev/null 2>&1 

iptables

准备工作好了,可以开始灌防火墙规则了
建议先保存一下当前规则,万一改挂了,以从iptables-flush和iptables-restore恢复

# 处理转发tcp
iptables -t nat -N openclash
iptables -t nat -A PREROUTING -p tcp -j openclash
iptables -t nat -A openclash -m set --match-set localnetwork dst -j RETURN
iptables -t nat -A openclash -m set --match-set lan_ac_black_ips src -j RETURN
iptables -t nat -A openclash -m set --match-set china_ip_route dst -j RETURN
iptables -t nat -A openclash -p tcp -m multiport --sports 1:32767 -j RETURN    #忽略源端口1-32767,认为这里的流量都是后端服务器的响应流量
iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports 7892

# 处理本地tcp
iptables -t nat -N openclash_output
iptables -t nat -A OUTPUT -j openclash_output
iptables -t nat -A openclash_output -p tcp -m multiport --sports 1:32767 -j RETURN
iptables -t nat -A openclash_output -m set --match-set localnetwork dst -j RETURN
iptables -t nat -A openclash_output -m set --match-set china_ip_route dst -j RETURN
iptables -t nat -A openclash_output -p tcp -m owner ! --uid-owner 65534 -j REDIRECT --to-ports 7892

# 处理UDP
iptables -t mangle -N openclash
iptables -t mangle -A PREROUTING -p udp -j openclash
iptables -t mangle -A openclash -m set --match-set localnetwork dst -j RETURN
iptables -t mangle -A openclash -m set --match-set lan_ac_black_ips src -j RETURN
iptables -t mangle -A openclash -m set --match-set china_ip_route dst -j RETURN
iptables -t mangle -A openclash -p udp -m multiport --sports 1:32767 -j RETURN
iptables -t mangle -A openclash -p udp -j TPROXY --on-port 7892 --on-ip 0.0.0.0 --tproxy-mark 0x162/0xffffffff

成果

image.png
爽到,妈妈再也不用担心服务器上各种镜像拉不下来了