Jak wyłączyć IPv6 podczas łączenia się z serwerem OpenVPN za pomocą Network Managera w systemie z dwoma stosami?

20

Korzystam z klienta OpenVPN za pośrednictwem wtyczki OpenVPN Network Manager na podwójnym stosie (co oznacza, że ​​jest skonfigurowany zarówno dla połączeń IPv4, jak i IPv6) Ubuntu 13.10 do przekierowania całego ruchu przez VPN (redirect-gateway). Ogólnie działa dobrze.

Jednak ze względu na fakt, że system preferuje IPv6, VPN „przecieka”, a podczas łączenia się z witrynami, które są również dostępne przez IPv6 (takie jak Google lub Wikipedia), przeglądarka łączy się bezpośrednio.

Jednym rozwiązaniem byłoby skonfigurowanie serwera OpenVPN w celu zapewnienia łączności IPv6. Chociaż jest to możliwe w przypadku OpenVPN, wtyczka do Network Managera obecnie go nie obsługuje.

Ponieważ łączność IPv6 przez VPN nie jest absolutnie konieczna, chciałbym po prostu wyłączyć IPv6 na kliencie podczas łączenia się z serwerem OpenVPN. Czy to możliwe? Jeśli tak, jak mogę to zrobić?

Cholerny terminal
źródło
1
Twoja sieć VPN nie obsługuje również ruchu IPv6?
Michael Hampton
Moja sieć VPN może przenosić ruch IPv6, ale Network Manager nie obsługuje obecnie konfiguracji IPv6 dla OpenVPN, o ile wiem.
Cholerny terminal
1
Dla przypomnienia, jeśli twój dostawca VPN przecieka w ten sposób, potrzebujesz nowego dostawcy. Jest wielu takich, którzy mają rację. IPv6 nie odchodzi, a wyłączenie go tylko odcina cię od części Internetu.
Michael Hampton
1
@MichaelHampton Niestety, to mój serwer. W tym przypadku jestem dostawcą. Obsługuje IPv6, ale jest dostarczany tylko z jednym / 64, więc najpierw musiałbym go połączyć, co jest trochę uciążliwe. Co ważniejsze (w tym czasie nie sprawdzałem od tego czasu) menedżer sieci miał pewne problemy z obsługą połączeń OpenVPN z obsługą IPv6 (IPv6 przez VPN działa jednak z konfiguracją sieci typu „dotknij i zmostkuj”, z której teraz korzystam).
Cholerny terminal

Odpowiedzi:

15

Dodaj to do linii jądra w module ładującym, aby całkowicie wyłączyć IPv6:

ipv6.disable=1

Jeśli używasz Grub (jeśli nie zainstalowałeś własnego programu ładującego, to używasz Grub), twoja linia jądra powinna wyglądać mniej więcej tak:

linux /boot/vmlinuz-linux root=UUID=978e3e81-8048-4ae1-8a06-aa727458e8ff ipv6.disable=1

Zalecanym podejściem do dodawania czegoś do linii jądra jest dodanie pożądanego parametru jądra do GRUB_CMDLINE_LINUX_DEFAULTzmiennej w /etc/default/grubpliku:

GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1"

Po dodaniu tego /etc/default/gruburuchom następujące polecenie, aby ponownie wygenerować grub.cfg:

sudo grub-mkconfig -o /boot/grub/grub.cfg

Alternatywnie, dodanie ipv6.disable_ipv6=1zamiast tego sprawi, że stos IPv6 będzie działał, ale nie przypisze adresów IPv6 do żadnego z twoich urządzeń sieciowych.

LUB

Aby wyłączyć IPv6 przez sysctl, umieść w /etc/sysctl.confpliku:

net.ipv6.conf.all.disable_ipv6 = 1

Nie zapomnij skomentować hostów IPv6 w /etc/hostspliku:

#::1        localhost.localdomain   localhost

UWAGA

ponowne uruchomienie może być wymagane dla metody sysctl, a ponowne uruchomienie jest zdecydowanie wymagane w przypadku podejścia do linii jądra.

LUB

Aby tymczasowo wyłączyć ipv6:

sysctl -w net.ipv6.conf.all.disable_ipv6 = 1

Aby tymczasowo włączyć:

sysctl -w net.ipv6.conf.all.disable_ipv6 = 0

Więc jeśli chcesz wyłączyć ipv6 w danych warunkach , napisz skrypt bash gdzieś wzdłuż tych linii:

#!/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

UWAGA

Może być konieczne wyłączenie wszystkich hostów ipv6 w /etc/hostspliku dla tej metody, tak jak zalecałem w poprzedniej metodzie.

