Как отключить IPv6 при подключении к серверу OpenVPN с помощью Network Manager в системе с двумя стеками?
Я использую клиента OpenVPN через плагин OpenVPN Network Manager в двойном стеке (то есть настроен как для подключения IPv4, так и для подключения к IPv6) Ubuntu 13.10 для перенаправления всего трафика через VPN (redirect-gateway). Как правило, работает нормально.
Однако из-за того, что система предпочитает IPv6, VPN "протекает", и при подключении к сайтам, которые также доступны через IPv6 (например, Google или Википедия), браузер подключается напрямую.
Одним из решений было бы настроить сервер OpenVPN для обеспечения подключения IPv6. Хотя это возможно с OpenVPN, плагин для Network Manager в настоящее время не поддерживает его.
Поскольку подключение IPv6 через VPN не является строго необходимым, я хотел бы просто отключить IPv6 на клиенте при подключении к серверу OpenVPN. Является ли это возможным? Если так, как я могу это сделать?
7 ответов
Добавьте это в строку вашего ядра в загрузчике, чтобы полностью отключить 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 ни одному из ваших сетевых устройств.
ИЛИ ЖЕ
Чтобы отключить IPv6 через sysctl, поместите следующее в ваш /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
Так что если вам нужно отключить 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
НОТА
Возможно, вам придется отключить любые хосты ipv6 в вашем /etc/hosts
Файл для этого метода тоже, как я рекомендовал в предыдущем методе.
Вы можете отключить ipv6 на уровне клиента для определенного подключения Network Manager, установив для параметра IPv6 ipv6.method значение "игнорировать".
// SOP: воссоздать соединение с локальной сетью, используя ИСПРАВЛЕНО IP 192.168.0.95 для Ethernet. `` `` `
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
`` `` `
Я думаю, что менее навязчиво отключить ip6 в клиентском файле (отредактируйте client_conf_file.ovpn), который модифицирует стек tcp ядра.
Откройте свой 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
Отредактируйте профиль OpenVPN в NetworkManager, откройте вкладку IPv6 и вручную добавьте маршрут:
Адрес: 2000 Префикс: 3 Шлюз: 0100::1
2000:: / 3 перехватывает все общедоступные IPv6-адреса. Префикс 0100::/64 - это специальный префикс, предназначенный для отбрасывания трафика. По сути, вы будете отправлять весь трафик IPv6 на несуществующий шлюз.
Сверху: легко и полностью автоматически.
Недостаток: некоторые приложения, а именно инструменты командной строки, могут не откатиться к IPv4 так быстро, как хотелось бы при использовании этого метода.
Я на Ubuntu 16.04.03 LTS, подключаюсь к серверу Pi-Hole через PiVPN.
Вот что я сделал для автоматического включения и выключения IPv6 при подключении к VPN через Network Manager:
Создать скрипт в
/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
Вот и все. Мне пришлось вручную добавить свой Pi-Hole DNS из-за dnsmasq
ошибка, которая мешает resolv.conf
от корректного обновления, поэтому измените указанные строки, если обнаружите, что у вас утечка DNS.
Я хотел бы просто отключить IPv6 на клиенте при подключении к серверу OpenVPN. Является ли это возможным?
Попробуйте мой простой сценарий, который я только что сделал, это будет,
- Разобраться со всеми интерфейсами.
- Отключите ipv6 при запуске OpenVPN.
- Включите ipv6, когда OpenVPN закончится.
- Лучшая совместимость с аргументом NetworkManager.
Если на определенных интерфейсах все еще есть адрес ipv6, клиент все еще пробует маршрутизацию ipv6, но поскольку DNS использует UDP, есть вероятность утечки DNS, которую TCPwrapper не может отключить.
Этот сценарий также хорошо работает с другими интерфейсами, потому что он больше не зависит от аргумента 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 с Network Manager теряет множество опций преимуществ OpenVPN из версий командной строки.
Если кому-то все еще нужна эта информация и ни один из других вариантов не работает; Я решил эту проблему, зайдя в файл конфигурации сервера Openvpn.
Первый тип в
Затем введите
Затем закомментируйте, добавив # в начало этих строк:
server-ipv6 fd[ip info]
tun-ipv6
push tun-ipv6
push route-ipv6 [ip info]
push redirect-gateway ipv6
После сохранения файла мы собираемся перезапустить Openvpn с помощью следующей команды:
sudo systemctl restart openvpn
На этом этапе проблема должна быть исправлена. Когда я запускаю свой файл ovpn, он не показывает никакой информации об использовании ivp6. Надеюсь, что это работает для вас.