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


20

我正在通过双堆栈上的OpenVPN Network Manager插件使用OpenVPN客户端(意味着同时配置了IPv4和IPv6连接),Ubuntu 13.10会通过VPN重定向所有流量(重定向网关)。它通常可以正常工作。

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

一种解决方案是将OpenVPN服务器配置为提供IPv6连接。尽管可以通过OpenVPN使用,但Network Manager插件目前不支持它。

由于并非严格要求通过VPN进行IPv6连接,因此我想在连接到OpenVPN服务器时仅在客户端上禁用IPv6。可能吗?如果是这样,我该怎么办?


1
您的VPN也没有传送IPv6流量吗?
迈克尔·汉普顿


我的VPN很可能承载IPv6流量,但是据我所知,Network Manager当前不支持OpenVPN的IPv6配置。
该死的码头

1
仅作记录,如果您的VPN提供商像这样泄漏,则需要一个新的提供商。许多人都正确地做到了。IPv6不会消失,并且禁用它只会使您与Internet的一部分隔离开来。
迈克尔·汉普顿

1
@MichaelHampton不幸的是,这是我的服务器。在这种情况下,我是提供商。它确实支持IPv6,但仅附带一个/ 64,因此我需要先对其进行拼接,这有点麻烦。更重要的是(当时我还没有检查过)网络管理器在处理启用IPv6的OpenVPN连接时遇到了一些麻烦(但是,IPv6 over VPN可以与我现在使用的分接和桥接网络设置一起使用)。
该死的候机楼

Answers:


15

将其添加到引导加载程序的内核行中以完全禁用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

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

#::1        localhost.localdomain   localhost

注意

sysctl方法可能需要重新引导,而内核行方法肯定需要重新引导。

要么

暂时禁用IPv6:

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

暂时启用它:

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

因此,如果您需要在给定条件下禁用ipv6 ,则可以按照以下几行方法编写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主机,就像我在上一种方法中建议的那样。


5
是的,好的 但是我想在使用网络管理器连接到VPN时禁用IPv6,而不是在我的系统上完全杀死它。也许我应该更清楚一点。
该死的

@DamnTerminal,所以您只想在连接到VPN时将其禁用,因为在系统范围内禁用它就可以了,只要它仅在您连接到VPN时才发生?
Alexej Magura 2014年

@DamnTerminal我更新了答案,以包含一个示例,该示例说明如何使用bash脚本禁用ipv6,该脚本将检查条件。您可能可以使用NetworkManager的命令行界面:nmcli检查您是否连接到VPN;如果那行不通,那么我确定那里有一个命令行网络实用程序可以访问该信息。
Alexej Magura 2014年

为什么要下票?
Alexej Magura

不幸的是,此解决方案(sysctl)无法正确重新启用WiFi的IPv6。您需要重新连接到接入点才能启用它。
伊戈尔·米库什金

5

您可以在客户端级别为特定的网络管理器连接禁用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

``


1
不幸的是,它对VPN连接无效。
伊戈尔·米库什金

0

我在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
    

而已。我必须手动添加我的Pi-Hole DNS,因为有一个dnsmasq错误导致无法resolv.conf正确更新,因此,如果发现DNS泄漏,请修改指示的行。


不幸的是,此解决方案无法正确重新启用IPv6以实现WiFi。您需要重新连接到接入点才能启用它。
伊戈尔·米库什金

0

我认为禁用修改内核tcp堆栈的客户端文件(edit client_conf_file.ovpn)中的ip6不太麻烦。

打开您的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

0

在NetworkManager中编辑OpenVPN配置文件,打开IPv6选项卡并手动添加路由:

地址:2000前缀:3网关:0100 :: 1

2000 :: / 3捕获所有可公开路由的IPv6地址。0100 :: / 64前缀是指定用于丢弃流量的特殊前缀。本质上,您将把所有IPv6流量发送到不存在的网关。

优势:简单且完全自动化。

缺点:某些应用程序(即命令行工具)使用这种方法时可能无法尽快回退到IPv4。


0

连接到OpenVPN服务器时,我只想在客户端上禁用IPv6。可能吗?

试试我刚才制作的简单脚本,这样做,

  • 处理整个接口。
  • 启动OpenVPN时禁用ipv6。
  • OpenVPN结束时启用ipv6。
  • 与NetworkManager参数的兼容性更好。

如果某些接口上仍存在ipv6地址,则客户端仍会尝试ipv6路由,但是由于DNS使用UDP,TCPwrapper可能无法禁用DNS泄漏的机会。

该脚本还可以与其他接口配合使用,因为它不再依赖NetworkManager的参数,例如vpn-up vpn-down。

在/etc/NetworkManager/dispatcher.d/中创建一个可执行文件

sudo vim /etc/NetworkManager/dispatcher.d/v6d

粘贴下面的代码

#!/bin/bash
IF=$1
STATUS=$2
if [ "$IF" = "tun0" ];
then
case "$2" in
up)
for v6 in $(sysctl -a |grep ipv6|grep disable|sed 's/ \= 0/=1/'); do
sysctl -w $v6
done
;;
down)
for v6 in $(sysctl -a |grep ipv6|grep disable|sed 's/ \= 1/\=0/'); do
sysctl -w $v6
done
;;
esac
fi

然后使其可执行

sudo vim /etc/NetworkManager/dispatcher.d/v6d

带有网络管理器的PS OpenVPN失去了许多命令行版本的OpenVPN好处选项。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.