13.2. 晦涩的设置

好的,有很多参数可以修改。我们尝试列出所有这些参数。部分文档也记录在 Documentation/ip-sysctl.txt 中。

其中一些设置具有不同的默认值,具体取决于您在编译内核时是否对“配置为路由器而不是主机”回答了“是”。

13.2.1. 通用 ipv4

作为一个通用说明,大多数速率限制功能在环回接口上不起作用,所以不要在本地测试它们。限制以“jiffies”为单位提供,并使用前面提到的令牌桶过滤器强制执行。

内核有一个内部时钟,它以每秒“HZ”个滴答(或“jiffies”)的速度运行。在 Intel 上,“HZ”通常为 100。因此,将 *_rate 文件设置为,例如 50,将允许每秒 2 个数据包。令牌桶过滤器也被配置为允许最多 6 个数据包的突发,如果已经积累了足够的令牌。

以下列表中的几个条目是从 /usr/src/linux/Documentation/networking/ip-sysctl.txt 中复制的,该文件由 Alexey Kuznetsov <kuznet@ms2.inr.ac.ru> 和 Andi Kleen <ak@muc.de> 编写。

/proc/sys/net/ipv4/icmp_destunreach_rate

如果内核判定无法传递数据包,它将丢弃该数据包,并向数据包的源地址发送 ICMP 通知以说明此情况。

/proc/sys/net/ipv4/icmp_echo_ignore_all

完全不响应 echo 数据包。请不要默认设置此项,但如果您被用作 DoS 攻击中的中继,它可能会很有用。

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts [有用]

如果您 ping 网络的广播地址,所有主机都应该响应。这构成了一个绝佳的拒绝服务工具。将此项设置为 1 以忽略这些广播消息。

/proc/sys/net/ipv4/icmp_echoreply_rate

向任何一个目标地址发送 echo 回复的速率。

/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

设置此项以忽略由网络中的主机对发送到它们认为的广播地址的帧反应不良而引起的 ICMP 错误。

/proc/sys/net/ipv4/icmp_paramprob_rate

一个相对未知的 ICMP 消息,它是在响应具有损坏的 IP 或 TCP 头的错误数据包时发送的。您可以使用此文件控制其发送速率。

/proc/sys/net/ipv4/icmp_timeexceed_rate

这是 traceroute 中“Solaris 中间星号”的著名原因。限制发送的 ICMP Time Exceeded 消息的数量。

/proc/sys/net/ipv4/igmp_max_memberships

主机上监听 igmp (多播) 套接字的最大数量。FIXME:这是真的吗?

/proc/sys/net/ipv4/inet_peer_gc_maxtime

FIXME:添加关于 inet peer 存储的简要说明?垃圾回收过程之间的最小间隔。此间隔在池上内存压力较低(或不存在)时生效。以 jiffies 为单位测量。

/proc/sys/net/ipv4/inet_peer_gc_mintime

垃圾回收过程之间的最小间隔。此间隔在池上内存压力较高时生效。以 jiffies 为单位测量。

/proc/sys/net/ipv4/inet_peer_maxttl

条目的最大生存时间(time-to-live)。如果池上没有内存压力(即,当池中条目的数量非常小时),未使用的条目将在经过此时间段后过期。以 jiffies 为单位测量。

/proc/sys/net/ipv4/inet_peer_minttl

条目的最小生存时间(time-to-live)。应足以覆盖重组端的片段生存时间(fragment time-to-live)。如果池大小小于 inet_peer_threshold,则保证此最小生存时间。以 jiffies 为单位测量。

/proc/sys/net/ipv4/inet_peer_threshold

INET peer 存储的近似大小。从该阈值开始,条目将被积极地丢弃。此阈值还决定条目的生存时间和垃圾回收过程之间的时间间隔。条目越多,生存时间越短,GC 间隔越短。

/proc/sys/net/ipv4/ip_autoconfig

