如何在 Linux 上禁用 IPv6

通过禁用 IPv6 来简化您的家庭网络。
4 位读者喜欢这篇文章。
Multi-colored and directional network computer cables

对于整个互联网而言,IPv6 是一件好事,但我发现它对于大多数家庭和中小型企业的使用来说过于复杂。像许多其他人一样,我继续为我自己的内部网络和那些我对其负有一定责任的网络使用私有 IPv4 地址范围。无论如何,我的 ISP 只提供 IPv4 地址,因此当所有外部数据包都是 IPv4 时,在内部使用 IPv6 是没有意义的。此外,IPv4 更简单,而我的 Linux 哲学宗旨之一是“寻找简洁”。

因此,我禁用了所有主机上的 IPv6。起初,这似乎很容易。以下是我禁用它的方法。

测试 IPv6

我的主机运行 Fedora 36 Xfce spin 以及我在初始默认安装后执行的许多软件包和配置更改。我的所有主机都安装了最新的更新。其中一个主机是我的防火墙/路由器,这是我禁用 IPv6 的第一个主机。

您可以检查 IPv6 当前是否在您的 Linux 主机上处于活动状态。下面的 nmcli 命令结果来自我的路由器/防火墙主机。所有活动的网卡都有 IPv4 和 IPv6 地址。

# nmcli
enp4s0: connected to enp4s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
        ip4 default
        inet4 45.20.209.41/29
        route4 45.20.209.40/29 metric 102
        route4 default via 45.20.209.46 metric 102
        inet6 2600:1700:7c0:860:8616:f9ff:fe04:4403/64
        inet6 fe80::8616:f9ff:fe04:4403/64
        route6 fe80::/64 metric 256
        route6 default via fe80::a698:13ff:fee5:fa10 metric 1024
        route6 2600:1700:7c0:860::/64 metric 256

enp1s0: connected to enp1s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:E9:89, hw, mtu 1500
        inet4 192.168.10.1/24
        route4 192.168.10.0/24 metric 101
        inet6 fe80::8616:f9ff:fe03:e989/64
        route6 fe80::/64 metric 256

enp2s0: connected to enp2s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:FD:85, hw, mtu 1500
        inet4 192.168.0.254/24
        route4 192.168.0.0/24 metric 100
        inet6 fe80::8616:f9ff:fe03:fd85/64
        route6 fe80::/64 metric 256

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 192.168.0.52 8.8.8.8 8.8.4.4
        interface: enp4s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp2s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp1s0

使用 GRUB 配置内核

GRUB(Grand Unified Bootloader)将内核加载到内存中,并在 Linux 启动过程中设置许多内核参数。当前的引导加载程序实际上是 GRUB2,即 GRUB 的第二个主要版本,但将其简称为 GRUB 更容易。

GRUB 配置文件 /boot/grub2/grub.cfg 提供了内核的启动配置,但您不应直接修改它。UEFI GRUB 配置文件的位置可能因您的发行版而异。但是,它的位置与此目的无关。可以使用 /etc/default/grub 配置文件轻松修改 Linux 启动内核配置,无论它是否使用 UEFI 启动,该文件都可以正确配置内核。

有两个命令行参数要添加到 /etc/default/grub 文件中,以配置 Linux 内核禁用 IPv6。第一个是 GRUB_CMDLINE_LINUX="ipv6.disable=1",它将 "ipv6.disable=1" 添加到内核命令行。

第二个是 GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash",它有点复杂。当您将 GRUB_DISABLE_RECOVERY 设置为 true 时,将为每个 Linux 内核生成一个菜单项。当设置为 false 时,将为每个内核创建两个菜单项:一个默认条目和一个恢复模式条目。此选项列出了仅添加到默认菜单项的命令行参数,位于 GRUB_CMDLINE_LINUX 中列出的参数之后。

另外两个参数定义了内核启动在显示器上的外观。 "quiet" 参数禁用内核在其启动和自配置期间发出的大多数信息性消息。 "splash" 参数使启动画面在内核启动期间显示。启动画面可以是图形,例如徽标或动画。

在进行这些添加后,我的 /etc/default/grub 文件看起来像这样

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash"
GRUB_CMDLINE_LINUX="ipv6.disable=1"

在对 /etc/default/grub 文件进行这些(或任何)添加后,运行 grub2-mkconfig 命令,该命令会将这些参数添加到每个已安装内核的 grub.cfg 配置文件中的内核命令行中。这些更改不会立即生效。您必须重新启动主机才能禁用 IPv6。

