在双栈系统上使用网络管理器连接到 OpenVPN 服务器时如何禁用 IPv6?

在双栈系统上使用网络管理器连接到 OpenVPN 服务器时如何禁用 IPv6?

我在双栈(即同时配置 IPv4 和 IPv6 连接)Ubuntu 13.10 上通过 OpenVPN 网络管理器插件使用 OpenVPN 客户端,通过 VPN(重定向网关)重定向所有流量。它通常运行良好。

但是,由于系统首选 IPv6,VPN 会出现“泄漏”,当连接到也可通过 IPv6 访问的网站(例如 Google 或 Wikipedia)时,浏览器会直接连接。

一种解决方案是配置 OpenVPN 服务器以提供 IPv6 连接。虽然 OpenVPN 可以实现,但网络管理器插件目前不支持它。

由于 VPN 上的 IPv6 连接并非绝对必要,我想在连接到 OpenVPN 服务器时在客户端上禁用 IPv6。可以吗?如果可以,我该怎么做?

答案1

将其添加到您的内核线在您的引导加载程序中完全禁用 IPv6:

ipv6.disable=1

如果您正在使用 Grub(如果您尚未安装自己的引导加载程序,那么您正在使用 Grub),您的内核行应该看起来像这样:

linux /boot/vmlinuz-linux root=UUID=978e3e81-8048-4ae1-8a06-aa727458e8ff ipv6.disable=1

对于向内核行添加一些内容,建议的方法是将所需的内核参数添加到文件GRUB_CMDLINE_LINUX_DEFAULT中的变量中/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"

将其添加到后/etc/default/grub,运行以下命令重新生成您的grub.cfg

sudo grub-mkconfig -o /boot/grub/grub.cfg

或者,添加ipv6.disable_ipv6=1将保持 IPv6 堆栈正常运行,但不会为任何网络设备分配 IPv6 地址。

或者

要通过 sysctl 禁用 IPv6,请将以下内容放入您的/etc/sysctl.conf文件中:

net.ipv6.conf.all.disable_ipv6 = 1

不要忘记注释掉文件中的所有 IPv6 主机/etc/hosts

#::1        localhost.localdomain   localhost

笔记

sysctl 方法可能需要重新启动,重新启动确实内核线方法所需的。

或者

暂时地禁用 ipv6:

sysctl -w net.ipv6.conf.all.disable_ipv6=1

暂时地启用它:

sysctl -w net.ipv6.conf.all.disable_ipv6=0

因此,如果你需要在给定的状况,然后按照以下方式编写一个 bash 脚本:

#!/bin/bash
ipv6_disabled="$(sysctl net.ipv6.conf.all.disable_ipv6 | awk '{print $NF}')"
if (connected_to_vpn &> /dev/null); then
  (($ipv6_disabled)) || sysctl -w net.ipv6.conf.all.disable_ipv6=1
else
  (($ipv6_disabled)) && sysctl -w net.ipv6.conf.all.disable_ipv6=0
fi

笔记

您可能也需要/etc/hosts为此方法禁用文件中的任何 ipv6 主机,就像我在上一种方法中所建议的那样。

答案2

您可以在客户端级别为特定网络管理器禁用 ipv6联系通过将 IPv6 选项 ipv6.method 设置为“ignore”

// SOP:使用固定 IP 192.168.0.95 重新创建到以太网的 LAN 连接。````

nmcli connection delete lan-ethernet
nmcli connection add con-name lan-ethernet \
    ifname enp0s31f6 \
    type ethernet \
    ip4 192.168.0.95/24  gw4 192.168.0.1

nmcli connection modify lan-ethernet  ipv6.method "ignore"
nmcli connection modify lan-ethernet  ipv4.dns "8.8.8.8 8.8.4.4"
nmcli connection up lan-ethernet
sleep 1
nmcli device status
nmcli connection show
ifconfig enp0s31f6

````

答案3

我认为在修改内核 tcp 堆栈的客户端文件中禁用 ip6(编辑 client_conf_file.ovpn)的侵入性较小。

打开你的 conf_file.ovpn 并添加以下行:

#disable ipv6
#https://community.openvpn.net/openvpn/ticket/849
pull-filter ignore "ifconfig-ipv6 "
pull-filter ignore "route-ipv6 "

我尝试了一下,之后 ipv6 就消失了。

之前我运行了一下ip a |grep global,结果是:

    inet 192.168.43.39/24 brd 192.168.43.255 scope global dynamic noprefixroute wlan0
    inet 10.8.0.6/24 brd 10.8.0.255 scope global tun0
    inet6 2a00:1630:66:16::1004/64 scope global

之后我运行ip a |grep global,结果是:

    inet 192.168.1.14/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0
    inet 10.8.0.7/24 brd 10.8.0.255 scope global tun0

答案4

我在 Ubuntu 16.04.03 LTS 上,通过 PiVPN 连接到 Pi-Hole 服务器。

这是我通过网络管理器连接到 VPN 时自动打开和关闭 IPv6 的操作:

  1. 在中创建脚本/etc/NetworkManager/dispatcher.d

    $ sudo vi /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
    
  2. 在文件中添加以下内容(根据您的要求修改内容):

    #!/bin/sh
    # Network Manager Dispatcher Hook:
    # enables/disables ipv6 on vpn-down/vpn-up respectively
    #
    # Copyright (c) 2017 ooknosi
    # Apache License 2.0
    
    # Args
    INTERFACE="$1"
    ACTION="$2"
    
    case $ACTION in
        vpn-up)
        # vpn connected; disable ipv6
        sysctl -w net.ipv6.conf.all.disable_ipv6=1
        ### UNCOMMENT AND EDIT BELOW IF NECESSARY
        ## add pi-hole nameserver
        #echo -n "nameserver 192.168.1.1" | /sbin/resolvconf -a "tun0.openvpn"
        ### UNCOMMENT AND EDIT ABOVE IF NECESSARY
        ;;
    
        vpn-down)
        # vpn disconnected; enable ipv6
        sysctl -w net.ipv6.conf.all.disable_ipv6=0
        ### UNCOMMENT AND EDIT BELOW IF NECESSARY
        ## remove pi-hole nameserver
        #/sbin/resolvconf -d "tun0.openvpn"
        ### UNCOMMENT AND EDIT ABOVE IF NECESSARY
        ;;
    esac
    
    exit 0
    
  3. 使脚本可执行:

    $ sudo chmod 755 /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
    

就是这样。由于存在一个dnsmasq错误导致无法resolv.conf正确更新,我不得不手动添加我的 Pi-Hole DNS,因此如果您发现 DNS 泄漏,请修改指示的行。

相关内容