如果主机通过 RARP、BOOTP、DHCP 或类似的机制接收到其 IP 配置,则此文件包含数字 1。否则为零。

/proc/sys/net/ipv4/ip_default_ttl

数据包的生存时间(Time To Live)。设置为安全的 64。如果您的网络很大,请提高它。不要为了好玩而这样做 - 路由环路会造成更大的损害。在某些情况下,您甚至可以考虑降低它。

/proc/sys/net/ipv4/ip_dynaddr

如果您使用按需拨号和动态接口地址,则需要设置此项。一旦您的按需接口启动,任何尚未收到回复的本地 TCP 套接字都将被重新绑定以具有正确的地址。这解决了启动您的接口本身的连接不起作用,但第二次尝试却起作用的问题。

/proc/sys/net/ipv4/ip_forward

内核是否应尝试转发数据包。默认情况下关闭。

/proc/sys/net/ipv4/ip_local_port_range

传出连接的本地端口范围。实际上默认情况下非常小,1024 到 4999。

/proc/sys/net/ipv4/ip_no_pmtu_disc

如果您想禁用路径 MTU 发现(一种确定路径上可能的最大传输单元的技术),请设置此项。另请参阅 Cookbook 章节中关于路径 MTU 发现的部分。

/proc/sys/net/ipv4/ipfrag_high_thresh

用于重组 IP 片段的最大内存。当为此目的分配了 ipfrag_high_thresh 字节的内存时,片段处理程序将丢弃数据包,直到达到 ipfrag_low_thresh。

/proc/sys/net/ipv4/ip_nonlocal_bind

如果您希望您的应用程序能够绑定到不属于您系统上的设备的地址,请设置此项。当您的机器位于非永久性(甚至动态)链接上时,这可能很有用,因此您的服务可以在您的链接断开时启动并绑定到特定地址。

/proc/sys/net/ipv4/ipfrag_low_thresh

用于重组 IP 片段的最小内存。

/proc/sys/net/ipv4/ipfrag_time

将 IP 片段保存在内存中的时间,以秒为单位。

/proc/sys/net/ipv4/tcp_abort_on_overflow

一个布尔标志,控制大量传入连接下的行为。启用后,当服务过载时,这将导致内核主动发送 RST 数据包。

/proc/sys/net/ipv4/tcp_fin_timeout

如果套接字由我们这边关闭,则将其保持在 FIN-WAIT-2 状态的时间。对等方可能已损坏并且永远不会关闭其端,甚至可能意外死亡。默认值为 60 秒。2.2 中常用的值是 180 秒,您可以恢复它,但请记住,如果您的机器即使是负载不足的 WEB 服务器,您也可能面临用数千个死套接字溢出内存的风险,FIN-WAIT-2 套接字不如 FIN-WAIT-1 套接字危险,因为它们最多消耗 1.5K 的内存,但它们往往存活更长时间。参见 tcp_max_orphans。

/proc/sys/net/ipv4/tcp_keepalive_time

启用 keepalive 时,TCP 发送 keepalive 消息的频率。默认值:2 小时。

/proc/sys/net/ipv4/tcp_keepalive_intvl

当探测未被确认时,探测重新传输的频率。默认值:75 秒。

/proc/sys/net/ipv4/tcp_keepalive_probes

TCP 将发送多少个 keepalive 探测,直到它确定连接已断开。默认值:9。与 tcp_keepalive_intvl 相乘,这给出了在发送 keepalive 后链接可能无响应的时间。

/proc/sys/net/ipv4/tcp_max_orphans

系统中持有的未附加到任何用户文件句柄的 TCP 套接字的最大数量。如果超过此数量,孤立连接将被立即重置并打印警告。此限制的存在只是为了防止简单的 DoS 攻击,您_绝不能_依赖此限制或人为地降低此限制,而是应该增加它(可能在增加安装的内存之后),如果网络条件需要超过默认值,并调整网络服务以更积极地逗留和终止此类状态。让我再次提醒您:每个孤立套接字最多消耗 ~64K 的不可交换内存。

