跳到主要内容

sysctl 配置文件

routerd 会从路由器的资源中自动推导出适用于 Linux 路由器的 sysctl 配置。 在一般的家用路由器配置中,不需要列举大量的 SysctlProfileSysctl。 routerd 会从 NAT、DS-Lite、BGP、IPv6 前缀委派(PD)、RA、LAN 服务等资源, 自动推导出 forwarding、redirect、reverse path filter、conntrack、TCP,以及各接口的 RA 配置。

SysctlSysctlProfile 仅作为有限的逃生出口,用来补充 routerd 尚无法自动推导的 硬件、内核或发行版特有配置。它们不是表达路由器需求的主要手段, 而是作为实现层面的覆盖选项。

runtime: true 会在控制器链 serve 执行期间,立即将配置反映至运行中的内核。 persistent: true 会将持久配置写入 /etc/sysctl.d/routerd apply --once 只会将明确指定的 Sysctl / SysctlProfile 应用至主机。 推导生成的 sysctl 属于 plan / render 的对象,实际应用由 routerd serve 负责。

仅在需要使用明确配置文件作为逃生出口时,才通过 overrides 覆盖差异。

spec:
profile: router-linux
overrides:
net.netfilter.nf_conntrack_max: "524288"

routerd 在写入前会先读回确认现有值。 若当前的值已符合预期,则不执行写入。 此情况下也不会发出应用事件。

部分 sysctl 的值会被内核向上取整。 对于这类值,请使用 compare: atLeastvalue 是写入的值,expectedValue 是读回时预期的值。 省略 expectedValue 时,以 value 作为预期值。

apiVersion: system.routerd.net/v1alpha1
kind: Sysctl
metadata:
name: socket-buffer
spec:
key: net.core.rmem_max
value: "16777216"
expectedValue: "16777216"
compare: atLeast
runtime: true

router-linux 的配置值

说明
net.ipv4.ip_forward1启用 IPv4 数据包转发。
net.ipv4.conf.all.forwarding1启用各接口的 IPv4 转发。
net.ipv4.conf.all.rp_filter0避免 reverse path filter 丢弃策略路由或 DS-Lite 隧道的回程数据包。
net.ipv4.conf.default.rp_filter0对之后创建的隧道接口也禁用 reverse path filter。
net.ipv4.conf.all.send_redirects0不从路由器发送 ICMP redirect。
net.ipv4.conf.default.send_redirects0对之后创建的接口应用相同配置。
net.ipv4.conf.all.src_valid_mark1让使用 fwmark 的路由选择在 reverse path 判断时能够考虑 mark 值。
net.ipv6.conf.all.forwarding1启用 IPv6 数据包转发。
net.ipv6.conf.default.forwarding1对之后创建的接口也启用 IPv6 转发。
net.netfilter.nf_conntrack_acct1启用 conntrack 的数据包与字节统计,用于 Web 管理界面的客户端流量汇总。在未载入 conntrack 的环境中为可选。
net.netfilter.nf_conntrack_max262144避免大量设备和应用程序同时连接时 conntrack 满载。在未载入 conntrack 的环境中为可选。
net.netfilter.nf_conntrack_buckets65536建议设为 nf_conntrack_max / 4。因环境而异可能无法写入,故为可选。
net.netfilter.nf_conntrack_tcp_timeout_established86400默认的 5 天对家用路由器而言过长,缩短为 24 小时。在未载入 conntrack 的环境中为可选。
net.netfilter.nf_conntrack_udp_timeout30缩短单次 UDP 的保留时间。在未载入 conntrack 的环境中为可选。
net.netfilter.nf_conntrack_udp_timeout_stream180将持续 UDP 的保留时间设为 3 分钟。在未载入 conntrack 的环境中为可选。
net.core.rmem_max16777216将接收缓冲区上限设为 16 MiB。
net.core.wmem_max16777216将发送缓冲区上限设为 16 MiB。
net.ipv4.tcp_rmem4096 87380 16777216扩大 TCP 接收缓冲区的自动调整范围。
net.ipv4.tcp_wmem4096 65536 16777216扩大 TCP 发送缓冲区的自动调整范围。
net.core.netdev_max_backlog5000降低瞬间接收突发流量时发生丢包的概率。
net.core.somaxconn4096明确指定 listen backlog 的上限。
net.ipv4.ip_local_port_range1024 65535扩大路由器本身使用的临时端口范围。
net.ipv4.tcp_fin_timeout30缩短 FIN-WAIT-2 的保留时间。
net.ipv4.tcp_mtu_probing1让 TCP 在无法收到 Path MTU notification 的路径上也能退回较小的 segment。
net.ipv4.tcp_tw_reuse1允许重复使用 TIME-WAIT socket。
net.ipv6.route.max_size16384提高 IPv6 路由缓存的上限。

net.ipv4.route.max_size 在现行 Linux 的部分环境中效果有限, routerd 的默认配置文件不予设置。 若有需要,请以单独 Sysctl 的形式(而非 overrides)添加,并在实机上确认该键是否存在。

net.netfilter.nf_conntrack_udp_timeout 的默认值为 30 秒, 与 Linux conntrack 对无响应 UDP 的默认值一致。 若需要稍长时间以便与防火墙拒绝或 DPI 观测记录相关联,可覆盖为 60 秒。

spec:
profile: router-linux
overrides:
net.netfilter.nf_conntrack_udp_timeout: "60"

conntrack、NFLOG、WireGuard 等模块的载入,routerd 会从 NAT、防火墙记录、 连接流量记录、WireGuard 等资源自动推导。 KernelModule 不是用户编写的配置 Kind。若有推导遗漏, 应视为实现端推导逻辑的错误加以修正。

与单独 Sysctl 的使用区别

单独 Sysctl 仅用于真正偏离 routerd 推导模型的值。 DS-Lite 隧道的 rp_filter=0、WAN/LAN 的 accept_ra=2、LAN 的 send_redirects=0 等 routerd 能够理解的接口配置,会从资源自动推导, 通常不需要在配置中手动编写。

示例:在验证用内核上临时提高 socket 缓冲区大小

apiVersion: system.routerd.net/v1alpha1
kind: Sysctl
metadata:
name: lab-rmem-max
spec:
key: net.core.rmem_max
value: "33554432"
compare: atLeast
runtime: true
persistent: true