Как отключить 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:

  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 на клиенте при подключении к серверу 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.conf не позволяет вам редактировать его, не делая его доступным для записи.

Затем введите ; вы можете заменить vim на любой другой текстовый редактор, просто обратите внимание, что мы собираемся редактировать этот файл.

Затем закомментируйте, добавив # в начало этих строк:

      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. Надеюсь, что это работает для вас.

Другие вопросы по тегам