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

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

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

IP_in_IP

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

Старая схема:

Сервер:

table ip nat {
        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                ip saddr 10.0.0.0/8 oif "eth0" masquerade
        }
}

# ip tunnel add hole mode ipip remote IP-клиента local наш-IP
# ip l set hole up
# ip addr add dev hole адрес-туннеля/24

Помните, как в отсутствие OSFP мы ручками настраивали информацию о всех внутренних сетях? В файле внутренняя_сеть.network это выглядит так:

… настройки внутренней сети …


[Route]
Destination=очень-внутренняя-сеть-с-клиентом/24
Gateway=ближайший-маршрутизатор

Маршрутизатор:

# nft add rule inet filter forward ip protocol tcp reject

Клиент:

Должно работать:

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

Туннель как маршрут по умолчанию

На клиненте:

# date | netcat ya.ru 80 — (всё ещё работает по-старому)

Проблема превращения старого маршрута в маршрут до tunnel endpoint:

Простая реализация:

DNS (через UDP) работает, netcat ya.ru 80 — нет

l2tp — фреймы в IP

Всё по ip-l2tp с инкапсуляцией в UDP и для простоты без bridge

TODO скопипастить этот кусок сюда

# ip l2tp show tunnel
# ip l2tp show session

Главная фишка: если применять bridge («Configure as bridged interfaces» в man-е): на сервере интерфейс один и IP у него тоже один.

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

(если успеем, то тупо пример из MAN)

Wireguard

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

Лайфхак:

Минимальная настройка:

Сервер:

70-wg.netdev:[NetDev]
70-wg.netdev:Name        = wg
70-wg.netdev:Kind        = wireguard
70-wg.netdev:
70-wg.netdev:[WireGuard]
70-wg.netdev:ListenPort  = 51820
70-wg.netdev:PrivateKey  = сервера, никому не показывать
                           (возможно, лучше  PrivateKeyFile = …)
70-wg.netdev:# PublicKey = сервера, просто лежит тут прозапас
70-wg.netdev:
70-wg.netdev:[WireGuardPeer]
70-wg.netdev:AllowedIPs  = 192.168.111.0/24
70-wg.netdev:PublicKey   = клиента

70-wg.network:[Match]
70-wg.network:Name        = wg
70-wg.network:
70-wg.network:[Network]
70-wg.network:Address     = 192.168.111.1/24

Клиент:

90-wg.netdev:[NetDev]
90-wg.netdev:Name        = wg
90-wg.netdev:Kind        = wireguard
90-wg.netdev:
90-wg.netdev:[WireGuard]
90-wg.netdev:PrivateKey  = этого клиента
90-wg.netdev:# PublicKey   = этого клиента, прозапас
90-wg.netdev:
90-wg.netdev:[WireGuardPeer]
90-wg.netdev:AllowedIPs  = 192.168.111.0/24
90-wg.netdev:PublicKey   = сервера
90-wg.netdev:Endpoint    = 10.1.1.1:51820
90-wg.network:[Match]
90-wg.network:Name        = wg
90-wg.network:
90-wg.network:[Network]
90-wg.network:Address     = 192.168.111.5/24

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

Ещё раз: проблема превращения старого маршрута в маршрут до tunnel endpoint

Задача довольно просто формулируется, но полна нюансов:

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

Сервер:

Клиент:

Нюансы:

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

А ещё вот:

https://lists.zx2c4.com/pipermail/wireguard/2022-January/007403.html

Рашн ВПН

Всякое

Д/З

Новое в образе

TODO

LecturesCMC/LinuxNetwork2022/11_TunnelingVPN (последним исправлял пользователь FrBrGeorge 2022-05-16 10:26:44)