自动化此解决方案

使用 Ansible 自动化这些任务非常简单。只需创建一个包含以下设置的 playbook,并针对需要此更改的主机列表运行它。此 playbook 中的前两个任务会追加所需的配置

- name: Play 1 - Modify /etc/default/grub to configure kernel boot parameters.
  hosts: f36vm

  tasks:
    - name: Append GRUB_CMDLINE_LINUX_DEFAULT variable to /etc/default/grub
      lineinfile:
        path: /etc/default/grub
        insertafter: EOF
        line: 'GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash"'

    - name: Append GRUB_CMDLINE_LINUX variable to /etc/default/grub
      lineinfile:
        path: /etc/default/grub
        insertafter: EOF
        line: 'GRUB_CMDLINE_LINUX="ipv6.disable=1"'

    - name: Run grub2-mkconfig to update /boot/grub/grub.cfg
      command:
        cmd: grub2-mkconfig

同样,您必须重新启动主机才能禁用 IPv6。您可以将重启添加到 playbook 中,以便更改立即生效,或者等到下次出于其他原因需要重新启动主机时再重启。

另一种解决方案

我创建了另一个解决方案;它不是最好和最优雅的解决方案。但是,我想展示我的思考过程,因为这里有一些可能有用的信息。

将本地文件添加到 sysctl.d

您可以使用 /etc/sysctl 文件添加必要的配置设置,但最好将本地文件添加到 /etc/sysctl.d 目录,这样它就不会在更新或升级期间被覆盖。请注意,已经有一个名为 99-sysctl.conf 的文件。您可以使用该文件来设置配置,但我为此目的创建了一个名为 99-local-network.conf 的文件,其中包含以下内容。这样,如果 99-sysctl.conf 随未来的更新或升级而更改,我的文件将保持不变。这不是可执行文件;它是配置文件。

################################################################################
# Local NetworkManager settings - Specifically to disable IPV6                 #
################################################################################
#
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

注意:与此类的配置目录中的许多配置文件一样,目录中包含的文件按自然排序顺序读取。这意味着在具有较晚排序顺序的文件中声明的变量值将覆盖同一变量的早期声明。

通常使用重新启动来使这些更改生效,但我后来学会了如何在不重新启动的情况下进行更改。我重新启动了我的系统,并使用以下结果重新运行了 nmcli 命令

[root@wally ~]# nmcli
enp4s0: connected to enp4s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
        ip4 default
        inet4 45.20.209.41/29
        route4 45.20.209.40/29 metric 101
        route4 default via 45.20.209.46 metric 101

enp1s0: connected to enp1s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:E9:89, hw, mtu 1500
        inet4 192.168.10.1/24
        route4 192.168.10.0/24 metric 102

enp2s0: connected to enp2s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:FD:85, hw, mtu 1500
        inet4 192.168.0.254/24
        route4 192.168.0.0/24 metric 100

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 192.168.0.52 8.8.8.8 8.8.4.4
        interface: enp4s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp2s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp1s0

这表明我的简单修复有效。

除了...

除了该解决方案仅适用于我的十二台 Linux 计算机之一。在写完本文的上述部分后,我开始在我的所有其他主机上安装此修复程序。我只做了一个系统,就意识到这种方法并非总是有效。然后我在我的一个 VM 上尝试了它,它也失败了。据我所知,它只在一个主机上有效——我用作防火墙和路由器的那个。

在对 VM 进行一些额外的研究后,我发现这些设置也可以使用 sysctl 作为命令发出,这样系统就不需要重新启动。我可以从命令行输入这些命令来停用 IPv6。这是一个例子

[root@f36vm ~]# sysctl -w net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1
[root@f36vm ~]# sysctl -w net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6 = 1
[root@f36vm ~]# nmcli
enp0s3: connected to Wired connection 1
        "Intel 82540EM"
        ethernet (e1000), 08:00:27:07:CD:FE, hw, mtu 1500
        ip4 default
        inet4 192.168.0.136/24
        route4 192.168.0.0/24 metric 100
        route4 default via 192.168.0.254 metric 100

lo: unmanaged
<SNIP>

我花了一些时间来研究这个问题并确定我创建的文件没有被读取——或者至少没有被 Linux 启动期间的 sysctl 处理。或者,即使它是,它也被忽略了,或者这些设置后来被具有不同值的相同变量覆盖了。之后,我知道没有更深层次的问题阻止它。

