自动配置服务器代理

大类
Env
CloudResource
技术标签
云服务-白嫖
环境增强
优先级
Medium
开始日期
Dec 28, 2022
状态
Maintaining
Public
Public
最后更新
Dec 28, 2022

背景

  • 在大量配置服务器时,每次都要配置代理,很麻烦
  • 以前是通过别的服务器开代理
    • 容易造成服务器被封
    • 服务器带宽有限
    • 当使用云服务内网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会导致代理暴露在公网,需要防火墙限制
 

原理

  1. 下载clash的各种文件
      • 先下载到/tmp,再移动,避免出错的时候文件被覆盖
  1. 配置clash
      • binary解压,移动到/usr/local/bin
      • 建立/etc/clash文件夹,config移动进去
      • clash的external-ui文件夹必须存在,所以还得建立/etc/clash/dashboard
  1. 配置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
  1. 配置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
  1. 配置计划任务自动更新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