config: add forwarding with ipset guide.

This commit is contained in:
Nick Peng
2023-03-11 16:51:50 +08:00
parent 39efbda313
commit 55966e5b3f
3 changed files with 228 additions and 55 deletions

View File

@@ -0,0 +1,183 @@
---
hide:
- toc
---
# 黑名单分流请求
## 分流流程
分流需要实现的功能如下:
* 内部域名从内部DNS服务器查询并对IP进行测速将最快IP地址返回客户端。
* 外部域名从外部服务器查询外部域名通过域名列表管理IP数据通过TPROXY进行透明转发。
对应的流程图如下:
``` mermaid
%%{init: {'theme':'forest'}}%%
flowchart
style client color:white,fill:#dd5555,stroke:#ee00,stroke-width:2px
style ipset color:white,fill:green,stroke:#ee00,stroke-width:2px
style ipset1 color:white,fill:green,stroke:#ee00,stroke-width:2px
style speed-check color:white,fill:green,stroke:#ee00,stroke-width:2px
client(((客户端)))-----> |1. 请求|smartdns
smartdns---->|2. 获取到IP|client
client--->|3. 使用IP请求数据|router
subgraph smartdns [SmartDNS&nbsp&nbsp]
server(DNS服务)-->|a. 处理规则namserver|rule(域名规则)
rule-->|b. 外部域名|public-group(外部服务器组)
rule-->|b. 内部域名|private-group(内部服务器组)
public-group-->|d. IP加入IPSet|ipset1(IPSet,NFTSet)
private-group-->|d. 测速获取最快IP|speed-check(测速)
end
router-->ipset(IPSet,NFTSet)
subgraph router [路由网关]
NAT-->|a. 收取数据包|ipset-->|b. 数据转发|tproxy(TPROXY转发服务)
end
tproxy----->|VPN|ProxyServer
tproxy----->|SOCKS5|ProxyServer
tproxy----->|HTTP PROXY|ProxyServer
public-group--->|c. 查询外部域名|public-servers(外部DNS服务器)
private-group--->|c. 查询内部域名|private-servers(内部DNS服务器)
```
1. 客户端到SmartDNS服务器查询域名。
1. SmartDNS处理请求。
1. 根据namserver给定的规则判断域名
1. 如果域名为内部域名,则使用内部域名服务器查询;如果域名为外部域名,则使用外部域名服务器查询。
1. 内部域名结果使用测速功能获取最快IP地址后。
1. 外部域名结果获取最快响应DNS结果后将IP地址添加到IPSet/NFTSet中。
1. SmartDNS返回IP地址。
1. 客户端从SmartDNS获取到IP地址。
1. 客户端使用IP地址通过网关请求数据。
1. 网关接受到数据包使用IPSet/NFTSet判断IP规则。
1. 如果IP存在IPSet/NFTSet中外部域名则使用TPROXY将数据发送到远端代理服务器。
1. 如果IP不存在IPSet/NFTSet中内部域名则直接NAT转发数据。
## SmartDNS分流配置
在上述流程图中SmartDNS分流数据需要做如下设置
* 内部域名从内部DNS服务器查询并对IP进行测速将最快IP地址返回客户端。
* 外部域名从外部服务器查询不进行测速将IP地址放入IPSet/NFTSet中供数据转发。
1. 基本配置
启用SmartDNS服务并设置相关的功能。
```shell
# 启用服务器
bind [::]:53
# 启用测速
speed-check-mode ping,tcp:80,tcp:443
# 启用双栈优选
dualstack-ip-selection yes
# 启用缓存和持久化
cache-size 32768
cache-persist yes
prefetch-domain yes
serve-expired yes
```
1. 添加DNS服务器
添加上游服务器,并通过`-group`参数指定内外服务器组。
```shell
# 外部服务器组
server 1.2.3.4 -group public
# 内部服务器组
server 1.2.3.4 -group private
```
注意:
1. 推荐配置多个外部和内部服务器。
1. public外部服务器组可选择配置`-exclude-default-group`参数,避免内部域名通过外部服务器查询。
1. public外部服务器组可以使用`proxy-server`选项配置通过socks5,http代理查询这样结果会更好。
1. 配置域名规则
配置黑名单域名对名单中的域名走public服务器组并关闭测速关闭IPV6加入IPSET。
```shell
# 添加域名列表,格式为一行一个域名
domain-set -name public-domain-list -file /path/to/public/domain/list
# 设置对应域名列表的规则。
domain-rules /domain-set:public-domain-list/ -ipset public -nftset #4:ip#table#set -c none -address #6 -nameserver public
```
注意:
1. 域名列表可以配置crontab周期自动更新其格式为一行一个域名。
```shell
a.com
b.com
...
```
1. 域名规则中:
1. -ipset: 表示添加结果到对应的ipset名称`public`为例子可按需修改为对应的ipset名称。
1. -nftset: 表示添加结果到对应的nftset名称`#4:ip#table#set`为例子需要修改为对应的ipset名称。
1. -c none: 表示禁用测速具体参数参考speed-check-mode。
1. -address #6: 表示禁用IPV6如果转发程序支持IPV6则可以不使用此参数。
1. -nameserver public: 表示使用public组的DNS服务器解析结果。
## IPSET以及透明转发规则配置
为配合smartdns完成外部请求的转发好需要配置相关的ipset和规则。具体配置步骤如下
1. 创建IPSet
执行shell命令创建IPSET。
```shell
# 创建ipset集合
ipset create public hash:net
```
1. 设置透明转发规则:
Linux透明转发分为TPROXY和REDIRECT两种模式这两种模式使用上有如下区别可按需求选择配置。
1. 模式TPROXYREDIRECT
TPROXY支持UDPTCP的转发配置稍复杂。
REDIRECT仅支持TCP配置简单。
1. 方式一仅TCP转发
```shell
# 设置转发规则将匹配的请求转发到本机的1081端口
iptables -t nat -I 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模式的转发程序并启用1081端口的数据查询服务。
## 额外说明
如果使用OpenWrt的luci界面可以直接在界面配置相关的域名分流规则。

View File

@@ -12,77 +12,62 @@ hide:
iptable成熟的路由规则配置工具。
nftable更加强大的规则配置工具正在成为主流。
1. 模式TPROXYREDIRECT
## ipset配置
TPROXY支持UDPTCP的转发配置稍复杂。
REDIRECT仅支持TCP配置简单。
1. 基本配置
1. 配置REDIRECT或TPROXY转发规则
通过如下参数可以配置指定域名的IPSet规则
在smartdns.conf中设置需要透明转发的域名列表比如要将`example.com`进行透明转发。则使用ipset选项设置`example.com`的ipset规则为`proxy`
```shell
nftset /domain/[#4:ip#table#set,#6:ipv6#table#setv6]
```
```shell
# 设置规则
# -ipset proxy: 匹配的域名设置到ipset:tproxy中。
# -c none: 停用测速
# -address #6: 停用IPV6解析。
domain-rules /example.com/ -ipset proxy -c none -address #6
```
1. 超时
1. 方式一: TCP REDIRECT转发
SmartDNS设置IPSet支持设置是否启用超时功能这样可以避免IPSet中过多IP地址网关性能下降。启用方式为
- 此方式配置简单仅支持TCP的转发。
执行shell命令设置iptable规则如果仅转发TCP则可以直接使用REDIRECT的规则如果需要同时转发UDP和TCP可以使用TPROXY的转发规则。如下规则按实际需求选择。具体配置如下
```shell
nftset-timeout yes
```
```shell
# 创建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
```
1. 测速失败后自动添加到IPSet
- 在本机1081端口开启REDIRECT模式的转发程序。
SmartDNS可以将测速失败的IP地址加入IPSet再由相关IP规则转发
1. 方式二TCP/UDP TPROXY转发
```shell
nftset-no-speed ipsetname
```
- 此方式可同时转发TCP和UDP。
执行shell命令设置iptable规则将匹配的域名TCP/UDP请求进行TPROXY方式透明转发规则参考如下
1. DEBUG调试
```shell
# 设置路由规则
ip rule add fwmark 1104 lookup 1104
ip route add local 0.0.0.0/0 dev lo table 1104
如需要Debug调试可以开启nftset的调试功能。
# 创建ipset集合
ipset create proxy hash:net
```shell
nftset-debug yes
```
# 设置转发规则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
```
## nftset配置
- 在本机的1081端口启动IP透明转发程序。
1. 基本配置
1. 额外说明
通过如下参数可以配置指定域名的NFTSet规则
- 为保证DNS查询结果的位置亲和性可以使用smartdns的`server`代理参数,将对应域名的查询请求,通过代理查询,使结果位置更好。如:
```shell
ipset /domain/ipset
```
```shell
# 增加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
```
1. 超时
- 如需要配合测速自动完成ipset的设置可增加如下配置参数
SmartDNS设置IPSet支持设置是否启用超时功能这样可以避免NFTSet中过多IP地址网关性能下降。启用方式为
```shell
ipset-no-speed proxy
```
```shell
ipset-timeout yes
```
如果使用OpenWrt的luci界面可以直接在界面配置相关的域名分流规则。
1. 测速失败后自动添加到IPSet
SmartDNS可以将测速失败的IP地址加入IPSet再由相关IP规则转发
```shell
ipset-no-speed ipsetname
```