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可能的值有三个分别是hostlinkglobal
  • host 当一条路由表示目的地址为本地主机时, 例如127.0.0.1这种只能在本地使用的
  • link 当一条路由表示的目的地址为本地网络时, 例如192.168.1.1或者范围192.168.1.0/24这种局域网地址
  • global 当一条路由表示的目的地址超过下一跳时,广域网就属于这种
以上基本就是关于路由规则以及路由表的所有内容,不过在执行路由决策之前会首先经过netfilter的各种hook,也就是iptables的规则。

netfilter/iptables

iptables 提供了rawmanglenatfilter 四种内置的规则链类型,每个规则链类型都有自带的内置规则链。
先讲讲四个规则链类型的职能:
  • (raw) 主要是对收到的数据包进行ct (connection track), 最高优先级的链
  • (mangle) 可以实现对数据包头部字段的修改,比较经典的就是打mark标记,配合RPDB的策略路由使用
  • (nat) 可以修改数据包的地址等信息,实现重定向之类的功能
  • (filter) 主要就是进行数据包过滤的作用,那些接受哪些丢弃
nftables上的实现会有所不同,但是基本大同小异。
然后是内置规则链,总共是5个类型:
  • (PREROUTING) 数据包抵达时,在路由判断之前
  • (INPUT) 数据包进入主机之前
  • (FORWARD) 负责被转发的数据包
  • (OUTPUT) 数据包被主机处理之后
  • (POSTROUTING) 数据包发出时,在路由判断之后
大体的执行顺序是:
可以发现,基本上的顺序就是raw->mangle->nat->filter, 这个不会改变,以及转发的数据包是不会经过INPUT和OUTPUT链.
Protobuf 原理ImmortalWrt的编译踩坑
Loading...