From dfeefe23fd0be9dc72d9f89d419ee15a5cb384db Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Fri, 17 Mar 2023 23:39:46 +0800 Subject: [PATCH] config: update forwarding with ipset and nftset --- docs/config/forwarding-with-ipset.md | 143 ++++++++++++++++++++++++--- docs/faq.md | 4 +- 2 files changed, 129 insertions(+), 18 deletions(-) diff --git a/docs/config/forwarding-with-ipset.md b/docs/config/forwarding-with-ipset.md index 82d762b..873859e 100644 --- a/docs/config/forwarding-with-ipset.md +++ b/docs/config/forwarding-with-ipset.md @@ -141,42 +141,153 @@ flowchart ipset create public hash:net ``` +1. SmartDNS中配置规则 + + ```shell + ipset /example.com/public + ``` + 1. 设置透明转发规则: Linux透明转发分为TPROXY和REDIRECT两种模式,这两种模式使用上有如下区别,可按需求选择配置。 - 1. 模式:TPROXY,REDIRECT + 模式:TPROXY,REDIRECT - TPROXY:支持UDP,TCP的转发,配置稍复杂。 - REDIRECT:仅支持TCP,配置简单。 + TPROXY:支持UDP,TCP的转发,配置稍复杂。 + REDIRECT:仅支持TCP,配置简单。 - 1. 方式一:仅TCP转发 + 1. 方式一:仅TCP转发(容易) - ```shell - # 设置转发规则,将匹配的请求转发到本机的1081端口 - iptables -t nat -I PREROUTING -p tcp -m set --match-set public dst -j REDIRECT --to-ports 1081 - ``` + * 设置规则 + + ```shell + # 设置转发规则,将匹配的请求转发到本机的1081端口 + iptables -t nat -I PREROUTING -p tcp -m set --match-set public dst -j REDIRECT --to-ports 1081 + ``` + + * 启用转发程序 + + 本机1081端口开启REDIRECT模式的转发程序。 + + * 删除规则: + + ```shell + iptables -t nat -D PREROUTING -p tcp -m set --match-set public dst -j REDIRECT --to-ports 1081 + ``` 1. 方式二:TCP/UDP TPROXY转发 执行shell命令,设置iptable规则,将匹配的域名TCP/UDP请求进行TPROXY方式透明转发,规则参考如下: + * 设置规则 + + ```shell + # 设置路由规则 + ip rule add fwmark 1104 lookup 1104 + ip route add local 0.0.0.0/0 dev lo table 1104 + + # 设置转发规则,UDP,TCP方式的TPROXY转发,将数据转发到本机的1081端口 + iptables -t mangle -N SMARTDNS + iptables -t mangle -A SMARTDNS -p tcp -m set --match-set public 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 public 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端口开启TPROXY模式的转发程序。 + + * 删除规则: + + ```shell + ip rule del fwmark 1104 + iptables -t mangle -D PREROUTING -j SMARTDNS + iptables -t mangle -F SMARTDNS + iptables -t mangle -X SMARTDNS + ``` + +## NFTSET以及透明转发规则配置 + +1. 方式一:仅TCP转发 (容易) + + 1. 创建nftable的nftset集合,集合名称为`#4:ip#nat:public_set` + + ```shell + nft add set ip nat public_set { type ipv4_addr\; flags interval\; auto-merge\; } + ``` + + 1. 设置REDIRECT转发规则 + + ```shell + nft add rule ip nat PREROUTING meta l4proto tcp ip daddr @public_set redirect to :1081 + ``` + + 1. smartdns中配置nftable规则 + + ```shell + nftset /example.com/#4:ip:nat:public_set + ``` + + 1. 启用转发程序 + + 本机1081端口开启REDIRECT模式的转发程序。 + + 1. 注意可以单独创建一张转发表,方便管理,如下,创建smartdns表,nftset名称为`#4:ip#smartdns#public` + + ```shell + # 创建smartdns表 + nft add table ip smartdns + # 创建NFTSET集合 + nft add set ip smartdns public { type ipv4_addr\; flags interval\; auto-merge\; } + # 设置转发规则 + nft add chain ip smartdns prerouting { type nat hook prerouting priority dstnat + 1\; } + nft add rule ip smartdns prerouting meta l4proto tcp ip daddr @public redirect to :1081 + ``` + + ```shell + # 删除表格 + nft delete table ip smartdns + ``` + +1. 方式二:TPROXY模式转发TCP和UDP + + 1. 配置规则 + ```shell # 设置路由规则 ip rule add fwmark 1104 lookup 1104 ip route add local 0.0.0.0/0 dev lo table 1104 - # 设置转发规则,UDP,TCP方式的TPROXY转发,将数据转发到本机的1081端口 - iptables -t mangle -N SMARTDNS - iptables -t mangle -A SMARTDNS -p tcp -m set --match-set public 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 public 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 + # 创建smartdns表 + nft add table ip smartdns + # 创建NFTSET集合 + nft add set ip smartdns public { type ipv4_addr\; flags interval\; auto-merge\; } + # 设置转发规则 + nft add chain ip smartdns prerouting { type filter hook prerouting priority 0\; } + nft add rule ip smartdns prerouting meta l4proto tcp ip daddr @public tproxy to :1081 mark set 1104 + nft add rule ip smartdns prerouting meta l4proto udp ip daddr @public tproxy to :1081 mark set 1104 ``` -## 本机1081端口启用转发程序 + ```shell + # 查询规则 + nft list table ip smartdns + ``` -本机下载安装TPROXY模式的转发程序,并启用1081端口的数据转发服务。 + ```shell + # 删除已有规则 + nft delete table ip smartdns + ``` + + 1. smartdns配置nftset + + ```shell + nftset /example.com/#4:ip#smartdns:public + ``` + + 1. 启用转发程序 + + 本机1081端口开启TPROXY模式的转发程序。 ## 额外说明 diff --git a/docs/faq.md b/docs/faq.md index cb8a482..cf9af0a 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -107,12 +107,12 @@ SmartDNS在早期版本,只会返回一个IP地址,这一个IP地址速度 所以,smartdns从37开始,支持返回多个优选的IP地址,这些优选的IP地址原则是: -1. 如果缓存没有命中,则返回及时返回一个IP地址给客户端,并设置TTL为3,让客户端再次查询。 +1. 如果缓存没有命中,则及时返回一个IP地址给客户端,并设置TTL为3,让客户端再次查询,避免客户端等待。 1. 并行的,smartdns等待所有IP地址的查询结果,并对查询结果进行优选。原则为: - IP列表中的第一个IP为最快地址。 - 其他IP相比第一个IP的速度差不多。 - 速度较差的IP丢弃。 -1. 客户端3秒后,再次查询,将会获的所有最佳IP地址。 +1. 客户端3秒后,再次查询,将会获的所有最佳IP地址,但第一个IP地址仍然为最快,大部分软件也只会使用第一个IP。 值得注意的是,上述机制,是在开启了缓存的情况下,如果缓存未开启,则仍然返回最快的一个地址。