/proc/sys/net/ipv4/tcp_orphan_retries

在终止由我们这边关闭的 TCP 连接之前,重试多少次。默认值 7 对应于 ~50 秒-16 分钟,具体取决于 RTO。如果您的机器是负载大的 WEB 服务器,您应该考虑降低此值,此类套接字可能会消耗大量资源。参见 tcp_max_orphans。

/proc/sys/net/ipv4/tcp_max_syn_backlog

记住的连接请求的最大数量,这些请求仍然没有收到来自连接客户端的确认。对于内存超过 128Mb 的系统,默认值为 1024,对于低内存机器,默认值为 128。如果服务器遭受过载,请尝试增加此数量。警告!如果您使其大于 1024,最好将 include/net/tcp.h 中的 TCP_SYNQ_HSIZE 更改为保持 TCP_SYNQ_HSIZE*16<=tcp_max_syn_backlog 并重新编译内核。

/proc/sys/net/ipv4/tcp_max_tw_buckets

系统同时持有的 timewait 套接字的最大数量。如果超过此数量,time-wait 套接字将被立即销毁并打印警告。此限制的存在只是为了防止简单的 DoS 攻击,您_绝不能_人为地降低此限制,而是应该增加它(可能在增加安装的内存之后),如果网络条件需要超过默认值。

/proc/sys/net/ipv4/tcp_retrans_collapse

与某些损坏的打印机的错误到错误的兼容性。在重传时尝试发送更大的数据包,以解决某些 TCP 堆栈中的错误。

/proc/sys/net/ipv4/tcp_retries1

在确定某些事情出错并且有必要向网络层报告此怀疑之前,重试多少次。最小 RFC 值为 3,它是默认值,对应于 ~3 秒-8 分钟,具体取决于 RTO。

/proc/sys/net/ipv4/tcp_retries2

在终止活动的 TCP 连接之前,重试多少次。RFC 1122 说限制应该超过 100 秒。这个数字太小了。默认值 15 对应于 ~13-30 分钟,具体取决于 RTO。

/proc/sys/net/ipv4/tcp_rfc1337

此布尔值启用对 RFC 1337 中描述的“tcp 中的 time-wait 刺杀危害”的修复。如果启用,这将导致内核丢弃 time-wait 状态的套接字的 RST 数据包。默认值:0

/proc/sys/net/ipv4/tcp_sack

使用选择性 ACK,它可以用于指示丢失了特定的数据包 - 因此有助于快速恢复。

/proc/sys/net/ipv4/tcp_stdurg

使用 TCP urg 指针字段的主机需求解释。大多数主机使用较旧的 BSD 解释,因此如果您启用此项,Linux 可能无法与它们正确通信。默认值:FALSE

/proc/sys/net/ipv4/tcp_syn_retries

内核在放弃新连接之前将发送的 SYN 数据包的数量。

/proc/sys/net/ipv4/tcp_synack_retries

为了打开连接的另一端,内核发送一个带有 piggybacked ACK 的 SYN,以确认之前收到的 SYN。这是三次握手的第 2 部分。此设置确定在内核放弃连接之前发送的 SYN+ACK 数据包的数量。

/proc/sys/net/ipv4/tcp_timestamps

时间戳用于防止序列号回绕等。千兆位链接可能会重新遇到具有过时值的先前序列号,因为它属于上一代。时间戳将使其识别出这个“古老的数据包”。

/proc/sys/net/ipv4/tcp_tw_recycle

启用快速回收 TIME-WAIT 套接字。默认值为 1。未经技术专家建议/请求,不应更改此值。

/proc/sys/net/ipv4/tcp_window_scaling

