Вопрос или проблема
Я использую клиент OpenVPN через плагин OpenVPN Network Manager на Ubuntu 13.10 с двойным стеком (то есть настроенным как для подключения по IPv4, так и по IPv6), чтобы перенаправить весь трафик через VPN (redirect-gateway). В общем, это работает хорошо.
Однако, из-за того что система предпочитает IPv6, VPN “утекает”, и при подключении к сайтам, доступным также по IPv6 (как Google или Wikipedia), браузер подключается напрямую.
Одно из решений заключается в настройке сервера OpenVPN для предоставления подключения по IPv6. Хотя это возможно с OpenVPN, плагин для Network Manager в настоящее время этого не поддерживает.
Так как подключение по IPv6 через VPN не является строго необходимым, я хотел бы просто отключить IPv6 на клиенте при подключении к серверу OpenVPN. Это возможно? Если да, то как это сделать?
Добавьте это в вашу строку ядра в загрузчике, чтобы полностью отключить 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 в “ignore”.
// SOP: Воссоздать моё LAN-соединение с фиксированным 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
““
Я думаю, что менее навязчиво отключать IPv6 в файле клиента (отредактировать 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
Я на 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: # включает/выключает ipv6 при vpn-down/vpn-up соответственно # # Copyright (c) 2017 ooknosi # Apache License 2.0 # Аргументы INTERFACE="$1" ACTION="$2" case $ACTION in vpn-up) # vpn подключен; отключить ipv6 sysctl -w net.ipv6.conf.all.disable_ipv6=1 ### РАСКОММЕНТИРУЙТЕ И Измените НИЖЕ, ЕСЛИ НЕОБХОДИМО ## добавьте именсервер pi-hole #echo -n "nameserver 192.168.1.1" | /sbin/resolvconf -a "tun0.openvpn" ### РАСКОММЕНТИРУЙТЕ И Измените ВЫШЕ, ЕСЛИ НЕОБХОДИМО ;; vpn-down) # vpn отключен; включить ipv6 sysctl -w net.ipv6.conf.all.disable_ipv6=0 ### РАСКОММЕНТИРУЙТЕ И Измените НИЖЕ, ЕСЛИ НЕОБХОДИМО ## удалите именсервер pi-hole #/sbin/resolvconf -d "tun0.openvpn" ### РАСКОММЕНТИРУЙТЕ И Измените ВЫШЕ, ЕСЛИ НЕОБХОДИМО ;; esac exit 0
-
Сделайте скрипт исполняемым:
$ sudo chmod 755 /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
Вот и всё. Мне пришлось вручную добавить мой DNS Pi-Hole из-за ошибки dnsmasq
, которая препятствует правильному обновлению resolv.conf
, поэтому измените указанные строки, если вы обнаружите утечку DNS.
Отредактируйте профиль OpenVPN в NetworkManager, откройте вкладку IPv6 и вручную добавьте маршрут:
Адрес: 2000
Префикс: 3
Шлюз: 0100::1
2000::/3 охватывает все общедоступные маршрутизируемые IPv6 адреса. Префикс 0100::/64 – это специальный префикс, предназначенный для отбрасывания трафика. По сути, вы будете отправлять весь IPv6 трафик на шлюз, который не существует.
Плюс: просто и полностью автоматически.
Минус: некоторые приложения, а именно инструменты командной строки, могут не так быстро возвращаться к IPv4, как хотелось бы, когда используется этот метод.
Я хотел бы просто отключить 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 chmod +x /etc/NetworkManager/dispatcher.d/v6d
П.С. OpenVPN с Network Manager теряет многие преимущества, которые предоставляет версия командной строки.
Если кому-то все еще нужна эта информация, и ни один из других вариантов не сработал; я решил эту проблему, зайдя в конфигурационный файл сервера Openvpn.
Сначала введите sudo chmod a+w /etc/openvpn/server.conf
, так как server.conf не позволяет вам редактировать его, не сделав его записываемым.
Затем введите vim /etc/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, он не показывает никаких данных о том, что IPv6 используется. Надеюсь, это поможет вам.
Если вы используете это решение (Адрес: 2000::
Префикс: 3
Шлюз: 0100::1
)
Вы можете установить DNS на ::
, чтобы предотвратить утечки DNS.
Ответ или решение
Чтобы отключить IPv6 при подключении к серверу OpenVPN с использованием Network Manager на системе с поддержкой как IPv4, так и IPv6, вы можете воспользоваться несколькими методами. Ниже представлены наиболее эффективные шаги, которые помогут вам предотвратить утечку трафика через IPv6 при использовании VPN.
Способ 1: Настройка NetworkManager
-
Открытие конфигурации подключения:
- Запустите команду в терминале для открытия конфигурации вашего VPN-подключения:
nm-connection-editor
- Выберите ваше подключение OpenVPN и откройте настройки.
- Запустите команду в терминале для открытия конфигурации вашего VPN-подключения:
-
Отключение IPv6:
- Перейдите на вкладку
IPv6 Settings
. - Установите метод IPv6 в
"Ignore"
:- В поле Method выберите
Ignore
.
- В поле Method выберите
- Сохраните изменения.
- Перейдите на вкладку
Способ 2: Изменение конфигурационного файла OpenVPN
-
Редактирование файла конфигурации:
- Найдите и откройте ваш
.ovpn
файл конфигурации в текстовом редакторе. - Добавьте следующие строки в конец файла для отключения IPv6:
#disable ipv6 pull-filter ignore "ifconfig-ipv6" pull-filter ignore "route-ipv6"
- Найдите и откройте ваш
-
Сохраните изменения и закройте редактор.
Способ 3: Скрипт в NetworkManager
-
Создание скрипта:
- Создайте скрипт в каталоге
/etc/NetworkManager/dispatcher.d/
:sudo touch /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch sudo chmod +x /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
- Создайте скрипт в каталоге
-
Редактирование скрипта:
- Откройте созданный файл в редакторе:
sudo nano /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
-
Вставьте следующий код:
#!/bin/bash IF=$1 STATUS=$2 if [ "$IF" = "tun0" ]; then case "$STATUS" in up) sysctl -w net.ipv6.conf.all.disable_ipv6=1 ;; down) sysctl -w net.ipv6.conf.all.disable_ipv6=0 ;; esac fi
- Откройте созданный файл в редакторе:
-
Сохраните и закройте файл.
Эти действия сделают так, что при подключении к VPN IPv6 будет отключен, а при отключении повторно включен.
Способ 4: Использование параметров ядра
-
Изменение параметров ядра:
- Вы также можете отключить IPv6 путем добавления параметра при загрузке. Для этого отредактируйте файл
/etc/default/grub
и добавьтеipv6.disable=1
к строкеGRUB_CMDLINE_LINUX_DEFAULT
, например:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ipv6.disable=1"
- Вы также можете отключить IPv6 путем добавления параметра при загрузке. Для этого отредактируйте файл
-
Обновление конфигурации Grub:
- После редактирования файла запустите команду:
sudo update-grub
- Перезагрузите систему.
- После редактирования файла запустите команду:
Заключение
Эти методы помогут вам отключить IPv6 на клиенте при подключении к серверу OpenVPN, предотвратив утечку трафика через IPv6. Выберите подходящий для вас способ в зависимости от ваших предпочтений и требований системы. Если у вас есть дополнительные вопросы или проблемы, не стесняйтесь спрашивать.