Files
smartdns/docs/config/ipset-nftset.md
2023-03-10 23:53:17 +08:00

3.5 KiB
Raw Blame History

hide
hide
toc

使用ipset和nftset

和Dnsmasq类似smartdns支持ipset和nftset可以将特定的域名通过TPROXY进行透明转发透明转发涉工具模式对比如下

  1. 工具iptablenftable

    iptable成熟的路由规则配置工具。
    nftable更加强大的规则配置工具正在成为主流。

  2. 模式TPROXYREDIRECT

    TPROXY支持UDPTCP的转发配置稍复杂。
    REDIRECT仅支持TCP配置简单。

  3. 配置REDIRECT或TPROXY转发规则

    在smartdns.conf中设置需要透明转发的域名列表比如要将example.com进行透明转发。则使用ipset选项设置example.com的ipset规则为proxy

    # 设置规则
    # -ipset proxy: 匹配的域名设置到ipset:tproxy中。
    # -c none: 停用测速
    # -address #6: 停用IPV6解析。
    domain-rules /example.com/ -ipset proxy -c none -address #6
    
    1. 方式一: TCP REDIRECT转发

      • 此方式配置简单仅支持TCP的转发。
        执行shell命令设置iptable规则如果仅转发TCP则可以直接使用REDIRECT的规则如果需要同时转发UDP和TCP可以使用TPROXY的转发规则。如下规则按实际需求选择。具体配置如下
      # 创建ipset集合
      ipset create proxy hash:net
      # 设置转发规则将匹配的请求转发到本机的1081端口
      iptables -t nat -I PREROUTING -p tcp -m set --match-set proxy dst -j REDIRECT --to-ports 1081
      
      • 在本机1081端口开启REDIRECT模式的转发程序。
    2. 方式二TCP/UDP TPROXY转发

      • 此方式可同时转发TCP和UDP。
        执行shell命令设置iptable规则将匹配的域名TCP/UDP请求进行TPROXY方式透明转发规则参考如下
      # 设置路由规则
      ip rule add fwmark 1104 lookup 1104
      ip route add local 0.0.0.0/0 dev lo table 1104
      
      # 创建ipset集合
      ipset create proxy hash:net
      
      # 设置转发规则UDPTCP方式的TPROXY转发
      iptables -t mangle -N SMARTDNS
      iptables -t mangle -A SMARTDNS -p tcp -m set --match-set proxy dst -j TPROXY --on-ip 127.0.0.1 --on-port 1081 --tproxy-mark 1104
      iptables -t mangle -A SMARTDNS -p udp -m set --match-set proxy dst -j TPROXY --on-ip 127.0.0.1 --on-port 1081 --tproxy-mark 1104
      iptables -t mangle -A SMARTDNS -j ACCEPT
      iptables -t mangle -A PREROUTING -j SMARTDNS
      
      • 在本机的1081端口启动IP透明转发程序。
  4. 额外说明

    • 为保证DNS查询结果的位置亲和性可以使用smartdns的server代理参数,将对应域名的查询请求,通过代理查询,使结果位置更好。如:
    # 增加DNS上游并设置通过名称为proxy的代理查询查询组为pass
    server 1.2.3.4 -proxy proxy -group pass -exclude-default-group
    # 设置代理服务器信息代理的名称为proxy
    proxy-server socks5://user:name@1.2.3.4 -name proxy
    # 设置域名规则对匹配的域名使用代理查询结果并将结果设置到ipset中。
    domain-rules /example.com/ -ipset proxy -c none -address #6 -nameserver pass
    
    • 如需要配合测速自动完成ipset的设置可增加如下配置参数
    ipset-no-speed proxy
    

如果使用OpenWrt的luci界面可以直接在界面配置相关的域名分流规则。