DevOps文化 & SRE实战分享平台

0%

如何在Linux中禁用ICMP和ICMPv6重定向


文章声明:此文基于木子实操撰写
生产环境:CentOS Linux release 7.9.2009 (Core)
问题关键字:禁用ICMP,禁用ICMPv6


写在最前面

正如前文《你还在看水文吗?速度取关吧!》所述,为了能够更好的传播Linux基础知识,同时也为巩固、沉淀个人知识体系,在经过很长时间的思考后,木子决定率先开启一个专题系列《Linux基础》,其系列以Linux基础出发,如:系统安装、磁盘管理、安全配置、路由配置、防火墙配置、性能监控、系统管理、高级命令技巧、工具链等等,它基于所有Linux发行版为基础,不仅仅局限于:CentOS、Rocky Linux、Debian、Ubuntu、Arch Linux,欢迎有兴趣的同学参与其中。此系列教程,首发于微信公众号【欧巴云】,并同步发送至博客:https://www.oubayun.com。
今天我们将学习如何在Linux服务器上禁用ICMP和ICMPv6重定向。ICMP重定向功能在路由器上使用,因此,如果您的Linux服务器未充当路由器,那么作为一般的安全实践,建议禁用重定向。即使您的Linux服务器充当并打开了路由转发功能,您也可以使用内核参数(sysctl)有选择的禁用某些接口上的ICMP重定向。

IPv4下禁用ICMP重定向

有两种忽略ICMP请求的方法。以下部分仅涵盖IPv4网络。

使用防火墙规则

我们可以添加一条防火墙规则以阻止所有TCMP重定向。
首先获取活动区域列表:

1
2
3
4
firewall-cmd --get-active-zones

public
interfaces: eth0 eth1

因为我使用默认的public区域,所以我将防火墙规则应用至此区域:

1
firewall-cmd --permanent --add-icmp-block=redirect --zone=public

重载规则

1
firewall-cmd --reload

验证规则是否生效

1
2
3
filewall-cmd --list-all
# 有如下输出,即生效成功
icmp-blocks: redirect

使用内核参数(sysctl)

如果您的Linux服务器启用了路由转发功能,则可以选择在所有接口或指定接口上禁用ICMP重定向。
在所有接口上禁用ICMP重定向:

1
net.ipv4.conf.all.accept_redirects = 0

仅禁用eth0接口上的ICMP重定向:

1
2
3
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 1

如果您的Linux服务器未充当路由器,则可以在所有接口上禁用ICMP重定向:

1
2
3
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0

您可以在/etc/sysctl.d/98-disable-icmpv4.conf中添加以下配置:

1
2
3
4
#cat /etc/sysctl.d/98-disable-icmpv4.conf
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.eth1.accept_redirects = 0

生效配置:

1
systemctl -system

如何为IPv6禁用ICMP重定向

我们可以使用类似的方法来忽略Linux服务器上的ICMPv6请求。

使用防火墙规则

要阻止所有接口上的ICMPv6重定向,请使用:

1
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -p icmpv6 --icmpv6-type 137 -j DROP

要禁用单个eth0接口的ICMPv6请求,请使用:

1
firewall-cmd --permanent --direct --add-rule ipv6 filter INPUT 0 -i eth0 -p icmpv6 --icmpv6-type 137 -j DROP

重载配置:

1
2
firewall-cmd --reload
firewall-cmd --direct --get-all-rules

使用内核参数(sysctl)

忽略ICMPv6重定向背后的逻辑与IPv4使用的逻辑不同。要使主机忽略ICMPv6重定向,我们必须将主机作为IPv6网关运行(启用IPv6转发):

1
2
3
4
5
# 指定接口上启用转发,忽略ICMPv6重定向
net.ipv6.conf.<interface>.forwarding=1

# 所有接口上启用转发,忽略ICMPv6重定向
net.ipv6.conf.all.forwarding=1

要么,禁用每个接口的ICMPv6重定向:

1
net.ipv6.conf.<inteface>.accept_redirects=0

您可以在新文件/etc/sysctl.d/97-disable-icmpv6.conf中添加以下配置参数:

1
2
3
vi /etc/sysctl.d/97-disable-icmpv6.conf
net.ipv6.conf.eth0.accept_redirects=0
net.ipv6.conf.eth1.accept_redirects=0

生效配置:

1
sysctl --system

结论

这里我们简单学习了如何禁用ICMPv4和ICMPv6重定向消息的不同方法。在生产环境中,这些是增强单台Linux服务器安全性的基本标准。对于IPv6,如果您不在环境中使用IPv6,也可以完全禁用它。

坚持原创技术分享,您的支持与鼓励,是我持续创作的动力!