Alexej Magura
źródło
5
Dobra. Ale chcę wyłączyć IPv6 podczas łączenia się z VPN za pomocą Network Managera, a nie zabijać go całkowicie w moim systemie. Może powinienem był to wyjaśnić.
Cholerny terminal
@DamnTerminal, więc chcesz ją wyłączyć tylko wtedy, gdy masz połączenie z VPN, ponieważ wyłączenie systemu jest w porządku, o ile dzieje się to tylko wtedy, gdy masz połączenie z VPN?
Alexej Magura
@DamnTerminal Zaktualizowałem moją odpowiedź, aby zawierała przykład wyłączenia ipv6 za pomocą skryptu bash, który sprawdziłby warunek. Prawdopodobnie możesz użyć interfejsu wiersza polecenia NetworkManager: nmcliaby sprawdzić, czy masz połączenie z VPN; jeśli to nie zadziała, to jestem pewien, że istnieje narzędzie sieciowe wiersza polecenia, które da dostęp do tych informacji.
Alexej Magura
Dlaczego głosowanie negatywne?
Alexej Magura
Niestety to rozwiązanie ( sysctl) nie włącza ponownie poprawnie IPv6 dla Wi-Fi. Musisz ponownie połączyć się z punktem dostępu, aby go włączyć.
Igor Mikushkin
5

Możesz wyłączyć ipv6 na poziomie klienta dla określonego połączenia Menedżera sieci , ustawiając opcję IPv6 ipv6.method na „ignoruj”

// SOP: Odtworzenie mojego połączenia LAN przy użyciu FIXED IP 192.168.0.95 do 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

`` ``

Rolf
źródło
1
Niestety nie ma to wpływu na połączenia VPN.
Igor Mikushkin
0

Jestem na Ubuntu 16.04.03 LTS, łączę się z serwerem Pi-Hole przez PiVPN.

Oto, co zrobiłem, aby automatycznie włączać i wyłączać IPv6 podczas łączenia się z VPN przez Menedżera sieci:

  1. Utwórz skrypt w /etc/NetworkManager/dispatcher.d:

    $ sudo vi /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
    
  2. Dodaj następującą treść do pliku (zmodyfikuj zawartość do swoich wymagań):

    #!/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. Ustaw skrypt jako wykonywalny:

    $ sudo chmod 755 /etc/NetworkManager/dispatcher.d/99vpn-ipv6-switch
    

Otóż ​​to. Musiałem ręcznie dodać mój DNS Pi-Hole z powodu dnsmasqbłędu, który uniemożliwia resolv.confpoprawną aktualizację, więc zmodyfikuj wskazane linie, jeśli zauważysz przeciek DNS.

ooknosi
źródło
Niestety to rozwiązanie nie włącza ponownie poprawnie IPv6 dla WiFi. Musisz ponownie połączyć się z punktem dostępu, aby go włączyć.
Igor Mikushkin
0

Myślę, że mniej inwazyjne jest wyłączenie ip6 w pliku klienta (edycja client_conf_file.ovpn), który modyfikuje stos tcp jądra.

Otwórz plik conf_file.ovpn i dodaj następujące wiersze:

#disable ipv6
#https://community.openvpn.net/openvpn/ticket/849
pull-filter ignore "ifconfig-ipv6 "
pull-filter ignore "route-ipv6 "

Próbowałem i po tym ipv6 znika.

Przed. Uruchamiam, ip a |grep globala wynikiem jest:

    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

Po. Uruchamiam, ip a |grep globala wynikiem jest:

    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
źródło
0

Edytuj profil OpenVPN w NetworkManager, otwórz kartę IPv6 i ręcznie dodaj trasę:

Adres: 2000 Prefiks: 3 Brama: 0100 :: 1

2000 :: / 3 przechwytuje wszystkie publicznie rutowalne adresy IPv6. Prefiks 0100 :: / 64 to specjalny prefiks przeznaczony do odrzucania ruchu. Zasadniczo będziesz wysyłać cały ruch IPv6 do bramy, która nie istnieje.

Zaleta: łatwa i całkowicie automatyczna.

Wada: niektóre aplikacje, a mianowicie narzędzia wiersza poleceń, mogą nie wrócić do IPv4 tak szybko, jak by się chciało, gdy ta metoda jest używana.

Niels
źródło
0

Chciałbym po prostu wyłączyć IPv6 na kliencie podczas łączenia się z serwerem OpenVPN. Czy to możliwe?

Wypróbuj mój prosty skrypt, który właśnie stworzyłem, to zrobi,

  • Zajmij się wszystkimi interfejsami.
  • Wyłącz ipv6 po uruchomieniu OpenVPN.
  • Włącz ipv6 po zakończeniu OpenVPN.
  • Lepsza kompatybilność z argumentem NetworkManager.

Jeśli na niektórych interfejsach nadal znajduje się adres ipv6, klient nadal próbuje routingu ipv6, ale ponieważ DNS korzysta z UDP, istnieje prawdopodobieństwo wycieku DNS, którego TCPwrapper nie może wyłączyć.

Ten skrypt działa również dobrze z innymi interfejsami, ponieważ nie opiera się już na argumencie NetworkManager, takim jak vpn-up vpn-down.

utwórz plik wykonywalny w /etc/NetworkManager/dispatcher.d/

sudo vim /etc/NetworkManager/dispatcher.d/v6d

wklej poniższy kod

#!/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

następnie uczyń go wykonywalnym

sudo vim /etc/NetworkManager/dispatcher.d/v6d

PS OpenVPN z Network Managerem traci wiele opcji korzyści OpenVPN z wersji wiersza poleceń.

Seandex
źródło