#!/bin/sh # Copyright (C) Juewuy getconfig(){ ccfg=$clashdir/mark if [ ! -f "$ccfg" ]; then echo mark文件不存在,默认以Redir模式运行! cat >$ccfg< /dev/null 2>&1 iptables -t nat -D PREROUTING -p udp -j clash_dns > /dev/null 2>&1 iptables -t nat -F clash > /dev/null 2>&1 iptables -t nat -X clash > /dev/null 2>&1 iptables -t nat -F clash_dns > /dev/null 2>&1 iptables -t nat -X clash_dns > /dev/null 2>&1 #重置ipv6规则 ip6tables -t nat -D PREROUTING -p tcp -j clash > /dev/null 2>&1 ip6tables -t nat -D PREROUTING -p udp -j clash_dns > /dev/null 2>&1 ip6tables -t nat -F clash > /dev/null 2>&1 ip6tables -t nat -X clash > /dev/null 2>&1 ip6tables -t nat -F clash_dns > /dev/null 2>&1 ip6tables -t nat -X clash_dns > /dev/null 2>&1 } start_dns(){ #允许tun网卡接受流量 iptables -I FORWARD -o utun -j ACCEPT ip6tables -I FORWARD -o utun -j ACCEPT #设置dns转发 iptables -t nat -N clash_dns for mac in $(cat $clashdir/mac); do iptables -t nat -A clash_dns -m mac --mac-source $mac -j RETURN done iptables -t nat -A clash_dns -p udp --dport 53 -j REDIRECT --to 1053 iptables -t nat -A PREROUTING -p udp -j clash_dns #ipv6DNS ip6tables -t nat -N clash_dns for mac in $(cat $clashdir/mac); do ip6tables -t nat -A clash_dns -m mac --mac-source $mac -j RETURN done ip6tables -t nat -A clash_dns -p udp --dport 53 -j REDIRECT --to 1053 ip6tables -t nat -A PREROUTING -p udp -j clash_dns } daemon_old(){ #守护进程状态 status=$(ps |grep -w 'clash -d'|grep -v grep) [ -z $status ] && $clashdir/clash -d $clashdir && mark_time } checkcron(){ if [ -d /etc/crontabs/ ]; then cronpath="/etc/crontabs/root" elif [ -d /var/spool/cron/ ]; then cronpath="/var/spool/cron/root" elif [ -d /var/spool/cron/crontabs/ ]; then cronpath="/var/spool/cron/crontabs/root" else echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo "找不到定时任务文件,无法添加定时任务!" fi } start_old(){ #读取配置文件 getconfig #使用内置规则强行覆盖config配置文件 [ "$modify_yaml" != "已开启" ] && modify_yaml #创建clash后台进程 $clashdir/clash -d $clashdir> /dev/null & #修改iptables规则使流量进入clash stop_iptables start_dns [ "$redir_mod" != "Tun模式" ] && start_redir #标记启动时间 mark_time #创建守护进程 checkcron sed -i /start.sh/d $cronpath echo "*/1 * * * * source /etc/profile && source $clashdir/start.sh && daemon_old >/dev/null 2>&1" >> $cronpath #设定启动方式 sed -i /start_old=*/d $ccfg sed -i "1i\start_old=已开启" $ccfg } stop_old(){ #删除守护 checkcron sed -i /start.sh/d $cronpath #结束进程 killall -9 clash &> /dev/null stop_iptables }