背景
- 在大量配置服务器时,每次都要配置代理,很麻烦
- 以前是通过别的服务器开代理
- 容易造成服务器被封
- 服务器带宽有限
- 当使用云服务内网mirror时会出现各种问题
- 本地搭建一个代理服务是必须的
用什么公开的代理?
- 要想代理,那肯定是要有梯子
- 我自己的优质梯子不能暴露,所以我们得找便宜耐操的,丢了不心疼的
- 便宜大碗机场:
- NanoPort:3.59元 257G 5IP
- Biteb:6元800G 1IP,9元1600G 3IP
- V2Meow/ooicat:10元250G 5IP
- 买了性价比最高的:
- NanoPort
- BitEb 9元
Clash配置
思路
核心:服务器尽可能还是少手动操作,所以我们自动选择服务器代理
- 在select组里面套url-test,这样既可以手动override,又可以自动选择
- url-test间隔调小,120s一次,这样减少down time
- url-test的测试url选www.google.com/generate_204,这样可以保证梯子确实可以连外网
- gstatic、cloudflare国内并没有墙,测试的不准
- 需要注意url-test需要配合provider里面的health-check,否则他不会自动测试
最终clash配置
mode: Rule mixed-port: 7890 allow-lan: true log-level: debug external-controller: :7990 external-ui: 'dashboard' secret: "" ipv6: true dns: enable: true ipv6: true nameserver: - '填你的DNS服务器' listen: 0.0.0.0:55330 proxies: ################## 填代理 proxy-groups: ################## 填手动和自动的代理 - name: Proxy type: select proxies: - _AutoProxy use: #- XXX - name: _AutoProxy type: url-test proxies: #- temp use: #- XXX tolerance: 150 lazy: false url: 'http://www.google.com/generate_204' interval: 120 rules: # ipv6 direct - IP-CIDR6,2001::0/16,DIRECT - IP-CIDR6,2400::0/12,DIRECT # internal addresses (Low level Direct) - IP-CIDR,0.0.0.0/8,DIRECT - IP-CIDR,10.0.0.0/8,DIRECT - IP-CIDR,100.64.0.0/10,DIRECT - IP-CIDR,127.0.0.0/8,DIRECT - IP-CIDR,169.254.0.0/16,DIRECT - IP-CIDR,172.16.0.0/12,DIRECT - IP-CIDR,192.0.0.0/24,DIRECT - IP-CIDR,192.0.2.0/24,DIRECT - IP-CIDR,192.88.99.0/24,DIRECT - IP-CIDR,192.168.0.0/16,DIRECT - IP-CIDR,198.18.0.0/15,DIRECT - IP-CIDR,198.51.100.0/24,DIRECT - IP-CIDR,203.0.113.0/24,DIRECT - IP-CIDR,224.0.0.0/4,DIRECT - IP-CIDR,233.252.0.0/24,DIRECT - IP-CIDR,240.0.0.0/4,DIRECT - IP-CIDR,255.255.255.255/32,DIRECT ################# 填自定义的规则 # elm - DOMAIN-SUFFIX,www.example.com,XXXXXX - GEOIP,CN,DIRECT - MATCH,Proxy proxy-providers: ################### 填代理订阅
一键脚本
一键脚本需求
- 配置clash的systemd
- 自动更新clash配置
- 因为可能需要换配置
- 配置iptables
- clash必须监听所有interface,否则docker里面没法用
- 但是监听所有interface会导致代理暴露在公网,需要防火墙限制
原理
- 下载clash的各种文件
- 先下载到/tmp,再移动,避免出错的时候文件被覆盖
- 配置clash
- binary解压,移动到/usr/local/bin
- 建立/etc/clash文件夹,config移动进去
- clash的external-ui文件夹必须存在,所以还得建立/etc/clash/dashboard
- 配置iptables
- 首先得找出来外网对应的interface
- 在Stack Overflow里面找到了
ip -o -4 route show to default | awk '{print $5}'
- 通过default route判断外网interface
- 对应iptables命令
/sbin/iptables -A INPUT -p tcp -i ${NETIF} --dport 7890 -j DROP
- 配置systemd,自动启动clash并iptables屏蔽外部7890
- 用heredoc写,EOF前面不加空格不加引号,这样可以把环境变量展开:
sudo tee /etc/systemd/system/clash.service <<EOF
- 写进/etc/systemd/system/clash.service,然后systemctl daemon-reload + enable + start
- 在这里执行iptables命令
- 通过ExecStartPre来执行iptables命令,先删除iptables规则,再创建,这样可以保证正常情况下systemctl restart时iptables仍然会成功
iptables -D
的删除命令前面加-
这样可以避免iptables规则不存在的时候报错
[Unit] Description=Clash daemon, A rule-based proxy in Go. After=network.target [Service] Type=simple Restart=always ExecStart=$CLASH_BIN -d /etc/clash ExecStartPre=-/sbin/iptables -D INPUT -p tcp -i ${NETIF} --dport 7890 -j DROP ExecStartPre=/sbin/iptables -A INPUT -p tcp -i ${NETIF} --dport 7890 -j DROP [Install] WantedBy=multi-user.target
- 配置计划任务自动更新clash配置
- 通过/etc/cron.d下面建文件来配置cron,这样不需要的时候删除这个文件就行
- 还是和安装的时候一样,先下载到tmp里,然后再移动过去
- 通过clash的restapi实现不重启clash直接更新配置
curl -X PUT ${CLASH_RPC}/configs -H "Content-Type: application/json" -d '{"path":"/etc/clash/config.yaml"}'
rm /tmp/clash.yaml && curl -Lq $CLASH_CONF -o /tmp/clash.yaml --fail && mv /tmp/clash.yaml /etc/clash/config.yaml && curl -X PUT ${CLASH_RPC}/configs -H "Content-Type: application/json" -d '{"path":"/etc/clash/config.yaml"}'
最终脚本
XXXXX换成自己的服务器
#!/bin/bash set -x set -e CLASH_CONF=http://XXXXXX/clash.yaml CLASH_RPC=http://127.0.0.1:7990 #CLASH_URL=https://release.dreamacro.workers.dev/latest/clash-linux-amd64-latest.gz CLASH_URL=http://XXXXXX/clash-linux-amd64-latest.gz CLASH_BIN=/usr/local/bin/clash NETIF=$(ip -o -4 route show to default | awk '{print $5}') echo "Network interface: $NETIF" if [ -z $NETIF ]; then echo "Failed to detect netif!" exit 1 fi rm -f /tmp/clash.gz curl -L $CLASH_URL -o /tmp/clash.gz rm -f /tmp/clash.yaml curl -L ${CLASH_CONF} -o /tmp/clash.yaml gzip -d /tmp/clash.gz sudo mv /tmp/clash $CLASH_BIN sudo chmod +x $CLASH_BIN sudo mkdir -p /etc/clash sudo mv /tmp/clash.yaml /etc/clash/config.yaml sudo mkdir -p /etc/clash/dashboard sudo tee /etc/systemd/system/clash.service <<EOF [Unit] Description=Clash daemon, A rule-based proxy in Go. After=network.target [Service] Type=simple Restart=always ExecStart=$CLASH_BIN -d /etc/clash ExecStartPre=-/sbin/iptables -D INPUT -p tcp -i ${NETIF} --dport 7890 -j DROP ExecStartPre=/sbin/iptables -A INPUT -p tcp -i ${NETIF} --dport 7890 -j DROP [Install] WantedBy=multi-user.target EOF sudo tee /etc/cron.d/update_clash_conf <<EOF SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 */3 * * * root rm /tmp/clash.yaml && curl -Lq $CLASH_CONF -o /tmp/clash.yaml --fail && mv /tmp/clash.yaml /etc/clash/config.yaml && curl -X PUT ${CLASH_RPC}/configs -H "Content-Type: application/json" -d '{"path":"/etc/clash/config.yaml"}' EOF sudo systemctl daemon-reload sudo systemctl enable clash sudo systemctl restart clash