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

View File

@@ -59,7 +59,11 @@ markdown_extensions:
- pymdownx.mark - pymdownx.mark
- pymdownx.smartsymbols - pymdownx.smartsymbols
- pymdownx.superfences - pymdownx.superfences
- pymdownx.superfences:
custom_fences:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format
nav: nav:
- 首页: 'index.md' - 首页: 'index.md'
@@ -82,6 +86,7 @@ nav:
- 禁用IPV6: 'config/block-ipv6.md' - 禁用IPV6: 'config/block-ipv6.md'
- DNS64: 'config/dns64.md' - DNS64: 'config/dns64.md'
- 安全相关: 'config/security.md' - 安全相关: 'config/security.md'
- 黑名单分流请求: 'config/forwarding-with-ipset.md'
- 配置选项: 'configuration.md' - 配置选项: 'configuration.md'
- 编译: 'compile.md' - 编译: 'compile.md'
- 常见问题: 'faq.md' - 常见问题: 'faq.md'