TCP/IP 通常允许最大 65535 字节的窗口。对于非常快速的网络,这可能不够。窗口缩放选项允许接近千兆字节的窗口,这对于高带宽*延迟乘积很有用。

13.2.2. 每个设备设置

DEV 可以代表真实接口,也可以代表 'all' 或 'default'。Default 也更改尚未创建的接口的设置。

/proc/sys/net/ipv4/conf/DEV/accept_redirects

如果路由器确定您将其用于错误的目的(即,它需要在同一接口上重新发送您的数据包),它将向我们发送 ICMP 重定向。然而,这是一个轻微的安全风险,因此您可能希望关闭它,或使用安全重定向。

/proc/sys/net/ipv4/conf/DEV/accept_source_route

现在不太常用了。您曾经可以给数据包一个它应该在其路径上访问的 IP 地址列表。可以使 Linux 遵守此 IP 选项。

/proc/sys/net/ipv4/conf/DEV/bootp_relay

接受源地址为 0.b.c.d 且目标地址不是此主机的本地数据包。据推测,BOOTP 中继守护程序将捕获并转发此类数据包。

默认值为 0,因为此功能尚未实现(内核版本 2.2.12)。

/proc/sys/net/ipv4/conf/DEV/forwarding

在此接口上启用或禁用 IP 转发。

/proc/sys/net/ipv4/conf/DEV/log_martians

请参阅关于 反向路径过滤 的章节。

/proc/sys/net/ipv4/conf/DEV/mc_forwarding

我们是否在此接口上进行多播转发

/proc/sys/net/ipv4/conf/DEV/proxy_arp

如果将其设置为 1,则此接口将响应内核具有路由的地址的 ARP 请求。在构建“ip 伪桥”时非常有用。启用此项之前,请务必确保您的网络掩码非常正确!还要注意,在其他地方提到的 rp_filter 也对 ARP 查询起作用!

/proc/sys/net/ipv4/conf/DEV/rp_filter

请参阅关于 反向路径过滤 的章节。

/proc/sys/net/ipv4/conf/DEV/secure_redirects

仅接受默认网关列表中列出的网关的 ICMP 重定向消息。默认启用。

/proc/sys/net/ipv4/conf/DEV/send_redirects

我们是否发送上述提到的重定向。

/proc/sys/net/ipv4/conf/DEV/shared_media

如果未设置,则内核不假设此设备上的不同子网可以直接通信。默认设置为 “yes”。

/proc/sys/net/ipv4/conf/DEV/tag

FIXME:填写此项

13.2.3. 邻居策略

Dev 可以代表真实接口,也可以代表 'all' 或 'default'。Default 也更改尚未创建的接口的设置。

/proc/sys/net/ipv4/neigh/DEV/anycast_delay

对邻居请求消息的应答的最大随机延迟,以 jiffies 为单位 (1/100 秒)。尚未实现(Linux 尚不支持任播)。

/proc/sys/net/ipv4/neigh/DEV/app_solicit

确定要发送到用户级 ARP 守护程序的请求数。使用 0 关闭。

/proc/sys/net/ipv4/neigh/DEV/base_reachable_time

用于计算 RFC2461 中指定的随机可达时间值的基值。

/proc/sys/net/ipv4/neigh/DEV/delay_first_probe_time

如果邻居可达,则首次探测的延迟。(参见 gc_stale_time)

/proc/sys/net/ipv4/neigh/DEV/gc_stale_time

确定检查过时 ARP 条目的频率。在 ARP 条目过时后,它将再次被解析(当 IP 地址迁移到另一台机器时很有用)。当 ucast_solicit 大于 0 时,它首先尝试直接向已知主机发送 ARP 数据包。当失败且 mcast_solicit 大于 0 时,将广播 ARP 请求。

/proc/sys/net/ipv4/neigh/DEV/locktime

仅当旧的 ARP/邻居条目至少有 locktime 年龄时,才用新的条目替换它。这可以防止 ARP 缓存抖动。

