Туннелирование и частные сети

Туннелирование: использование некоторого потока данных для инкапсуляции (в общем случае — произвольного) сетевого трафика.

Простейший туннель: IP over IP

IP_in_IP: например, для мобильных сетей

Использование

Обычная схема:

«Выход в интернет»:

Проверим, что туннель работает

Вот уже почти VPN! Но:

l2tp — фреймы в IP или UDP

Можно туннелировать не IP-пакеты, а фреймы — например, при помощи L2TP.

Всё по документации — скажем, с инкапсуляцией не в IP, а в UDP; и для простоты — без bridge

Особенности:

Виртуальный интерфейс l2tpeth можно добавить в bridge c локальным интерфейсом — тогда абоненты из туннелей окажутся в одном сегменте с абонентами локальной сети

Как и в случае ipip, «выход в интернет» посредством l2tp требует

Wireguard

Сайт, и конечно Arch-вики

Лайфхак для копипасты:

# wg genkey | tee /dev/stderr | wg pubkey

Минимальная настройка: воспользуемся systemd-networkd:

Ручная настройка

Для настройки вручную на сервере нужно

На клиенте:

Настройка средствами networkd

Для systemd-networkd:

Сервер:

Клиент:

Частная сеть как выход в интернет

Ещё раз: проблема сохранения исходного маршрута до tunnel endpoint. Задача довольно просто формулируется, но полна нюансов:

В нашем случае довольно просто, ибо статика:

Сервер:

Клиент:

Вариант с метрикой маршрута

Сложности:

⇒ Нужен разумный best practice. Для начала хотя бы сделать в ядре метрику по умолчанию не 0…

Вариант с целевой маршрутизацией

Удобство:

Сложности:

wg-quick как-то решает эту проблему.

Innernet, кажется, не решает.

Рашн ВПН

Итак, покупаете вы роутер-мыльницу. Например, DLink. Настраиваете в нём доступ в интернет, например, по l2tp в каком-нибудь большом операторе. И выясняется, что

Отчаявшись, вы находите в том же форуме рецепт. Надо зайти на сайт российского DLink, скачать оттуда специальную прошивку и залить её. После прошивания в настройках l2tp появляется — я не вру! — галочка «Russian VPN». И с ней всё работает!

Russian VPN — это просто несколько shell-скриптов (на мыльнице Linux же), которые делают вот что:

Всякое

Всевозможные «платные VPN-сервисы», как правило — модификация уже известных протоколов.

Д/З

Образ не изменился

Настроить выход в интернет через VPN на двух клиентах.

  1. К srv из двух разных сетей (eth1 и eth2) подключены два клиента. VPN-адреса (на виртуальном wireguard-интерфейсе) у них из одной сети, и только пакеты из этой сети NAT-ятся наружу (через eth0, использовать nftables). Должен работать также DNS (любым способом) и доступ от одного клиента к другому.

  2. Отчёт:
    1. report 11 srv

      • networkctl status -a -n0 --no-pager

      • nft list ruleset

      • host ya.ru

      • ip route

      • wg

    2. report 11 client и report 11 client2

      • networkctl status -a -n0 --no-pager

      • host ya.ru

      • ip route

      • wg

      • ping -c3 адрес_другого_клиента

  3. Три отчёта (названия сохранить, должно быть: report.11.srv, report.11.client и report.11.client2) переслать одним письмом в качестве приложений на uneexlectures@cs.msu.ru

    • В теме письма должно встречаться слово LinuxNetwork2025

LecturesCMC/LinuxNetwork2025/11_TunnelingVPN (последним исправлял пользователь StephenMalchevskii 2025-05-03 22:28:16)