关于 sysctl

此时,我更详细地研究了 sysctl 命令。 sysctl 命令的目的是设置 /proc 目录中的内核参数。 root 用户可以使用它从命令行设置单个参数。另外 - 这是我的解决方案的关键 - 您可以使用它来查看和设置存储在多个位置的所有内核参数,包括 /etc/sysctl.conf 和位于 /etc/sysctl.d 中的文件。在 Linux 启动期间使用 sysctl 命令来设置内核参数。

我再说一遍:系统和系统管理员可以使用 sysctl 命令在系统启动并运行时(无需重新启动)查看和设置内核变量。此命令及其为 Linux 系统管理员提供的强大功能是 Linux 与其他操作系统之间最重要的区别之一。它为我们提供了一种工具,可以在其他操作系统上做不可能的事情。

我通过重新启动 VM 并运行以下命令来测试这一点,以设置 sysctl 手册页上列出的所有位置中的变量

[root@f36vm ~]# sysctl --system
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 2
sysctl: setting key "net.ipv4.conf.all.rp_filter": Invalid argument
net.ipv4.conf.default.accept_source_route = 0
sysctl: setting key "net.ipv4.conf.all.accept_source_route": Invalid argument
net.ipv4.conf.default.promote_secondaries = 1
sysctl: setting key "net.ipv4.conf.all.promote_secondaries": Invalid argument
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_regular = 1
fs.protected_fifos = 1
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
net.core.optmem_max = 81920
* Applying /usr/lib/sysctl.d/50-libreswan.conf ...
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
kernel.pid_max = 4194304
* Applying /etc/sysctl.d/99-local-network.conf ...
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...

[root@f36vm ~]#

使用 nmcli 命令检查网卡的状态表明 IPv6 已被禁用,而 IPv4 仍在运行。是的,我确实看到了该数据流中的其他错误,但现在我忽略它们。请务必阅读 sysctl 命令的手册页,因为它非常有趣。它提供了一种使用 --service 选项处理所有 sysctl 配置文件的方法。

解决方案

现在我了解了问题的真正本质,我可以创建一个真正的解决方案 - 即使它可能只是一个临时的规避。我能够以符合 Linux 启动顺序和用于配置内核的 sysctl.d 方法的最初意图的方式来做到这一点。

我将我的新配置文件保留在 /etc/sysctl.d 中。我创建了下面显示的简单 Bash 脚本来运行 sysctl --system 命令,并将其存储在 /usr/local/bin 中。

#!/bin/bash
<SNIP – discarded a bunch of comments to save space>
sysctl --system

在继续之前,我多次测试此脚本以确保它有效。如果您这样做,请务必多次测试它,无论是否重新启动,以返回到原始内核配置。

创建服务

此解决方案的真正关键是创建一个新的 systemd 服务,该服务的工作方式与旧的 rc.local SystemV 脚本类似。在这种情况下,我将其称为 MyStartup.service,并将我上面创建的脚本重命名为 MyStartup.sh。为了创建服务本身,我在 /usr/local/lib/systemd/system 目录中创建了一个新的 systemd 单元文件,我也必须创建该目录。此服务将在启动时运行一次。我将此新文件命名为 MyStartup.service 并添加了以下内容

<SNIP – discarded a bunch of comments to save space>
[Unit]
Description=Runs /usr/local/bin/MyStartup.sh

[Service]
ExecStart=/usr/local/bin/MyStartup.sh

[Install]
WantedBy=multi-user.target

请注意,像这样的 systemd 单元文件不需要是可执行的。它属于 root.root,权限为 664。创建这个服务非常简单,而且我可以将其用于许多本地启动任务,所以我打算即使在现有问题得到永久修复后也保留它。

下面的命令启用新服务。请注意,systemctl 命令默认搜索新目录,无需任何选项、参数或我的提示即可找到新的单元文件。

[root@f36vm ~]# systemctl enable MyStartup.service
Created symlink /etc/systemd/system/multi-user.target.wants/MyStartup.service → /usr/local/lib/systemd/system/MyStartup.service.

启用服务不会运行 MyStartup.sh 脚本。此服务将在每次重启时运行该脚本。

测试

虚拟机重启后,我立即以 root 用户身份登录,并运行以下命令来检查 IPv6 的状态,但它仍然处于活动状态。经过更多测试后,我确定该服务运行命令的时间太早,因此我在 MyStartup.sh 脚本中添加了一个命令,让它在运行命令前休眠 25 秒。 这是编辑后的脚本:

