Skip to content

Commit

Permalink
优化文档
Browse files Browse the repository at this point in the history
  • Loading branch information
ruijzhan committed Sep 28, 2024
1 parent 2916ecc commit f3e0acd
Showing 1 changed file with 52 additions and 50 deletions.
102 changes: 52 additions & 50 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,109 +2,113 @@

[![built with Codeium](https://codeium.com/badges/main)](https://codeium.com) [![Daily Make and Commit](https://github.com/ruijzhan/chnroute/actions/workflows/main.yaml/badge.svg)](https://github.com/ruijzhan/chnroute/actions/workflows/main.yaml)

## 持续更新的中国 IP 地址列表和 gfwlist 域名列表
## 自动更新的中国 IP 地址和 GFW 域名列表

生成的脚本可用于 RouterOS 路由器系统
本项目提供持续更新的中国 IP 地址列表和 gfwlist 域名列表,并生成可用于 RouterOS 路由器的配置脚本。

### 1 更新规则
### 1. 规则更新

中国的所有 IP 网段来自 [这个网页](http://www.iwik.org/ipcountry/mikrotik/CN)。被 gfw 污染的域名列表被项目 [gfwlist](https://github.com/gfwlist/gfwlist) 所维护。我们可以运行下面的命令来获取最新的列表,并生成相应的 RouterOS 规则导入脚本:
- **中国 IP 网段**:来自 [此网站](http://www.iwik.org/ipcountry/mikrotik/CN)
- **被 GFW 污染的域名**:由 [gfwlist 项目](https://github.com/gfwlist/gfwlist)维护。

您可以通过以下命令来更新列表并生成 RouterOS 规则脚本:

```shell
# 更新列表并生成 RouterOS 规则导入脚本
# 更新列表并生成 RouterOS 规则脚本
make
```

这个脚本会生成以下几个文件:
生成的文件包括:

- **[CN.rsc](./CN.rsc)**:中国大陆的 IPv4 地址段,由 [IANA](https://www.iana.org/) 分配。
- **[LAN.rsc](./LAN.rsc)**:内网 IPv4 地址段。
- **[gfwlist.rsc](./gfwlist.rsc)**:从 gfwlist 生成的 RouterOS 脚本,包含被 GFW 污染的域名。
- **[gfwlist_v7.rsc](./gfwlist_v7.rsc)**:适用于 RouterOS v7.6 及以上版本的 gfwlist 脚本。

- [CN.rsc](./CN.rsc): 由 [IANA](https://www.iana.org/) 组织分配给中国大陆使用的 IPv4 地址段
- [LAN.rsc](./LAN.rsc): 内网 IPv4 地址段
- [gfwlist.rsc](./gfwlist.rsc): 从 gfwlist 项目生成的 RouterOS 脚本,包含了已知的被污染的域名
- [gfwlist_v7.rsc](./gfwlist_v7.rsc): 适用于 > RouterOS v7.6 的 gfwlist 脚本
在生成规则前,您可以通过修改 `exclude_list.txt``include_list.txt` 手动剔除或加入特定的域名。

在生成规则前,也可以将域名加入 exlucde_list.txt 和 include_list.txt 列表来手动**剔除/加入**被特殊解析的域名。
### 2. 中国 IP 网段导入与应用

### 2 中国 IP 网段列表的导入和使用
导入中国 IP 网段有助于配置流量分流。在科学上网的场景中,可以标记目标 IP 不属于 CN 或 LAN 列表的流量,通过特定路由规则走科学上网路线。

中国的 IP 网段可以帮助配置流量分流。科学上网时,dst IP 地址为非 CN 且非 LAN 地址列表中的请求,可以标记路由走科学上网的路线。
#### 2.1 导入中国 IP 网段到 RouterOS

#### 2.1 可以使用以下脚本将 CN 和 LAN 的 IP 网段列表导入 RouterOS
使用以下脚本将 CN 和 LAN 的 IP 网段导入 RouterOS

```ros
/system script
add dont-require-permissions=no name=cn owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="/tool fetch url=https://raw.githubusercontent.com/ruijzhan/chnroute/master/CN.rsc\r\
\nimport file-name=CN.rsc\r\
\nfile remove CN.rsc\r\
\n\r\
\n/tool fetch url=https://raw.githubusercontent.com/ruijzhan/chnroute/master/LAN.rsc\r\
\nimport file-name=LAN.rsc\r\
\nfile remove LAN.rsc"
add dont-require-permissions=no name=cn owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="
/tool fetch url=https://raw.githubusercontent.com/ruijzhan/chnroute/master/CN.rsc
import file-name=CN.rsc
file remove CN.rsc
/tool fetch url=https://raw.githubusercontent.com/ruijzhan/chnroute/master/LAN.rsc
import file-name=LAN.rsc
file remove LAN.rsc"
```

#### 2.2 科学上网规则的配置
#### 2.2 科学上网规则配置

为了筛选出目标 IP 国外的地址的连接,在 PREROUTING 链中,配置目标地址为非 CN 的连接,JUMP 到一个自定义链中。然后在自定义链中的第一条规则上,配置目标地址为 LAN 的连接直接进行 RETURN 操作。在余下的规则中,自行指定连接协议以及目标端口号进行路由标记 (mark routing) 。最后在路由表中将这些连接路由到科学上网的网关。
`PREROUTING` 链中,将目标地址不属于 CN 的流量跳转到自定义链,并在自定义链中配置以下规则:

### 3 使用 gfwlist 避免域名解析污染,同时优化解析和线路速度
1. 匹配目标地址属于 LAN 的流量,直接 `RETURN`
2. 对剩余流量根据连接协议和目标端口标记路由。
3. 在路由表中将这些流量指向科学上网的网关。

开源项目 [chinadns](https://github.com/shadowsocks/ChinaDNS) 的工作原理是同时将一个域名发往国内和未被污染的国外的 DNS 上游服务器进行解析,然后根据返回的结果决定是使用国内服务器返回的结果还是国外的结果。这样做虽然可以解决域名污染的问题,并尽量使用 CDN 友好的解析结果。但是由于解析任何域名都必须等待国外 DNS 服务器的响应才能做出判断,所以通常一次解析要耗时 300 ms 以上。
### 3. 使用 gfwlist 优化 DNS 解析

[gfwlist](https://github.com/gfwlist/gfwlist) 维护了一个较为齐全的被 gfw 污染的域名的列表,而 RouterOS 又提供了指定匹配正则表达式的域名用指定的上游 DNS 服务器进行解析。将两者结合起来可以实现未被污染的域名直接用速度较快的国内 DNS 服务器解析;而被污染的域名使用速度较慢的却无污染的国外 DNS 服务器进行解析
[gfwlist](https://github.com/gfwlist/gfwlist) 提供了被 GFW 污染的域名列表,配合 RouterOS 的正则表达式匹配功能,可以为被污染和未被污染的域名设置不同的 DNS 服务器,从而优化解析速度

#### 3.1 在 RouterOS 中用环境变量指定无污染 DNS 服务器
#### 3.1 配置无污染的 DNS 服务器

可以使用 VPN 的远端网关 IP 或者翻墙 8.8.8.8 这类 IP,在 RouterOS 上得到一个无污染的 DNS 服务器,然后将其 IP 设置为 RouerOS 的全局变量。由于每次 RouterOS 重启后环境变量会丢失,所以要用 scheduler 在每次开机的时候重新设置。以 DNS 服务器 192.168.9.1 为例
在 RouterOS 中设置全局变量 `dnsserver` 来指定无污染的 DNS 服务器(如 8.8.8.8)。以下脚本会在每次系统启动时重新设置 DNS 服务器:

```ros
/system scheduler
add name=envs on-event="{\r\
\n :global dnsserver 8.8.8.8;\r\
\n}" policy=read,write,policy,test start-time=startup
```

达到以下效果
使用以下命令查看环境变量

```shell
[admin@RouterBoard] > /system/script/environment/print
Columns: NAME, VALUE
# NAME VALUE
0 dnsserver 8.8.8.8

```

#### 3.2 导入 gfwlist 列表到 RouterOS
#### 3.2 导入 gfwlist RouterOS

用下面的命令将脚本导入 RouterOS:
使用以下命令将 gfwlist 列表导入 RouterOS:

```ros
/system script
add dont-require-permissions=no name=gfwlist owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=\
"{\r\
\n /tool fetch url=https://raw.githubusercontent.com/ruijzhan/chnroute/master/gfwlist.rsc\r\
\n /import file-name=gfwlist.rsc\r\
\n /file remove gfwlist.rsc\r\
\n :log warning \"gfwlist\D3\F2\C3\FB\B5\BC\C8\EB\CD\EA\B3\C9\"\r\
\n}"
add dont-require-permissions=no name=gfwlist owner=admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source="
/tool fetch url=https://raw.githubusercontent.com/ruijzhan/chnroute/master/gfwlist.rsc
/import file-name=gfwlist.rsc
/file remove gfwlist.rsc
:log warning \"gfwlist 域名导入成功\""
```

**注意**:RouterOS v7.6 版本中,DNS FWD 规则支持了 Match Subdomains 选项,在上方脚本中导入 [gfwlist_v7.rsc](./gfwlist_v7.rsc) 解析会更高
**注意**:RouterOS v7.6 版本新增了 `Match Subdomains` 选项,可导入 [gfwlist_v7.rsc](./gfwlist_v7.rsc) 以提升解析性能

**注意**几千条规则会用尽 DNS 的默认 2M 大小的缓存,需要将 DNS 缓存的大小设置为 20560KiB 或者更大
**注意**几千条 DNS 规则可能超出默认缓存 2M 的大小,需将 DNS 缓存大小设为 20560KiB 或更大

```ros
/ip/dns/set cache-size=20560KiB
```

用命令查看导入的解析规则
使用以下命令查看导入的 DNS 解析规则

```ros
/ip/dns/static/print
```

此时的整个 dns 的设置为
配置后的 DNS 设置示例如下

```ros
```shell
[admin@RouterBoard] > /ip/dns/print
servers: 223.5.5.5,223.6.6.6
dynamic-servers:
Expand All @@ -119,15 +123,13 @@ add dont-require-permissions=no name=gfwlist owner=admin policy=ftp,reboot,read,
cache-size: 20560KiB
cache-max-ttl: 1w
cache-used: 16957KiB
```

此时所有满足规则中正则表达式的域名,都会走指定的例如 8.8.8.8 这样干净且查询缓慢的服务器进行解析。而其他绝大多数没有被污染的域名依然走 223.5.5.5 这类国内服务器解析在几 ms 内得到结果
所有符合规则的域名解析请求将由指定的无污染 DNS 服务器(如 8.8.8.8)处理,其他未被污染的域名仍由国内 DNS 服务器解析

但在绝大多数国内的环境下,8.8.8.8 返回的结果也是被污染的。我们需要随时更换 gfwlist 中的域名的 DNS 服务器,而重新设置 $dnsserver 变量和导入脚本是耗时的操作。此时我们可以在路由器的 output 链上设置以下 dnat 规则,将目标地址为 8.8.8.8 的请求,转发到任意 IP 上
如果国内环境中 8.8.8.8 返回的结果依然被污染,可以通过以下 `dst-nat` 规则将目标地址为 8.8.8.8 的流量重定向到其他干净的 DNS 服务器

```ros
/ip/firewall/nat
add action=dst-nat chain=output comment=BuyVM dst-address=8.8.8.8 to-addresses=\
192.168.9.1
add action=dst-nat chain=output comment=BuyVM dst-address=8.8.8.8 to-addresses=192.168.9.1
```

0 comments on commit f3e0acd

Please sign in to comment.