Skip to content

Commit d4ed382

Browse files
committed
firewall: Start writing
1 parent 3ff1c34 commit d4ed382

File tree

9 files changed

+120
-7
lines changed

9 files changed

+120
-7
lines changed

docs/css/extra.css

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ h5 { counter-reset: h6; }
3030

3131
h2::before { counter-increment: h2; content: counter(h2); margin-right: 0.8rem; }
3232

33-
h3::before { counter-increment: h3; content: counter(h2) "." counter(h3); margin-right: 0.8rem; }
33+
h3::before { counter-increment: h3; content: counter(h2) "." counter(h3); margin-right: 0.5rem; }
3434

35-
h4::before { counter-increment: h4; content: counter(h2) "." counter(h3) "." counter(h4); margin-right: 0.8rem; }
35+
h4::before { counter-increment: h4; content: counter(h2) "." counter(h3) "." counter(h4); margin-right: 0.5rem; }
3636

37-
h5::before { counter-increment: h5; content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5); margin-right: 0.8rem; }
37+
h5::before { counter-increment: h5; content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5); margin-right: 0.3rem; }
3838

39-
h6::before { counter-increment: h6; content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6); margin-right: 0.8rem; }
39+
h6::before { counter-increment: h6; content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6); margin-right: 0.3rem; }
4040

4141
.red, .red-important { color: red !important; }
4242

@@ -82,6 +82,8 @@ h6::before { counter-increment: h6; content: counter(h2) "." counter(h3) "." cou
8282

8383
.md-typeset p.caption { text-align: center; font-size: 0.94em; color: grey; margin: -0.7em 0 0; }
8484

85+
.md-typeset figure > figcaption { font-style: normal; color: grey; }
86+
8587
.md-typeset .md-annotation__index { margin-left: 0; margin-right: 0; }
8688

8789
.md-typeset .footnote hr { margin-top: 0.2em; }

docs/css/extra.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ $color-codes: red, darkred, orangered, green, limegreen;
9595
margin: -0.7em 0 0;
9696
}
9797

