Skip to content

Commit 22c6e80

Browse files
committed
routing, firewall: Add ipset and wlt-lite
1 parent 8a6ceff commit 22c6e80

File tree

3 files changed

+80
-4
lines changed

3 files changed

+80
-4
lines changed

docs/ops/network/firewall.md

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,59 @@ conntrack -L -p udp --dport 53
234234

235235
### IPset {#ipset}
236236

237-
IPset 是
237+
IPset 是 Netfilter 的一个扩展模块,用于管理 IP 地址集合(set),可以高效地匹配大量的 IP 地址或网络段。
238+
239+
IPset 的用户态工具为 [`ipset(8)`][ipset.8],可以创建、删除和管理 IPset 集合。
240+
IPset 支持多种集合类型,如 `hash:ip`(单个 IP 地址的哈希集合)、`hash:net`(CIDR 网段的哈希集合)和 `bitmap:ip`(IP 地址的 bitmap 集合)等。
241+
完整的集合类型和用法可以参考 `ipset help` 的输出,以下给出一些基本的示例:
242+
243+
```shell title="创建集合、添加和删除地址"
244+
ipset create blacklist hash:ip
245+
ipset add blacklist 192.0.2.1
246+
ipset del blacklist 192.0.2.1
247+
248+
# 即使地址已存在(add 操作)或不存在(del 操作),也不会报错
249+
ipset add -exist blacklist 192.0.2.1
250+
ipset del -exist blacklist 192.0.2.1
251+
```
252+
253+
IPset 集合可以在 iptables 或 nftables 规则中使用,实现高效的地址匹配。例如:
254+
255+
```shell
256+
iptables -A INPUT -m set --match-set blacklist src -j DROP
257+
```
258+
259+
其中 `--match-set blacklist src` 表示从名为 `blacklist` 的 IPset 集合中匹配数据包的源地址。
260+
相比于在 iptables 规则中逐条列出黑名单地址,使用 IPset 可以显著提高匹配效率,尤其是在黑名单地址数量较多的情况下。
261+
262+
如果集合是多元素类型的话,还可以指定端口号等其他字段进行匹配,例如:
263+
264+
```shell
265+
ipset create blacklist hash:ip,port
266+
iptables -A INPUT -m set --match-set blacklist src,dst -j DROP
267+
```
268+
269+
此时 `blacklist` 集合中的每个元素都包含一个 IP 地址和一个端口号,命令中的 `src,dst` 表示匹配数据包的****地址和**目的**端口号。
270+
完整的匹配能力请在 [iptables-extensions(8)][iptables-extensions.8] 手册页中查阅 `set` 模块的说明。
271+
272+
类似地,IPset 中的元素也可以通过 iptables 增减:
273+
274+
```shell
275+
iptables -m my-fantastic-match -j SET --add-set blacklist src [--exist]
276+
iptables -m my-fantastic-match -j SET --del-set blacklist src [--exist]
277+
```
278+
279+
#### skbinfo {#ipset-skbinfo}
280+
281+
部分集合类型支持一项 skbinfo 扩展,可以为每个条目存储额外的信息(skbmark、skbprio、skbqueue),并在匹配时将这些信息附加到数据包上(`--map-mark``--map-prio``--map-queue`)。
282+
283+
例如:
284+
285+
```shell
286+
ipset create qos hash:ip skbinfo
287+
ipset add qos 192.0.2.1 mark 0x1 prio 5 queue 2
288+
iptables -t mangle -A PREROUTING -m set --match-set qos src --map-mark --map-prio --map-queue -j ACCEPT
289+
```
238290

239291
## iptables {#iptables}
240292

