2024-02-10 12:53:55 +00:00

135 lines
9.3 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

====== GRE-туннель ======
GRE (Generic Routing Encapsulation) - это один из простейших протоколов туннелирования, представляющий собой соединение узлов по принципу точка - точка.
Туннелирование - это, по сути, упаковка наших данных (например, протокол IP) в определенный пакет, который передаётся от узла-отправителя к узлу-получателю. На узле-получателе пакет распаковывается и изначальные данные продолжают свой путь.
GRE в чистом виде никак не защищен, нет никакого шифрования данных в пакете, и за счет этого данные в GRE-туннелях передаются с минимальными потерями в скорости и минимальным увеличением объема передаваемых данных.
Часто GRE используется совместно с протоколами защиты сетевого трафика, например IPSec. И это по сути представляет собой практически полноценное решение для организации виртуальных частных сетей (VPN).
Используя чистый GRE внутри [[..:yggdrasil]] можно с различными целями легко строить туннели, аналогичные привычным VPN. Защита тахих туннелей будет обеспечена самим [[..:yggdrasil]], трафик в котором шифруется по-умолчанию.
Например, с помощью GRE туннеля внутри Yggdrasil можно настроить на удаленной машине шлюз в интернет. Т.е., вы на своей домашней машине с помощью Yggdrasil можете соединяться с удаленным сервером, который будет маршрутизировать ваши данные, упакованные GRE в интернет, и c точки зрения использования всё это будет происходить аналогично тому, как это происходит при установке OpenVPN-соединения или L2TP/IPSec.
Команды для создания GRE-туннеля можно вводить вручную, можно написать bash-скрипт, либо можно использовать /etc/network/interfaces (либо юнит systemd) для поднятия туннелей автоматически при загрузке системы.
Для примера:
<code>
#какие туннели уже есть в системе (если ранее не создавали, вывод команды будет пуст)
ip tunnel show
ip -6 tunnel show
#какие интерфейсы есть в системе
ifconfig -a
#создание туннеля
sudo ip tunnel add tun1 mode ip6gre remote 0200:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx local 0203:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx dev tun0
#активация туннеля
sudo ip link set tun1 up
#назначение адреса
sudo ip link set dev tun1 address xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
#уничтожение туннеля
sudo ip link set tun1 down
sudo ip tunnel del tun1
</code>
Пример с gretap (второй уровень OSI):
<code>
sudo ip link add yggvpn0 type ip6gretap local 0200:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx remote 0203:xxxx:xxxx:xxxx:xxxx:xxxx:xxx:xxxx key 1
sudo ip link set dev yggvpn0 address xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
#удаление
sudo ip link del dev yggvpn0
</code>
Не забывайте открывать доступ по протоколу GRE в iptables.
Интерфейс GRE можно назначить шлюзом по-умолчанию - работа будет аналогичной VPN.
===== Практический пример: GRE-туннель IPv4 over IPv6 =====
Имеем две машины: t1 и t2, соединенные посредством Yggdrasil.
^ ^ t1 ^ t2 ^
| Yggdrasil IPv6 | 204:f52f:7bb4:c8c2:21f9:6972:14f5:32fd | 200:862d:85a4:6b85:4fc1:55a3:fa3:7b0e |
| Доступ в интернет | Есть | Нет |
Создадим GRE-туннель и "пробросим" через него доступ в интернет для машины t2. Машины "в туннеле" будут иметь IPv4-адреса. Для доступа в интернет с t2 будем использовать NAT.
==== Действия на t1 ====
Во-первых, задействуем форвардинг пакетов для того, чтобы обеспечить доступ в интернет со второй машины:
<code>
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
</code>
Чтобы эти настройки сохранились после перезагрузки в файле %%/etc/sysctl.conf%% раскомментируем:
<code>net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1</code>
Непосредственно, создание туннеля:
<code>
#создаем туннель
ip tunnel add tun1 mode ip6gre remote 0200:862d:85a4:6b85:4fc1:55a3:fa3:7b0e local 0204:f52f:7bb4:c8c2:21f9:6972:14f5:32fd dev tun0
#присваиваем IPv4-адрес на интерфейс туннеля и сразу добавляем маршрут ко второму концу (10.1.1.2) через этот интерфейс
ip addr add dev tun1 local 10.1.1.1 remote 10.1.1.2 #t1 будет иметь адрес 10.1.1.1, t2 - 10.1.1.2.
#поднимаем туннель
ip link set tun1 up
</code>
NAT c помощью iptables:
<code>
iptables -A FORWARD -i tun1 -j ACCEPT
iptables -A FORWARD -o tun1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
</code>
==== Действия на t2 ====
Симметричные действия для поднятия туннеля:
<code>ip tunnel add tun1 mode ip6gre remote 0204:f52f:7bb4:c8c2:21f9:6972:14f5:32fd local 0200:862d:85a4:6b85:4fc1:55a3:fa3:7b0e dev tun0
ip addr add dev tun1 local 10.1.1.2 remote 10.1.1.1
ip link set tun1 up</code>
Добавим маршрут по умолчанию для доступа в интернет:
<code>route add default gw 10.1.1.1</code>
//**Примечание:** если на t2 доступ в интернет уже есть и Yggdrasil на t2 подключен к публичным пирам, а вы просто настраиваете VPN c использованием Yggdrasil, необходимо будет прописать муршрут к пирам в обход туннеля, иначе соединение с ними прервётся. Пример добавления маршрута до публичного пира, в обход туннеля: ''%%sudo ip route add 62.210.85.80/32 via 192.168.1.1 dev wlo1%%''; 62.210.85.80 - адрес публичного пира, 192.168.1.1 - адрес шлюза в интернет (домашнего роутера), wlo1 - имя интерфейса, через который подключаетесь к шлюзу.//
В /etc/resolv.conf можно прописать DNS-сервер:
<code>nameserver 8.8.8.8
</code>
На обеих машинах в iptables разрешаем GRE, если оно запрещено:
<code>
ip6tables -I INPUT -p gre -j ACCEPT
</code>
Вот, собственно, и всё.
Получили почти классическую схему VPN-сервера (в роли которого выступает t2) для доступа к ошибочно заблокированным РКН сайтам.
Кроме того, так можно обеспечить выход в интернет устройства, подключенного к Yggdrasil, например, с помощью [[yggdrasil:mesh_setup|802.11s (Wi-Fi Mesh)]].
А еще, такой туннель можно использовать для коммуникации приложений, которые не поддерживают IPv6, если вы соединены только через Yggdrasil.
//**Примечание:** читайте так же о настройке IPIP-туннеля через Yggdrasil: [[yggdrasil:tunnels:ipip-tunnel]].//
====== Ссылки ======
АйТи бубен: GRE https://wiki.dieg.info/gre\\
Сети для самых маленьких. Часть седьмая. VPN https://habr.com/ru/post/170895/\\
Linux Advanced Routing & Traffic Control HOWTO. Глава 5. GRE и другие тоннели https://docstore.mik.ua/manuals/ru/LARTC/x418.html\\
Знакомство с виртуальными интерфейсами Linux: туннели https://temofeev.ru/info/articles/znakomstvo-s-virtualnymi-interfeysami-linux-tunneli/\\
Простой Ethernet-туннель на Linux в четыре-шесть команд https://habr.com/ru/post/227859/\\