type
status
date
slug
summary
tags
category
icon
password
Property
Jun 12, 2024 06:34 AM
好长时间没写blog了,这段时间暂时没有写代码,一直在倒腾软路由的事情。
不过多亏了软路由,我对网络知识的储备又增加了一些。
这篇文章是想好好讲一下关于Linux上的网络数据包的路由处理.
据我现在所了解到的知识,Linux上决定数据包路由流向的关键模块有两个, 第一个是
RPDB(Routing Policy DataBase 路由策略数据库)
,第二个是netfilter/iptables
,很多人会把netfilter/iptables
直接称之为iptables,也没有问题,但是严格上来说还是分开为好,netfilter
是内核中的一部分,提供了一组数据包的hook. iptables则是实现了这些hook,并且提供了在用户空间操作这些hook的办法.RPDB
先来讲讲RPDB吧,RPDB有分为路由规则以及路由表,处理流程如下:
首先查找路由规则,然后根据优先级来匹配规则,匹配到之后进入对应规则的路由表,在路由表中按照最长匹配前缀的方法匹配,
如果路由表中没有找到,则会继续匹配规则.
下面是默认的ubuntu系统的路由规则:
这三条规则的意思都差不多,
from all
大概是指任意源地址的数据包,lookup local
是指路由到local表中,
如果local表中没有匹配到,则按照规则优先级,匹配到下一条规则,也就是from all lookup main
下面是local路由表以及main路由表的内容:
通俗易懂的讲一下路由表中每一条路由的含义, 就现已
local
的第一条为例:local
这个是一个本地地址的关键词, 代表这个数据包的目标地址是本机.
10.2.199.237
目标地址
dev ens34
该数据包的出口网卡
proto kernel
这一条规则是由内核创建的
scope host
作用域,这条的意思就是这个目标IP只能在本机用
src 10.2.199.237
源地址
关于
scope
再讲一下,作用域的意义其实就是字面意思,scope
可能的值有三个分别是host
link
global
host
当一条路由表示目的地址为本地主机时, 例如127.0.0.1这种只能在本地使用的
link
当一条路由表示的目的地址为本地网络时, 例如192.168.1.1或者范围192.168.1.0/24这种局域网地址
global
当一条路由表示的目的地址超过下一跳时,广域网就属于这种
以上基本就是关于路由规则以及路由表的所有内容,不过在执行路由决策之前会首先经过netfilter的各种hook,也就是iptables的规则。
netfilter/iptables
iptables 提供了
raw
mangle
nat
filter
四种内置的规则链类型,每个规则链类型都有自带的内置规则链。先讲讲四个规则链类型的职能:
- (raw) 主要是对收到的数据包进行ct (connection track), 最高优先级的链
- (mangle) 可以实现对数据包头部字段的修改,比较经典的就是打mark标记,配合RPDB的策略路由使用
- (nat) 可以修改数据包的地址等信息,实现重定向之类的功能
- (filter) 主要就是进行数据包过滤的作用,那些接受哪些丢弃
nftables上的实现会有所不同,但是基本大同小异。
然后是内置规则链,总共是5个类型:
- (PREROUTING) 数据包抵达时,在路由判断之前
- (INPUT) 数据包进入主机之前
- (FORWARD) 负责被转发的数据包
- (OUTPUT) 数据包被主机处理之后
- (POSTROUTING) 数据包发出时,在路由判断之后
大体的执行顺序是:
可以发现,基本上的顺序就是raw->mangle->nat->filter, 这个不会改变,以及转发的数据包是不会经过INPUT和OUTPUT链.
- 作者:sdttttt
- 链接:https://www.sdttttt.site/article/c705ba69-b481-4aa9-9ef9-34f96a378017
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。