docs/ops/network/routing.md

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ $ ip rule
263263
32767: from all lookup default
264264
```
265265

266-
1. `suppress_prefixlength 0` 表示抑制所有前缀长度不大于 0 的路由规则(即 `default` 路由),避免 main 表中 `default` 路由过早生效。
266+
1. `suppress_prefixlength 0` 表示屏蔽所有前缀长度不大于 0 的路由规则(即 `default` 路由),避免 main 表中 `default` 路由过早生效。
267267

268268
此时在 `eth0``eth1` 两个路由表中指定各自的 `default` 路由,就能确保流量从对应的接口发出:
269269

@@ -332,8 +332,31 @@ COMMIT
332332

333333
注意到,尽管打标的规则仅使用了 `-i`(输入接口)条件,对于从 LAN 侧向 WAN 侧发起的连接来说,在收到第一个回包时,输入接口自然就是对应的 WAN 接口,此时根据 `-i` 条件能够正确打标。
334334

335-
对于入向(WAN → LAN)的连接,由于 `main` 表的优先级很高(1 < 3),因此会优先匹配到 `main` 表中的路由规则,从而无视标记正常发送到 LAN 侧。
335+
对于入向(WAN → LAN)的连接,由于 `main` 表的优先级很高(1 < 3),因此会优先匹配到 `main` 表中的路由规则,从而不受标记影响,正常发送到 LAN 侧。
336336

337337
显然,本节所述的方法不区分 IPv4 和 IPv6,因此只需要将相同的配置在 `ip -6 rule``ip6tables` 中重复一遍即可。
338338

339-
相信你也注意到了,如果 LAN 侧还需要进一步的类似「源进源出」式路由的话,就需要更复杂的打标和路由规则设计了。
339+
!!! question
340+
341+
相信你也注意到了,如果 LAN 侧还需要进一步的类似「源进源出」式路由的话,就需要更复杂的打标和路由规则设计了。
342+
本文将这个问题留给读者作为练习。
343+
344+
作为提示,[上文](#routing-policy-matching)提到 `fwmark` 路由规则有两种格式。
345+
346+
### 「网络通」青春版 {#wlt-lite}
347+
348+
「网络通」是中国科学技术大学校园网的一项服务,只需每月 20 元,用户即可通过网络通的网页平台,在四个运营商出口之间自由切换,实现「单线多拨」的效果。
349+
此过程中,用户设备在校园网中的 IP 地址保持不变,由网络通根据此 IP 地址及用户的选择进行分流。
350+
351+
原版的网络通服务在校园网出口处部署了魔改过的 Linux 内核,添加了额外的路由匹配规则,作为分流路由器。
352+
但在多宽带接入的家庭网络等小规模场景中,[ipset 的 skbinfo 功能](firewall.md#ipset-skbinfo)使得我们能够在未修改的 Linux 上实现类似的功能。
353+
354+
!!! question
355+
356+
本文到此已经把实现「网络通青春版」所需的知识都介绍完了,那么系统设计和实现就留给读者作为练习吧。
357+
358+
同样作为提示,该系统需要结合本文介绍的技术实现,至少具有以下几个组件:
359+
360+
- 基于 fwmark 的策略路由规则
361+
- 结合 ipset 进行打标(`--map-mark`)的防火墙规则
362+
- 一个 Web 平台,供用户选择运营商出口,并保存到 ipset 中

includes/man.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ Do not link to a "generic" man page for these commands -->
8383
<!-- None of Debian, man7.org or linux.die.net provides conntrack(8), weird -->
8484
[conntrack.8]: https://man.archlinux.org/man/conntrack.8.en
8585
[deluser.8]: https://manpages.debian.org/stable/adduser/deluser.8.en.html
86+
[ipset.8]: https://linux.die.net/man/8/ipset
8687
[iptables.8]: https://www.man7.org/linux/man-pages/man8/iptables.8.html
8788
[iptables-extensions.8]: https://www.man7.org/linux/man-pages/man8/iptables-extensions.8.html
8889
[logrotate.8]: https://linux.die.net/man/8/logrotate

0 commit comments

Comments
 (0)