Как отключить IPv6 при подключении к серверу OpenVPN с помощью Network Manager в системе с двумя стеками?

20

Я использую клиента 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. Является ли это возможным? Если так, как я могу это сделать?

Чертов терминал
источник
1
Ваш VPN также не передает трафик IPv6?
Майкл Хэмптон
Моя VPN вполне могла бы передавать трафик IPv6, но, насколько я могу судить, Network Manager в настоящее время не поддерживает конфигурацию IPv6 для OpenVPN.
Черт, Терминал
1
Для справки: если ваш VPN-провайдер протекает так, вам нужен новый провайдер. Многие из них понимают это правильно. IPv6 не уйдет, и его отключение только отрежет вас от части Интернета.
Майкл Хэмптон
1
@MichaelHampton К сожалению, это мой сервер. Я провайдер в этом деле. Он поддерживает IPv6, но поставляется только с одним / 64, поэтому мне нужно сначала соединить его, что немного затруднит. Что еще более важно (в то время я не проверял с тех пор), у сетевого менеджера были некоторые проблемы с обработкой подключений OpenVPN с поддержкой IPv6 (однако IPv6 через VPN работает, однако, с настройкой сети с подключением и мостовым соединением, которой я сейчас и пользуюсь).
Черт, Терминал

Ответы:

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 ни одному из ваших сетевых устройств.

ИЛИ

Чтобы отключить 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файле для этого метода, как я рекомендовал в предыдущем методе.

Алексей Магура
источник
5
Да, ок. Но я хочу отключить IPv6 при подключении к VPN с помощью Network Manager, а не уничтожать его полностью в моей системе. Может быть, я должен был прояснить это.
Черт, Терминал
@DamnTerminal, так что вы хотите отключить его только при подключении к VPN, так как отключить его для всей системы можно, если это происходит только при подключении к VPN?
Алексей Магура
@DamnTerminal Я обновил свой ответ, включив в него пример того, как отключить ipv6, используя скрипт bash, который проверял бы условие. Вы, вероятно, могли бы использовать интерфейс командной строки NetworkManager: nmcliпроверить, подключен ли ваш VPN; если это не сработает, я уверен, что есть сетевая утилита командной строки, которая даст доступ к этой информации.
Алексей Магура
Почему отрицательный голос?
Алексей Магура
К сожалению, это решение ( sysctl) не позволяет правильно повторно включить IPv6 для WiFi. Вам необходимо повторно подключиться к точке доступа, чтобы включить ее.
Игорь Микушкин
5

Вы можете отключить 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

`` `` `

Рольф
источник
1
К сожалению, это не влияет на VPN-соединения.
Игорь Микушкин
0

Я на Ubuntu 16.04.03 LTS, подключаюсь к серверу Pi-Hole через PiVPN.

Вот что я сделал для автоматического включения и выключения IPv6 при подключении к VPN через Network Manager:

  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.

ooknosi
источник
К сожалению, это решение не позволяет правильно повторно включить IPv6 для WiFi. Вам необходимо повторно подключиться к точке доступа, чтобы включить ее.
Игорь Микушкин
0

Я думаю, что менее навязчиво отключить 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
Em50L
источник
0

Отредактируйте профиль OpenVPN в NetworkManager, откройте вкладку IPv6 и вручную добавьте маршрут:

Адрес: 2000 Префикс: 3 Шлюз: 0100 :: 1

2000 :: / 3 перехватывает все общедоступные IPv6-адреса. Префикс 0100 :: / 64 - это специальный префикс, предназначенный для отбрасывания трафика. По сути, вы будете отправлять весь трафик IPv6 на несуществующий шлюз.

Сверху: легко и полностью автоматически.

Недостаток: некоторые приложения, а именно инструменты командной строки, могут не откатиться к IPv4 так быстро, как хотелось бы при использовании этого метода.

Нильс
источник
0

Я хотел бы просто отключить 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 из версий командной строки.

Seandex
источник