使用iptables和ipset配合clash以及smartdns优化debian系统网关
需求:使用iptables工具可以实现国内流量直接连接,国外流量走Clash代理的配置
实施步骤:
-
准备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 等较新的代理工具 -
安装必要的工具:
- 确保你的系统已经安装了iptables和ipset。如果没有安装,可以通过包管理器安装它们。例如,在Debian/Ubuntu系统中使用
sudo apt-get install iptables ipset
,在CentOS系统中使用sudo yum install ipset
。
- 确保你的系统已经安装了iptables和ipset。如果没有安装,可以通过包管理器安装它们。例如,在Debian/Ubuntu系统中使用
-
创建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
来验证是否添加成功。 -
配置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
-
持久化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(如果有)文件里面的规则,并从新写入防火墙现有的规则
-
安装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
-
测试和调试:
- 在应用规则后,使用
iptables -L -v -n
和ipset list china_net
来检查规则和IP集合是否正确。 - 测试访问国内和国外网站,确保流量按预期分流。
- 在应用规则后,使用
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。