/proc/sys/net/ipv4/neigh/DEV/mcast_solicit

多播请求的最大重试次数。

/proc/sys/net/ipv4/neigh/DEV/proxy_delay

在回答我们有代理 ARP 条目的 ARP 请求之前的最大时间(实际时间是随机 [0..proxytime])。在某些情况下,这用于防止网络泛洪。

/proc/sys/net/ipv4/neigh/DEV/proxy_qlen

延迟代理 arp 定时器的最大队列长度。(参见 proxy_delay)。

/proc/sys/net/ipv4/neigh/DEV/retrans_time

重传邻居请求消息之间的时间,以 jiffies 为单位 (1/100 秒) 表示。用于地址解析和确定邻居是否不可达。

/proc/sys/net/ipv4/neigh/DEV/ucast_solicit

单播请求的最大重试次数。

/proc/sys/net/ipv4/neigh/DEV/unres_qlen

挂起的 arp 请求的最大队列长度 - 在 ARP 地址仍在解析时从其他层接受的数据包数量。

Internet QoS: Architectures and Mechanisms for Quality of Service, Zheng Wang, ISBN 1-55860-608-4

涵盖与服务质量相关主题的精装教科书。适合理解基本概念。

13.2.4. 路由设置

/proc/sys/net/ipv4/route/error_burst

这些参数用于限制从路由代码写入内核日志的警告消息。error_cost 因子越高,写入的消息越少。Error_burst 控制何时丢弃消息。默认设置将警告消息限制为每五秒一条。

/proc/sys/net/ipv4/route/error_cost

这些参数用于限制从路由代码写入内核日志的警告消息。error_cost 因子越高,写入的消息越少。Error_burst 控制何时丢弃消息。默认设置将警告消息限制为每五秒一条。

/proc/sys/net/ipv4/route/flush

写入此文件会导致刷新路由缓存。

/proc/sys/net/ipv4/route/gc_elasticity

用于控制路由缓存的垃圾回收算法的频率和行为的值。这对于执行故障转移可能很重要。至少在 gc_timeout 秒过去后,Linux 才会因为之前的路由已失效而跳到另一条路由。默认设置为 300,如果您希望实现快速故障转移,则可以降低它。

另请参阅 Ard van Breemen 的 这篇文章

/proc/sys/net/ipv4/route/gc_interval

参见 /proc/sys/net/ipv4/route/gc_elasticity。

/proc/sys/net/ipv4/route/gc_min_interval

参见 /proc/sys/net/ipv4/route/gc_elasticity。

/proc/sys/net/ipv4/route/gc_thresh

参见 /proc/sys/net/ipv4/route/gc_elasticity。

/proc/sys/net/ipv4/route/gc_timeout

参见 /proc/sys/net/ipv4/route/gc_elasticity。

/proc/sys/net/ipv4/route/max_delay

用于刷新路由缓存的延迟。

/proc/sys/net/ipv4/route/max_size

路由缓存的最大大小。一旦缓存达到此大小,旧条目将被清除。

/proc/sys/net/ipv4/route/min_adv_mss

FIXME:填写此项

/proc/sys/net/ipv4/route/min_delay

用于刷新路由缓存的延迟。

/proc/sys/net/ipv4/route/min_pmtu

FIXME:填写此项

/proc/sys/net/ipv4/route/mtu_expires

FIXME:填写此项

/proc/sys/net/ipv4/route/redirect_load

确定是否应向特定主机发送更多 ICMP 重定向的因素。一旦达到负载限制或最大重定向数,将不再发送重定向。

/proc/sys/net/ipv4/route/redirect_number

参见 /proc/sys/net/ipv4/route/redirect_load。

/proc/sys/net/ipv4/route/redirect_silence

重定向的超时时间。在此时间段之后,即使由于已达到负载或数量限制而停止发送重定向,也将再次发送重定向。