需求:使用iptables工具可以实现国内流量直接连接,国外流量走Clash代理的配置

实施步骤:

  1. 准备IP地址列表

    ①项目一:https://github.com/17mon/china_ip_list/tree/master

    wget https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt

    这将会从指定的URL下载china_ips.txt文件到当前目录下。

    ②项目二:https://github.com/Hackl0us/GeoIP2-CN

    📦 项目 📃 文件 🐙 GitHub RAW 🚀 CDN 加速 🔧 适用范围
    IP-CIDR 列表 CN-ip-cidr.txt 点我下载 点我起飞 防火墙、较老的代理工具等
    GeoIP2 数据库 Country.mmdb 点我下载 点我起飞 Surge, Shadowrocket, QuantumultX, Clash 等较新的代理工具
  2. 安装必要的工具

    • 确保你的系统已经安装了iptables和ipset。如果没有安装,可以通过包管理器安装它们。例如,在Debian/Ubuntu系统中使用sudo apt-get install iptables ipset,在CentOS系统中使用sudo yum install ipset
  3. 创建ipset并添加国内IP

    sudo ipset create china_net hash:net
    ipset -A china_net 10.0.0.0/8 #这个命令会将整个10.0.0.0/8地址段添加到china_net集合中
    ipset -D china_net 192.168.1.0/24 #这个命令会从china_net集合中删除192.168.1.0/24这个地址段
    #一个包含多个CIDR格式IP地址段的文本文件,一次性将这些IP地址段全部添加到china_net集合中
    cat china_ip_list.txt | xargs -L 1 ipset -A china_net
    #这个命令使用cat来读取文件,xargs来处理每一行,-L 1告诉xargs每次从输入读取一行,并将该行作为参数传递给ipset -A china_net命令。

    请注意,每行应该只包含一个CIDR格式的IP地址段。如果您的文件中的IP地址段格式正确,并且您按照上述命令操作,那么这些IP地址段将会被成功添加到china_net集合中。添加完成后,您可以再次运行ipset list china_net来验证是否添加成功。

  4. 配置iptables规则

    ①方法一:配置文件

    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    #######################
    -A FORWARD -j ACCEPT
    ######################
    COMMIT
    ######################
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :CLASH_DNS_EXTERNAL - [0:0]
    :CLASH_DNS_LOCAL - [0:0]
    :CLASH_EXTERNAL - [0:0]
    :CLASH_LOCAL - [0:0]
    #######################################
    -A PREROUTING -m set --match-set china_net dst -j ACCEPT
    -A PREROUTING -j CLASH_EXTERNAL
    ######################################
    -A OUTPUT -p udp -j CLASH_DNS_LOCAL
    -A OUTPUT -p tcp -j CLASH_LOCAL
    ########################################
    -A CLASH_DNS_EXTERNAL -p udp -m udp ! --dport 53 -j RETURN
    -A CLASH_DNS_EXTERNAL -p udp -j REDIRECT --to-ports 53
    #######################################
    -A CLASH_DNS_LOCAL -p udp -m udp ! --dport 53 -j RETURN
    -A CLASH_DNS_LOCAL -m owner --uid-owner 0 -j RETURN
    -A CLASH_DNS_LOCAL -p udp -j REDIRECT --to-ports 53
    ########################################
    -A CLASH_EXTERNAL -p tcp -m mark --mark 0xff -j RETURN
    -A CLASH_EXTERNAL -d 0.0.0.0/8 -j RETURN
    -A CLASH_EXTERNAL -d 127.0.0.0/8 -j RETURN
    -A CLASH_EXTERNAL -d 224.0.0.0/4 -j RETURN
    -A CLASH_EXTERNAL -d 172.16.0.0/12 -j RETURN
    -A CLASH_EXTERNAL -d 127.0.0.0/8 -j RETURN
    -A CLASH_EXTERNAL -d 169.254.0.0/16 -j RETURN
    -A CLASH_EXTERNAL -d 240.0.0.0/4 -j RETURN
    -A CLASH_EXTERNAL -d 192.168.0.0/16 -j RETURN
    -A CLASH_EXTERNAL -d 10.0.0.0/8 -j RETURN
    -A CLASH_EXTERNAL -p tcp -j REDIRECT --to-ports 7892
    ############################################
    -A CLASH_LOCAL -m owner --uid-owner 0 -j RETURN
    -A CLASH_LOCAL -d 0.0.0.0/8 -j RETURN
    -A CLASH_LOCAL -d 127.0.0.0/8 -j RETURN
    -A CLASH_LOCAL -d 224.0.0.0/4 -j RETURN
    -A CLASH_LOCAL -d 172.16.0.0/12 -j RETURN
    -A CLASH_LOCAL -d 127.0.0.0/8 -j RETURN
    -A CLASH_LOCAL -d 169.254.0.0/16 -j RETURN
    -A CLASH_LOCAL -d 240.0.0.0/4 -j RETURN
    -A CLASH_LOCAL -d 192.168.0.0/16 -j RETURN
    -A CLASH_LOCAL -d 10.0.0.0/8 -j RETURN
    -A CLASH_LOCAL -p tcp -j REDIRECT --to-ports 7892
    #########################################
    COMMIT

    ②方法二:配置文件

    *filter
    :INPUT ACCEPT [0:0]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [0:0]
    #######################
    -A FORWARD -j ACCEPT
    COMMIT
    #################################
    *nat
    :PREROUTING ACCEPT [0:0]
    :INPUT ACCEPT [0:0]
    :POSTROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    :clash - [0:0]
    :smartdns - [0:0]
    :local - [0:0]
    #######################################
    -A PREROUTING -m set --match-set china_net dst -j ACCEPT
    -A PREROUTING -j clash
    ######################################
    -A OUTPUT -p udp -j smartdns
    -A OUTPUT -p tcp -j local
    #####################################
    -A smartdns -p udp -m udp ! --dport 53 -j RETURN
    -A smartdns -m owner --uid-owner 0 -j RETURN
    -A smartdns -p udp -j REDIRECT --to-ports 53
    #####################################
    #-A clash -p udp -m udp ! --dport 53 -j RETURN
    #-A clash -p udp -j REDIRECT --to-ports 53
    -A clash -d 0.0.0.0/8 -j RETURN
    -A clash -d 127.0.0.0/8 -j RETURN
    -A clash -d 224.0.0.0/4 -j RETURN
    -A clash -d 172.16.0.0/12 -j RETURN
    -A clash -d 127.0.0.0/8 -j RETURN
    -A clash -d 169.254.0.0/16 -j RETURN
    -A clash -d 240.0.0.0/4 -j RETURN
    -A clash -d 192.168.0.0/16 -j RETURN
    -A clash -d 10.0.0.0/8 -j RETURN
    -A clash -p tcp -j REDIRECT --to-ports 7892
    ##################################
    -A local -m owner --uid-owner 0 -j RETURN
    -A local -d 0.0.0.0/8 -j RETURN
    -A local -d 127.0.0.0/8 -j RETURN
    -A local -d 224.0.0.0/4 -j RETURN
    -A local -d 172.16.0.0/12 -j RETURN
    -A local -d 127.0.0.0/8 -j RETURN
    -A local -d 169.254.0.0/16 -j RETURN
    -A local -d 240.0.0.0/4 -j RETURN
    -A local -d 192.168.0.0/16 -j RETURN
    -A local -d 10.0.0.0/8 -j RETURN
    -A local -p tcp -j REDIRECT --to-ports 7892
    #################################
    COMMIT

    ③方法二:命令配置

    #允许转发流量
    iptables -t filter -A FORWARD -j ACCEPT
    #在mangle表PREROUTING链中对目的地址是国内ip的流量打标签0xff
    iptables -t mangle -A PREROUTING -m set --match-set china_net dst -j MARK --set-mark 0xff
    iptables -t nat -N clash
    #在nat表clash链中,对标签为0xff的流量不做处理
    iptables -t nat -A clash -p tcp -j RETURN -m mark --mark 0xff
    iptables -t nat -A clash -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A clash -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A clash -d 172.16.0.0/12 -j RETURN
    iptables -t nat -A clash -d 10.0.0.0/8 -j RETURN
    iptables -t nat -A clash -d 240.0.0.0/4 -j RETURN
    iptables -t nat -A clash -d 169.254.0.0/16 -j RETURN
    iptables -t nat -A clash -p tcp -j REDIRECT --to-ports 7892
    #所有流量
    iptables -t nat -A PREROUTING -j clash
    #只提取TCP流量
    iptables -t nat -A PREROUTING -p tcp -j clash
    #查看规则
    iptables -t nat --line-number
    #删除规则
    iptables -t nat -D PREROUTING 2
    #清空规则
    iptables -t nat -F clash
    #删除链
    iptables -t nat -X clash
    #匹配非53的udp流量
    iptables -t nat -I clash -p udp -m udp ! --dport 53 -j RETURN
    #匹配53的udp流量
    iptables -t nat -I clash -p udp --dport 53 -j REDIRECT --to-port 53
    iptables -t nat -I PREROUTING -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:53
    #劫持dns流量
    iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53
    iptables -t nat -I PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53
    iptables -t nat -A POSTROUTING -p udp --dport 53 -j MASQUERADE
    #iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:5335
    #iptables -t nat -A POSTROUTING -p udp -d 127.0.0.1 --dport 5335 -j MASQUERADE
    #这里,PREROUTING链用于修改进入的数据包,POSTROUTING链用于修改出去的数据包。DNAT将目标地址修改为本地的SmartDNS服务地址(通常是127.0.0.1:5335),MASQUERADE则隐藏源地址,使得SmartDNS服务看起来像是请求的发起者。
    #根据MAC地址限制上网时间
    iptables -I FORWARD  -m mac --mac-source 1C:E4:87:29:37:CD  -m time --timestart 06:30:00 --timestop 11:00:00 --kerneltz -j DROP
  5. 持久化iptables规则

    apt-get install iptables-persistent

    通上面的操作会在/etc目录下生成/iptables目录,并生成rules.v4文件用于存放IPv4规则,如果保存IPv6规则也会生产一个rules.v6文件。可以通过dpkg-reconfigure iptables-persistent命令从新启动刚才的选项进行配置即可。

    iptables-persistent程序的命令是netfilter-persistent使用的语法如下

    netfilter-persistent  选项(start|stop|restart|reload|flush|save)
    start:启动目录/etc/iptables/下rules.v4和rules.v6(如果有)文件里面的规则
    stop:启动目录/etc/iptables/下rules.v4和rules.v6(如果有)文件里面的规则,暂时不可用,被flush选项取代
    restart:从新启动目录/etc/iptables/下rules.v4和rules.v6(如果有)文件里面的规则
    reload:从新加载动目录/etc/iptables/下rules.v4和rules.v6(如果有)文件里面的规则
    flush:清除防火墙的规则,但是不会清空/etc/iptables/下rules.v4和rules.v6(如果有)文件里面的规则
    save:保持防火墙的规则,会清空/etc/iptables/下rules.v4和rules.v6(如果有)文件里面的规则,并从新写入防火墙现有的规则
  6. 安装smartdns

    在https://github.com/pymumu/smartdns/下载对应版本smartdns。修改/etc/smartdns/smartdns.conf文件

    #可以分组配置
    #bind [::]:8053 -group china -no-speed-check -group out -no-dualstack-selection
    #bind-tcp [::]:8053 -group china -no-speed-check -group out -no-dualstack-selection
    #bind [::]:7053 -no-speed-check -group out -no-dualstack-selection
    #bind-tcp [::]:7053 -no-speed-check -group out -no-dualstack-selection
    #server 8.8.8.8:53 -group out
    #server 114.114.114.114:53 -group china
    
    bind [::]:53
    bind-tcp [::]:53
    
    speed-check-mode ping|tcp:43,tcp:80
    force-AAAA-SOA yes
    
    log-level info
    #cache-size 0
    cache-size 32768
    cache-persist yes
    cache-file /var/cache/smartdns/
    
    serve-expired yes
    serve-expired-ttl 259200
    serve-expired-reply-ttl 3
    prefetch-domain yes
    serve-expired-prefetch-time 21600
    
    cache-checkpoint-time 86400
    
    #wget https://anti-ad.net/anti-ad-for-smartdns.conf -O /etc/smartdns/anti-ad-smartdns.conf
    conf-file /etc/smartdns/anti-ad-smartdns.conf
    
    server 192.168.10.2:53
    server 114.114.114.114:53
    server 119.29.29.29:53
    server 180.76.76.76:53
    server 1.2.4.8:53
    server 223.5.5.5:53
    server 1.2.4.8:53
    
    server 8.8.8.8:53
    server 208.67.222.222:53
    server 166.111.8.28:53
    
    server-tls 8.8.8.8:853 
    server-tls 149.112.112.112:853 
    server-tls 208.67.222.222:853 
    server-tls https://i.233py.com/dns-query:853 
    server-tls https://dns.233py.com/dns-query:853 
    
    server-https https://dns.quad9.net/dns-query 
    server-https https://cloudflare-dns.com/dns-query 
    server-https https://dns.google/dns-query 
    server-https https://doh.opendns.com/dns-query https 
  7. 测试和调试

    • 在应用规则后,使用iptables -L -v -nipset list china_net来检查规则和IP集合是否正确。
    • 测试访问国内和国外网站,确保流量按预期分流。