安装环境

软路由机器架构: x86_64
OpenWrt版本: 22.03
OpenWrt的IP: 192.168.88.3 (如果不同,后面涉及此地址全部需要修改)

目标

在电脑或手机上手动配置网关,可以直接代理上网

执行前Clash必须已启动且能正常上网

0. 自动安装

  • 如果openWrt未安装tproxy模块则执行下面脚本
wget https://www.shuncs.com/download/instnft_redir.sh && chmod +x instnft_redir.sh && ./instnft_redir.sh
  • 如果openWrt已安装tproxy模块执行下面脚本
wget https://www.shuncs.com/download/instnft_tproxy.sh && chmod +x instnft_tproxy.sh && ./instnft_tproxy.sh

1. 新增私有地址列表

vi /etc/nftables.d/private.nft

将下列内容复制到此文件,然后按:wq退出

define private_list = {
	0.0.0.0/8,
	10.0.0.0/8,
	127.0.0.0/8,
	169.254.0.0/16,
	172.16.0.0/12,
	192.168.0.0/16,  
	224.0.0.0/4,
	240.0.0.0/4
}

2. 新增nftable配置

  • 新增配置文件
vi /etc/nftables.conf
  • 将下面内容复制到此文件,并按:wq保存退出
#!/usr/sbin/nft -f

flush ruleset
define tproxyPort=7893
define redirPort=7892

include "/etc/nftables.d/private.nft"

table inet clash {
    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        ip daddr $private_list return
# 如果未安装tproxy,则将下一行注释掉
        meta l4proto {tcp, udp } tproxy to :$tproxyPort
# 如果已安装tproxy,则将下一行注释掉
        ip protocol tcp redirect to :$redirPort
   }
}

3. 生效Nftable配置

nft flush ruleset
nft -f /etc/nftables.conf

4. 设置在openWrt每次开机自动启动Nftable

  • 新增配置文件
vi /etc/init.d/nft
  • 将下述内容复制到文件中,将按:wq保存退出
#!/bin/sh /etc/rc.common

START=90
STOP=15

USE_PROCD=1
#PROCD_DEBUG=1

CONF=/etc/
CONFFILE=nftables.conf
PROG=/usr/sbin/nft

start_service() {
        procd_open_instance
        procd_set_param command $PROG -f $CONF$CONFFILE
        procd_set_param stdout 1
        procd_set_param stderr 1
        procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-9}
        procd_close_instance
}
  • 修改权限,并使之生效
chmod 755 /etc/init.d/nft
service nft enable
  • 启动nft
service nft start

5. 配置Dnsmasq, 将dns指向Clash的5353端口

uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5353'
uci commit dhcp
service dnsmasq restart

全文完