98+
figure > figcaption {
99+
font-style: normal;
100+
color: grey;
101+
}
102+
98103
.md-annotation__index {
99104
margin-left: 0;
100105
margin-right: 0;
142 KB
Loading
149 KB
Loading
124 KB
Loading

docs/ops/network/firewall.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
---
2+
icon: material/wall-fire
3+
---
4+
5+
# 防火墙
6+
7+
!!! warning "本文编写中"
8+
9+
Linux 内核网络栈中的防火墙模块称为 Netfilter,负责对进出主机的数据包进行过滤和修改。Netfilter 提供了一套强大的工具,用于实现各种防火墙功能,如包过滤、网络地址转换(NAT)和连接跟踪等。
10+
11+
## Netfilter 阶段 {#netfilter-chains}
12+
13+
Netfilter 将数据包的处理过程划分为 5 个阶段,并在每个阶段提供 hook 点,允许用户定义规则来控制数据包的流动。
14+
这些阶段包括:
15+
16+
PREROUTING / `NF_INET_PRE_ROUTING`
17+
18+
: 数据包由网络接口(网卡)接收后,首先进入 PREROUTING 阶段。这个阶段通常用于更改目的地址(DNAT)。
19+
20+
INPUT / `NF_INET_LOCAL_IN`
21+
22+
: 数据包在经过路由决策后,如果目标是本地主机,则进入 INPUT 阶段。这个阶段通常用于过滤,管控对本地服务的访问,以及(如有必要)更改源地址(SNAT)。
23+
24+
FORWARD / `NF_INET_FORWARD`
25+
26+
: 如果由外部网络进入的数据包的目标不是本地主机,而是需要由本机转发到其他主机,则进入 FORWARD 阶段。这个阶段通常用于过滤。
27+
28+
OUTPUT / `NF_INET_LOCAL_OUT`
29+
30+
: 由本地主机发出的数据包首先进入 OUTPUT 阶段。这个阶段通常用于过滤,管控本地应用程序对外的网络访问,以及(如有必要)更改目的地址(DNAT)。
31+
32+
POSTROUTING / `NF_INET_POST_ROUTING`
33+
34+
: 数据包在离开主机由网卡发出之前,进入 POSTROUTING 阶段。这个阶段通常用于更改源地址(SNAT)。
35+
36+
从主机的视角来看,数据包经过 Netfilter 的各个阶段的路径如下图所示:
37+
38+
![Netfilter 阶段](../../images/netfilter-host-view.png)
39+
40+
/// caption
41+
从主机视角看 Netfilter 的各个阶段
42+
///
43+
44+
在上图中,ROUTE 指[路由决策](routing.md)
45+
46+
## iptables 表 {#iptables-tables}
47+
48+
iptables 是 Netfilter 的用户空间工具,用于管理防火墙规则。
49+
iptables 将规则组织成不同的表,每个表包含多个链(chain),每个链对应一个 Netfilter 阶段。
50+
iptables 的主要表类型有以下几种:
51+
52+
filter
53+
54+
: 默认表,用于包过滤,其中 DROP 和 REJECT 目标通常只用在此表中。
55+
56+
nat
57+
58+
: 用于网络地址转换(NAT),如源地址转换(SNAT)和目的地址转换(DNAT)。其中「伪装」(MASQUERADE)是一种特殊的 SNAT 方式,让内核根据网卡上配置的地址自动决定替换后的源地址,通常用于动态 IP 地址的场景。
59+
60+
需要注意的是,nat 表的 PREROUTING 和 OUTPUT 链只能使用 DNAT 目标,而 INPUT 和 POSTROUTING 链只能使用 SNAT(或 MASQUERADE)目标。
61+
62+
特别的是,仅有建立新连接的数据包会经过 nat 表,而已经建立连接的数据包不会经过 nat 表,而是由 conntrack 模块处理。
63+
对于用户而言,可以理解为「nat 表自带 `--ctstate NEW` 约束,之后的数据包都使用已经转换后的地址进行通信」。
64+
65+
mangle
66+
67+
: 用于修改原始数据包,如更改 TOS(服务类型)或 TTL(生存时间),也包括打上防火墙标记(`-j MARK`)。这个表通常用于高级的包处理。
68+
69+
raw
70+
71+
: 用于处理原始数据包,将包标记为不经过连接跟踪(如 `-j CT --notrack`),或引入其他连接跟踪帮助模块(如 `-j CT --helper`)。
72+
73+
另有 security 表用于 SELinux 等安全模块的集成,但在大多数系统中不常用。Security 表与 filter 表适用于相同的阶段(Netfilter hook 点),且运行在 filter 表之后,即能够进入 security 表中的数据包都已由 filter 表标记为接受(ACCEPT)了。
74+
75+
各个表在各个阶段的可用性如下表所示:
76+
77+
| 阶段 | filter / security | nat | mangle | raw |
78+
| ----------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
79+
| PREROUTING | :fontawesome-solid-xmark:{: .orangered } | DNAT only | :fontawesome-solid-check:{: .limegreen } | :fontawesome-solid-check:{: .limegreen } |
80+
| INPUT | :fontawesome-solid-check:{: .limegreen } | SNAT only | :fontawesome-solid-check:{: .limegreen } | :fontawesome-solid-xmark:{: .orangered } |
81+
| FORWARD | :fontawesome-solid-xmark:{: .orangered } | :fontawesome-solid-check:{: .limegreen } | :fontawesome-solid-xmark:{: .orangered } | :fontawesome-solid-check:{: .limegreen } |
82+
| OUTPUT | :fontawesome-solid-check:{: .limegreen } | DNAT only | :fontawesome-solid-check:{: .limegreen } | :fontawesome-solid-check:{: .limegreen } |
83+
| POSTROUTING | :fontawesome-solid-xmark:{: .orangered } | SNAT only | :fontawesome-solid-check:{: .limegreen } | :fontawesome-solid-xmark:{: .orangered } |
84+
85+
在同一个阶段中,不同表的处理顺序为 raw → mangle → nat (DNAT) → filter → security → nat (SNAT)。
86+
87+
若从 Netfilter 自己的视角,将网卡和本地进程(数据包的来源和接收者)都看作外部元素的话,各个阶段及其可用的表和处理顺序如下图所示:
88+
89+
![Netfilter 阶段](../../images/netfilter-kernel-view-tables.png)
90+
91+
/// caption
92+
从 Netfilter 自己的视角看各个阶段,以及每个阶段可用的表
93+
///

docs/ops/network/routing.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
icon: material/router-network
3+
---
4+
5+
# 路由
6+
7+
!!! warning "本文编写中"
8+
9+
## 路由表

docs/spec/writing.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,13 +111,14 @@ Linux 201 使用 mkdocs + mkdocs-material 作为文档框架与主题,并且
111111

112112
### 为图片添加配字 {#image-caption}
113113

114-
在图片下方写一行文字作为配字,并在这行字**紧接着的下一行**(不能有空行)写上 `{: .caption }`,这样配的这行字渲染成 HTML 时就加上了 `class="caption"`,显示为 0.94 倍的字体、灰色、贴近图片。
114+
使用 [Python Markdown Extension](https://facelessuser.github.io/pymdown-extensions/extensions/blocks/plugins/caption/) 的语法,在图片后面添加配字,格式如下:
115115

116116
```markdown
117117
![image](url)
118118

119-
图 1. 这张图片的一行配字
120-
{: .caption }
119+
/// caption
120+
图 1. 这张图片的配字
121+
///
121122
```
122123

123124
### 图片与附件文件 {#images-attachments}

mkdocs.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ markdown_extensions:
4343
- footnotes
4444
- markdown.extensions.def_list
4545
- md_in_html
46+
- pymdownx.blocks.caption
4647
- pymdownx.details
4748
- pymdownx.emoji:
4849
emoji_index: !!python/name:material.extensions.emoji.twemoji
@@ -115,6 +116,8 @@ nav:
115116
- 网络系统:
116117
- ops/network/index.md
117118
- 基础知识简介: ops/network/intro.md
119+
- 路由: ops/network/routing.md
120+
- 防火墙: ops/network/firewall.md
118121
- 网络服务实践:
119122
- ops/network-service/index.md
120123
- 网络时间同步: ops/network-service/ntp.md

0 commit comments

Comments
 (0)