26 使用 sysctl
变量提高网络安全性 #
Sysctl(系统控制)变量控制某些影响操作系统不同组件(例如 Linux 网络堆栈)的行为的内核参数。可以在 proc
文件系统的 /proc/sys
中查找这些参数。可以通过将新值写入参数伪文件来直接更改许多内核参数。但是,这些更改不会持久保存,会在系统重引导后丢失。因此,我们建议在 sysctl 配置文件中配置所有更改,以便在每次启动系统时应用这些更改。
本章将会配置多个网络相关的变量,以改进 Linux 的安全功能。根据是否存在防火墙及其具体设置,此处列出的某些变量默认已使用安全值。可以使用 sysctl
实用程序检查当前设置值,如下所示:
>
/sbin/sysctl net.ipv4.conf.all.rp_filter
net.ipv4.conf.all.rp_filter = 2
要应用以下设置,请创建配置文件 /etc/sysctl.d/
。该文件需要以 .conf
后缀结尾,例如 /etc/sysctl.d/network.conf
。有关细节,请参见man 5 sysctl.d
。
根据您的环境相应地设置以下列表中的变量。
# the default setting for this is 2 (loose mode) net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1
此设置启用严格模式的 IPv4 反向路径过滤器。它确保对传入 IP 包的回复始终通过接收包的接口发出。如果系统根据路由表将回复包定向到不同的传出接口,则会丢弃这些包。该设置可以防止某些类型的 IP 欺骗攻击,例如,分布式拒绝服务 (DDoS) 攻击。
# the default setting for this should already be 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_source_route = 0
此设置会禁用接受在 IPv4 包报头中设置了
SSR
选项的包。使用源路由的包将遭到拒绝。此设置可以防止 IP 包重定向,即重定向到防火墙后的主机,否则包无法直接送达。# the default setting for this should already be 1 net.ipv4.tcp_syncookies = 1
它为 IPv4 和 IPv6 启用 TCP SYN Cookie 保护。这就解决了 TCP 协议级别的特定拒绝服务攻击。这种保护会给 CPU 带来一个小小的弊端,但有利于避免攻击者造成内存耗尽。保护机制包括一个回退算法,该算法仅在无法以常规方式接受更多 TCP 连接时才发挥作用。该机制不完全遵从 TCP 协议,因此在某些 TCP 环境中可能导致出现协议问题。替代方法是在过载的情况下丢弃其他连接。这还需要对合法的 TCP 高负载和 TCP 拒绝服务攻击进行区分。如果您预计系统上的 TCP 连接负载很高,那么此设置可能适得其反。
# default is 128 net.ipv4.tcp_max_syn_backlog = 4096
TCP SYN backlog 定义了排队等待进一步处理的 SYN 包数。一旦超过队列限制,就会丢弃所有新的传入 SYN 包,并且无法建立新的 TCP 连接(或者 SYN Cookie 保护会介入)。增大此值可以改善针对 TCP SYN 泛洪攻击的保护。
# the default setting for this should already be 1 net.ipv4.icmp_echo_ignore_broadcasts = 1
可以将 ICMP 回应请求 (ping) 发送到 IPv4 广播地址,以扫描网络中的现有主机/IP 地址,或者在网段中执行 ICMP 泛洪。此设置会导致网络堆栈忽略发送到广播地址的 ICMP 回应包。
# the default setting for this should already be 1 net.ipv4.icmp_ignore_bogus_error_responses = 1
此设置可以避免来自无效广播帧响应的不必要错误消息填满日志文件。有关更多信息,请参考RFC 1122 Requirements for Internet Hosts -- Communication Layers Section 3.2.2。
# default should already be 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0
禁用接受 ICMP 重定向消息。这些消息由网关发送,旨在向主机告知指向外部网络的更好路由。攻击者可能会滥用这些重定向来发起中间人攻击。
net.ipv4.conf.default.secure_redirects = 0 net.ipv4.conf.all.secure_redirects = 0
需要接受“安全”ICMP 重定向(来自那些列为默认网关的网关)的合法用例极少。除非绝对必要,否则请禁用它。
net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.send_redirects = 0
节点不应发送 IPv4 ICMP 重定向,除非它充当路由器。
# default should already be 0 net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0
请仅在充当路由器的系统上启用 IP 转发。