config: update forwarding with ipset and nftset

This commit is contained in:
Nick Peng
2023-03-17 23:39:46 +08:00
parent af557bda6a
commit dfeefe23fd
2 changed files with 129 additions and 18 deletions

View File

@@ -141,42 +141,153 @@ flowchart
ipset create public hash:net
```
1. SmartDNS中配置规则
```shell
ipset /example.com/public
```
1. 设置透明转发规则:
Linux透明转发分为TPROXY和REDIRECT两种模式这两种模式使用上有如下区别可按需求选择配置。
1. 模式TPROXYREDIRECT
模式TPROXYREDIRECT
TPROXY支持UDPTCP的转发配置稍复杂。
REDIRECT仅支持TCP配置简单。
TPROXY支持UDPTCP的转发配置稍复杂。
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
# 设置转发规则UDPTCP方式的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
# 设置转发规则UDPTCP方式的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模式的转发程序。
## 额外说明

View File

@@ -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
值得注意的是,上述机制,是在开启了缓存的情况下,如果缓存未开启,则仍然返回最快的一个地址。