How to Wiki Database (change log)
http://[222:a8e4:50cd:55c:788e:b0a5:4e2f:a92c]
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
9.3 KiB
112 lines
9.3 KiB
====== 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~~
|
|
|