我在双栈(即同时配置 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 的操作:
在中创建脚本
/etc/NetworkManager/dispatcher.d
:$ sudo vi /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
在文件中添加以下内容(根据您的要求修改内容):
#!/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
使脚本可执行:
$ sudo chmod 755 /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
就是这样。由于存在一个dnsmasq
错误导致无法resolv.conf
正确更新,我不得不手动添加我的 Pi-Hole DNS,因此如果您发现 DNS 泄漏,请修改指示的行。