使用最佳实践在Linux中禁用ipv6的3种简单方法
在本教程中,将介绍从Linux服务器完全禁用IPv6所需的步骤。
有两种方法可以满足此要求,将介绍一些我熟悉的方法。
通常,我们在网络中禁用IPv6,但是由于某种原因我们会错过在其他相关配置文件(例如/etc/hosts,sshd_config
文件等)上进行更新。
因此,更新所有相关配置文件以不再使用IPv6至关重要。
我们还可以阅读我的上一篇文章,以在Linux中配置IPv6地址。
1.使用grubby禁用IPv6(需要重新启动)
在此示例中,我们将使用grubby命令更新内核启动项并禁用IPv6.
grubby命令非常用户友好,可以通过脚本用于自动化。
我们将使用以下命令使用ipv6.disable = 1
更新DEFAULT内核的内核参数。
此参数将确保在下次重新启动时禁用IPv6.
# grubby --args ipv6.disable=1 --update-kernel DEFAULT
验证默认内核上内核参数的更新条目
# grubby --info DEFAULT
下面是我的服务器终端的摘录
使用GRUBBY禁用IPv6
下次重启服务器并重启后,检查以下命令的输出
# sysctl -a | grep -i ipv6
我们应该获得空输出,这意味着所有ipv6模块都已从内核中卸载。
接下来转到本教程的最后一部分,以禁用不同配置文件中的IPv6
2.使用GRUB2配置禁用IPv6(需要重新启动)
在本节中,我们将使用GRUB2配置完全禁用IPv6.
我们需要在/etc/default/grub
文件的末尾添加ipv6.disable = 1
和GRUB_CMDLINE_LINUX
。
我们可以按照下面的用法在sed
下面使用,或者使用任何编辑器手动打开文件并追加:
# sed '/GRUB_CMDLINE_LINUX/s/"$/ipv6.disable=1"/' /etc/default/grub
现在验证是否正确添加了" ipv6.disable = 1":
# grep ipv6 /etc/default/grub GRUB_CMDLINE_LINUX="resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet biosdevname=0 net.ifnames=0 ipv6.disable=1"
接下来重建grub2配置文件:
提示:
以下命令适用于基于UEFI的计算机上的旧式BIOS:~]#grub2-mkconfig -o/boot/efi/EFI/redhat/grub.cfg
# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... done
下次重新启动服务器,并检查以下命令的输出
# sysctl -a | grep -i ipv6
我们应该获得空输出,这意味着所有ipv6模块都已从内核中卸载。
接下来转到本教程的最后一部分,以禁用不同配置文件中的IPv6
3.使用sysctl禁用IPv6(不重新启动)
这是另一种禁用IPv6的方法,但是在这种情况下,我们不会像上述方法那样卸载IPv6模块,而是禁用IPv6,以便无法对其进行配置或者使用。
说明:
除非sshd_config包含AddressFamily inet,否则此方法可能会破坏SSH Xforwarding。
因此,如果我们打算使用此方法并且也使用XForwarding
,则强烈建议在/etc/ssh/sshd_config中添加AddressFamily inet并重新启动sshd服务
在开始之前,我们可以检查当前是否已将一个" inet6"地址分配给我的" eth0"接口。
可用的inet6地址
要禁用IPv6运行时,请将" 1"添加到下面的" sysctl"配置文件中
# echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6 # echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6
接下来,我们可以验证,当使用ip a
命令列出可用接口及其IP地址时,我们不会看到inet6
。
ipv6使用sysctl处于禁用状态
如我们所见,不再为eth0提供inet6接口。
因此,IPv6被禁用,没有任何重新引导。
但是这些更改在重新启动后并不持久,因此要使其永久存在,我们需要将它们添加到sysctl
配置文件中。
在/etc/sysctl.d /
中创建一个新的配置文件,并在下面几行添加
# cat /etc/sysctl.d/98-disable_ipv6.conf net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
提示:
在某些情况下,我们可能还需要在该文件中添加net.ipv6.conf。 <interface> .disable_ipv6 = 1
。
用Linux服务器上的所有接口替换 <interface>
,例如:eth0,eth1等
接下来执行sysctl -p
以更新配置(无论如何,由于我们之前已在这些条目中手动添加了'1',因此我们可以跳过此步骤)
# sysctl -p /etc/sysctl.d/98-disable_ipv6.conf net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1
创建initramfs的备份:
# cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).bak.$(date +%m-%d-%H%M%S).img
然后使用重建初始RAM磁盘镜像,此命令可能会在屏幕上给出一长串输出:
# dracut -f -v
验证initramfs的内容,以确保新添加的sysctl配置文件是initramfs的一部分。
# lsinitrd /boot/initramfs-$(uname -r).img | grep 'etc/sysctl.d/98-disable_ipv6.conf' -rw-r--r-- 1 root root 75 Sep 6 2019 etc/sysctl.d/98-disable_ipv6.conf
现在,即使重新启动服务器,IPv6更改也将在重新启动后保持不变。
最后,转到本教程的下一部分,以在不同的配置文件中禁用IPv6
4.在Linux配置文件中禁用IPv6
现在,由于我们已在网络中禁用了IPv6,因此我们还应该考虑在多个Linux配置文件中禁用相同的IPv6,否则我们可能会在Linux服务器上报告不同的错误。
4.1:在/etc/hosts中
注释掉在/etc/hosts中找到的所有IPv6地址,包括:: 1
本地主机地址。
# cp -p /etc/hosts /etc/hosts.disableipv6 # sed -i 's/^[[:space:]]*::/#::/' /etc/hosts
4.2:在/etc/ssh/sshd_config中
如前所述,如果在禁用IPv6的系统上遇到X转发问题,请编辑/etc/ssh/sshd_config并进行以下更改之一:更改行
#AddressFamily any
到
AddressFamily inet
并重新启动sshd服务
# systemctl restart sshd.service
4.3:在Postfix(/etc/postfix/main.cf)中
如果我们使用的是postfix,则还应该在/etc/postfix/main.cf
中进行这些更改,并注释掉配置的localhost部分,并使用ipv4回送。
#inet_interfaces = localhost inet_interfaces = 127.0.0.1
重新启动后缀服务
# systemctl restart postfix
4.4:在/etc/ntp.conf中
如果我们使用旧版的" ntp.conf"将本地时间与NTP服务器同步,则在" /etc/ntp.conf"中注释与IPV6相关的行。
# restrict ::1
下次重启ntpd服务
# systemctl restart ntpd
4.5:在/etc/netconfig中
要禁用RPCBIND ipv6(rpcbind,rpc.mountd,prc.statd),请在/etc/netconfig中标记" udp6"和" tcp6"行:
udp tpi_clts v inet udp - tcp tpi_cots_ord v inet tcp - #udp6 tpi_clts v inet6 udp - #tcp6 tpi_cots_ord v inet6 tcp - rawip tpi_raw - inet - - local tpi_cots_ord - loopback - -
我们无需重新启动任何服务,更改将影响运行时。
4.6:在chrony
如果我们使用chrony而不是NTP来将本地服务器与网络时区同步,那么要在upd6套接字上禁用chronyd服务,请使用任何文本编辑器创建/etc/sysconfig/chronyd文件,并在下面一行:
OPTIONS="-4"
重新启动chronyd服务
# systemctl restart chronyd
我们可以使用netstat来验证相同的内容,以列出在udp6上监听的chronyd进程。
# netstat -plan | egrep 'tcp6|udp6'