使用最佳实践在Linux中禁用ipv6的3种简单方法

时间:2020-01-09 10:41:28  来源:igfitidea点击:

在本教程中,将介绍从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 = 1GRUB_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'