#!/bin/bash
<SNIP – discarded a bunch of comments to save space>
# Wait a bit for things to start up and settle. It doesn't work without this.
sleep 25
# Run the sysctl command.
sysctl --system

我再次重启,并在可以登录后立即验证了状态,结果是该服务仍在休眠。

[root@f36vm ~]# systemctl status MyStartup.service
● MyStartup.service - Runs /usr/local/bin/MyStartup.sh
     Loaded: loaded (/usr/local/lib/systemd/system/MyStartup.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2022-07-01 13:24:22 EDT; 14s ago
   Main PID: 667 (MyStartup.sh)
      Tasks: 2 (limit: 14129)
     Memory: 592.0K
        CPU: 1ms
     CGroup: /system.slice/MyStartup.service
             ├─ 667 /bin/bash /usr/local/bin/MyStartup.sh
             └─ 669 sleep 25

在等待一段时间后,我再次检查,服务已成功完成,最后几个日志条目清楚地显示了结果。 进一步的测试表明,三秒的延迟是可靠的,而仅一秒的延迟总是失败。

Jul 01 13:24:22 f36vm.both.org systemd[1]: Started MyStartup.service - Runs /usr/local/bin/MyStartup.sh.

[root@f36vm ~]# systemctl status MyStartup.service
○ MyStartup.service - Runs /usr/local/bin/MyStartup.sh
     Loaded: loaded (/usr/local/lib/systemd/system/MyStartup.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Fri 2022-07-01 13:24:47 EDT; 358ms ago
    Process: 667 ExecStart=/usr/local/bin/MyStartup.sh (code=exited, status=0/SUCCESS)
   Main PID: 667 (code=exited, status=0/SUCCESS)
        CPU: 9ms

Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv4.conf.all.send_redirects = 0
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv4.conf.all.accept_redirects = 0
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /usr/lib/sysctl.d/50-pid-max.conf ...
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: kernel.pid_max = 4194304
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /etc/sysctl.d/99-local-network.conf ...
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv6.conf.all.disable_ipv6 = 1
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv6.conf.default.disable_ipv6 = 1
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /etc/sysctl.d/99-sysctl.conf ...
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /etc/sysctl.conf ...
Jul 01 13:24:47 f36vm.both.org systemd[1]: MyStartup.service: Deactivated successfully.

[root@f36vm ~]#

您可以在上面的数据输出中看到,99-sysctl.conf 文件中的配置语句已应用。 我还使用 nmcli 命令来验证 IPv6 是否已禁用。

自动化

在弄清楚如何始终如一地实现此解决方案之后,我添加了一组任务到 Ansible playbook 中,用于分发新的和更新的配置文件。 这使我可以轻松地管理我目前的 12 台主机。 我还将其添加到我在全新主机上执行基本安装后或出于某种原因需要重新安装的主机上立即使用的 playbook 中。 我将以下任务添加到这些 playbook 中。

第一组任务用于我添加新服务的解决方案

    - name: Install 99-local-network.conf file to disable IPV6
      copy:
        src: /root/ansible/system-scripts/files/99-local-network.conf
        dest: /etc/sysctl.d
        mode: 0644
        owner: root
        group: root

    - name: Install MyStartup.sh
      copy:
        src: /root/ansible/system-scripts/files/MyStartup.sh
        dest: /usr/local/bin
        mode: 0754
        owner: root
        group: root

    - name: create /root/ansible/system-scripts/files/ directory
      file:
        path: /root/ansible/system-scripts/files/
        state: directory
        mode: 0755
        owner: root
        group: root  
      
    - name: Install MyStartup.service
      copy:
        src: /root/ansible/system-scripts/files/MyStartup.service
        dest: /usr/local/lib/systemd/system/
        mode: 0664
        owner: root
        group: root

    - name: Enable the MyStartup.service
      systemd:
        name: MyStartup.service
        state: stopped
        enabled: yes

    - name: Run the raw command to disable IPV4 so a reboot is not required at this time
      command:
        cmd: sysctl --system

这个更复杂的解决方案的优点是,将配置文件添加到 sysctl.d 目录,然后运行包含这一系列任务的 playbook,可以在不需要重启的情况下禁用 IPv6。

最后思考

虽然只安装具有正确内核参数的文件并重启在我的一台主机上工作正常,但在我尝试的所有其他主机上都失败了。我寻找了可能解释为什么它在其他主机上失败而在我的路由器/防火墙上工作的原因,但没有找到任何线索来解释为什么会这样。我发现这个问题存在于新安装的 Fedora 36 主机上,无论是否进行了我总是执行的更改和安装后配置,以及那些进行了我通常的更改的主机上。我确实计划继续调查。我打算向 Red Hat 提交一份错误报告,以便能够真正解决这个问题,而不是采用这些规避方法中的任何一种。

两种规避方法都不依赖于任何网卡配置文件的存在,无论是过去位于 /etc/sysconfig/network-scripts 中的旧式接口配置文件,还是位于 /etc/NetworkManager/system-connections 目录中的较新的 NetworkManager 接口连接文件。 无论是否有这些文件,它都可以工作。 结果对主机上的所有网络接口都是全局的。

我自己的解决方案是一种通用的方法,您可以用来代替旧 SystemV 启动时代的旧 rc.local 脚本。

资源

以下资源尽可能保持最新,但在任何给定时间可能不是完全准确的。

  • GRUB 手册可以通过 GNU 网站以多种格式获得。
  • Fedora 文档网站有一个很棒的页面,使用 GRUB2 进行引导加载
  • Red Hat RHEL 7 在线文档也有一章关于使用 GRUB2 引导加载程序的很好的介绍。
  • kernel.org 网站上有很长的内核参数列表和大量关于 Linux 内核的其他信息。
David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。 他自 1996 年以来一直在使用 Linux 和开源软件,自 1969 年以来一直在使用计算机。 他是“系统管理员的 Linux 哲学”的坚定支持者和传播者。

3 条评论

很棒的文章,提供了多种角度来永久或即时禁用 IPv6 - 谢谢

我实际上在 opensource.com 上注册,以便能够为这篇文章保存一个“谢谢”评论 - 对我帮助很大。

我对你的解决方案的实现做了一些更改,我将在此处指出,以防对任何人有帮助

1. 我没有编写常规的“simple/forking” systemd 服务单元,而是编写了一个“oneshot”服务。 我已将其粘贴在下面。

2. 我没有让服务调用 shell 脚本,而是让它直接调用 sysctl --load=[FILE],其中 [FILE] 是我放置在 '/etc/sysctl.d' 中包含 ipv6 禁用设置的本地 drop-in 文件的名称。 解决方案中涉及的文件越少越好。

3. 为了确保修复不会在系统启动时过早尝试,我在服务单元文件中使用了 After = 参数来强制等待网络上线后再触发。 到目前为止,这对我来说似乎有效,并且避免了任何内置时间延迟的需求。

4. 我选择仅直接加载我创建的单个 IPv6 设置文件,而不是运行 sysctl --system(这基本上会导致所有系统配置文件都被加载),因为我认为最小化此修复的影响范围是另一件好事。

这是我最终使用的 oneshot 服务单元文件(包含对您文章的归属参考,再次感谢您)

#################################################################################
# 文件名:/etc/systemd/system/disable_ipv6.service
# 创建者:wirerydr
# 创建日期:[2022-08-17 00:29]
# 上次修改时间:[2022-08-17 01:16]
# 描述:用于在启动期间完全禁用 IPv6 的 Oneshot 服务
#################################################################################
# 注意:似乎在启动期间,'/etc/sysctl.d/*.conf' 中的设置并非总是应用。
# 为了缓解这种情况,此 systemd oneshot 服务强制应用一个设置文件
# '/etc/sysctl.d/70-disable-ipv6.conf',该文件完全禁用 IPv6。 此 oneshot 服务在
# 系统启动期间,在达到 systemd 'network-online' 目标后调用。
# 系统启动期间,在达到 systemd 'network-online' 目标后调用。
#
# 从 'https://open-source.net.cn/article/22/8/disable-ipv6' 派生,感谢您。
#################################################################################
#
[Unit]
Description = "在启动时完全禁用 IPv6 的 Oneshot 服务"
After = network-online.target
#
[Service]
Type = oneshot
RemainAfterExit = yes
ExecStart =/bin/bash -c "sysctl --load=/etc/sysctl.d/70-disable-ipv6.conf"
#
[Install]
WantedBy = multi-user.target

@Abbas 和 @WireRydr -- 感谢您的评论,我很高兴这篇文章对您有所帮助。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议授权。
© . All rights reserved.