howto-db/data/pages/yggdrasil/tunnels/ipip-tunnel.txt
2024-02-10 12:53:55 +00:00

113 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.

====== IPIP-туннель ======
Давным-давно в далекой галактике... в одном из чатов сообщества кто-то поделился PDF-файлом, в котором описывалось создание IPIP-туннеля поверх [[yggdrasil:yggdrasil|Yggdrasil]]. Автор использовал эти технологии для организации VPN-сервера на [[:vps|VPS]], когда используемый им ранее протокол [[:wireguard|Wireguard]] начала блокировать тёмная сторона...
Здесь будет краткое изложение этой статьи. Ссылка на сам PDF-файл будет приведена в разделе [[#Ссылки|Ссылки]]. К сожалению, не нашел оригинального сообщения с этим файлом в чате и не помню имени автора, иначе обязательно бы назвал его (e-mail автора есть в PDF-файле).
Да, [[this>|здесь]] уже есть статья о настройке [[yggdrasil:tunnels:gre-tunnel|GRE-туннеля]] (технологии похожи), но решил опубликовать и про IPIP, просто для того, чтобы было [в одном месте].
Основные отличия (с точки зрения пользователя) GRE от IPIP - GRE поддерживает [[wpru>Мультивещание|Multicast]] и инкапсулирование любого протокола [[wpru>Протоколы_сетевого_уровня|третьего уровня]], IPIP не поддерживает Multicast и инкапсулирует только IP (IPIP - IP over IP).
//**Примечание:** Под IPIP здесь подразумевается IPIP6 (работаем с IPv6 адресами Yggdrasil).//
Итак...
===== VPN c помощью Yggdrasil и IPIP =====
==== Настройка клиента ====
//**Примечание:** подразумевается, что Yggdrasil уже установлен и на клиенте и на сервере (VPS), [[yggdrasil:public_peer|пиры прописаны]], доступ к сети есть; Yggdrasil использует интерфейс tun0.//
Для начала необходимо уточнить наши IPv6-адреса Yggdrasil.
Выполним команду на клиенте:
<code>ip -br a show tun0</code>
В результате увидим:
<code>tun0 UNKNOWN 200:d4a5:ec3f:5914:274c:8f70::660/7</code>
где ''%%200:d4a5:ec3f:5914:274c:8f70::660%%'' наш IPv6 адрес Yggdrasil.
Выполним ту же команду на сервере, увидим:
<code>tun0 UNKNOWN 200:d4a5:ec3f:5914:274c:8f70::1/7</code>
Здесь, соответственно, видим адрес Yggdrasil на сервере.
Создаём туннель на клиенте:
<code>sudo ip link add name ipip6 type ip6tnl local 200:d4a5:ec3f:5914:274c:8f70::660 remote 200:d4a5:ec3f:5914:274c:8f70::1 mode ipip6</code>
После создания туннеля у нас появятся два новых интерфейса:
<code>ip -br a</code>
<code>ip6tnl0@NONE DOWN
tun0 UNKNOWN 200:d4a5:ec3f:5914:274c:8f70::660/7
ipip6@NONE DOWN</code>
Работать мы будем с интерфейсом ipip6.
Включим этот интерфейс:
<code>sudo ip link set ipip6 up</code>
Далее вам нужно будет определиться с адресом подсети IPv4 , которая будет работать внутри туннеля. Это может быть например 192.168.44.0/30. Из этой подсети с такой маской мы можем взять
только два адреса (а больше в нашем случае и не нужно). Первый для конца туннеля на локальной машине, второй для конца туннеля на удаленном VPS.
Пускай это будут:
<code>192.168.44.1 #Для удаленного vps
192.168.44.2 #Для локальной машины</code>
Назначим адрес IPv4 для нашего туннеля:
<code>sudo ip address add 192.168.44.2/30 dev ipip6</code>
=== Маршрутизация ===
Теперь нам нужно отправить наш IPv4 трафик на VPS. На локальной машине нам нужно будет создать пару маршрутов.
По первому маршруту нужно пояснить. У вас в Yggdrasil прописан как минимум один peer через которого вы выходите в сеть. Так вот нам нужно что-бы соединение с этим пиром шло обязательно через интернет, не через сеть Yggdrasil. Потому-что мы не можем соединиться с сетью Yggdrasil через неё же саму, получается зацикливание. Из-за этого ничего работать не будет.
Поэтому нам и нужен маршрут, который будет всегда "роутить" соединение до пира через обычный интернет. Как раз это правило маршрутизации нам в этом поможет.
Подставьте вместо ''%%XX.XX.XX.XX/32%%'' IP-адрес вашего клирнет пира yggdrasil, а вместо ''%%YY.YY.YY.YY%%'' IP-адрес вашего домашнего роутера, ''%%wifi0%%'' - замените на интерфейс на котором у вас ваша домашняя сеть.
<code>sudo ip route add XX.XX.XX.XX/32 via YY.YY.YY.YY dev wifi0</code>
Далее прописываем следующий маршрут. Этот маршрут будет отправлять весь остальной трафик через наш туннель на VPS.
<code>sudo ip route add 0.0.0.0/0 via 192.168.44.2 dev ipip6</code>
==== Настройка сервера (VPS) ====
Настройка будет такая же, разница только в IP-адресах. При создании туннеля нужно поменять IPv6 адреса местами Local IP <--> Remote IP
<code>sudo ip link add name ipip6 type ip6tnl local 200:d4a5:ec3f:5914:274c:8f70::1 remote 200:d4a5:ec3f:5914:274c:8f70::660 mode ipip6</code>
Назначение IPv4-адреса на интерфейс:
<code>sudo ip address add 192.168.44.1/30 dev ipip6</code>
=== Настройка iptables ===
Теперь мы напишем правила для [[wpru>Iptables|iptables]] , которые проведут наш трафик из туннеля в интернет.
Вместо ''%%eth0%%'' подставьте интерфейс, с которого у вас выход в интернет.
<code># Эти два правила разрешат пересылку пакетов между интерфейсами
sudo iptables -A FORWARD -i eth0 -o ipip6 -j ACCEPT
sudo iptables -A FORWARD -i ipip6 -o eth0 -j ACCEPT
# Это правило подменит локальный ip адрес (192.168.44.2) при выходе из интерфейса eth0 на внешний ip
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</code>
==== Проверка работоспособности ====
Всё, туннель у нас должен работать. Для проверки работоспособности "попингуйте" друг друга через туннельные ip:
<code>ping 192.168.44.1 #На локальной машине
ping 192.168.44.2 #На удаленной машине</code>
Если всё "пингуется" в обе стороны, то туннель успешно работает. Далее проверьте, что интернет работает именно через туннель.
<code># Здесь мы видим что трафик уходит через ip нашего туннеля
> traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.100.44.1 93.791 ms 98.394 ms 98.443 ms
2 49.11.8.1 98.441 ms 98.434 ms 98.419 ms
...</code>
==== Заключение ====
После этого у нас на локальной машине должен работать интернет через туннель, который проходит через сеть Yggdrasil.
Стоит напомнить что все эти настройки сбросятся после перезагрузки. Так что, вам необходимо их прописать в конфигурационные файлы ваших дистрибутивов Linux. Для интерфейсов это можно сделать через Systemd-Networkd с помощью файлов netdev. А с помощью файлов network можно назначить IP-адреса на интерфейсы. Для iptables правила можно прописать в файле ''%%/etc/iptables/iptables.conf%%''
====== Ссылки ======
Оригинальная статья в PDF (RU): [[this>_media/yggdrasil:yggdrasil_vpn.pdf|VPN через Yggdrasil]] \\
~~DISCUSSION~~