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

我通过双栈上的OpenVPN网络管理器插件使用OpenVPN客户端(意味着配置了IPv4和IPv6连接)Ubuntu 13.10通过VPN(重定向网关)重定向所有流量。 它通常工作正常。

但是,由于IPv6是系统首选的事实,VPN“泄漏”,当连接到也可通过IPv6获得的站点(如Google或Wikipedia)时,浏览器会直接连接。

一种解决方案是配置OpenVPN服务器以提供IPv6连接。 尽管使用OpenVPN,网络管理器的插件目前不支持它。

由于VPN上的IPv6连接不是绝对必要的,因此我想在连接到OpenVPN服务器时在客户端上禁用IPv6。 可能吗? 如果是这样,我该怎么办?

将此添加到引导加载程序中的内核行以完全禁用IPv6:

ipv6.disable=1 

如果你正在使用Grub(如果你没有安装自己的boot-loader,那么你正在使用Grub),你的内核行应该是这样的:

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

向内核行添加内容的推荐方法是将所需的内核参数添加到/etc/default/grub文件中的GRUB_CMDLINE_LINUX_DEFAULT变量:

 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主机,就像我在上一个方法中所建议的那样。

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

// SOP:使用FIXED 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 

““

我在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泄漏,请修改指示的行。