Забытые технологии: PPP

от автора

В наше время, когда в каждой квартире интернет «течет» буквально из розетки, из порта роутера или прилетает по WiFi — никто не вспоминает о таком анахронизме как аналоговый модем.

А когда‑то интернет добывали из модемов: обычные пользователи, они же ламеры, перебирали различные варианты программ‑звонилок и «драйверов», а настоящие айтишники настраивали PPP вручную.

Как это работало и зачем может пригодиться сегодня (а оно может).

Для начала, что такое вообще модем? Если не вникать глубоко в детали — всегда используется пара модемов: на вход одного из них подаются какие‑то данные, модем преобразует их в некий аналоговый сигнал для передачи по проводам, а второй модем декодирует их обратно в данные.

В пределе можно вообще представить эту пару как кусок провода: подаём данные на вход с одной стороны — читаем с другой. И в самом деле, компьютеры можно было соединить через COM — порты обычным проводом, точнее тремя — Rx, Tx, Gnd.

Например, если использовать программу терминал — можно вот так подключиться к консоли устройства, читать‑писать команды. Но сейчас речь не об этом.

А вот как превратить такой кусок провода в сетевой интерфейс и передавать через нее IP‑пакеты? Для этого и использовался протокол PPP (используется и сейчас, например при работе с сотовыми модемами, только уже никто не настраивает его ручками).

Если на пальцах — создается виртуальный сетевой интерфейс, и проходящие через него IP‑пакеты преобразуются в фреймы LCP, которые в свою очередь передаются через модем (или через наш кусок провода), просто как набор символов. Их можно увидеть глазами на экране терминала как кучу скобочек типа }}}}{}}}

В процессе этого обмена происходит установление IP‑соединения, стороны получают свои IP‑адреса и между ними начинает ходить IP‑трафик.

Ещё раз напомню, для этого достаточно обычного куска провода, никакой особой магии там нет, нужны только две точки — вход и выход. Потому и протокол Point‑to‑Point Protocol, PPP.

А вот какой именно там провод, медный между компортами, или линия связи через модем Zyxel на 19 200, или оптический кабель через адаптеры, или радиоканал — разницы по сути никакой. Главное — возможность двухстороннего обмена данными.

Если понять эту простую вещь — то легко придти к пониманию того, что в принципе можно настроить IP‑канал между двумя точками через что угодно, лишь бы обеспечивалась двухсторонняя связь, хоть голубями с записочками.

Голубей мы использовать не будем, задержки большие, а вот какие‑то иные каналы вполне можно. Например, в недавней статье при помощи i2p было показано, как создать виртуальный канал между двумя портами, один на локальной машине, а другой черт его знает где. И вот там как раз тот самый случай двухсторонней связи: все что записано на одной стороне будет получено на другой.

А это значит, что с помощью PPP можно поднять сеть между этими двумя точками, причем трафик в ней окажется зашифрован где‑то внутри сети i2p.

Например, таким способом можно достучаться до своего домашнего сервера из внешнего мира, даже не зная каким именно путем через какого провайдера и с какими белыми адресами эта сеть подключена к интернету.

Как это настроить? Для начала допустим, что на обоих сторонах туннель выведен на порт 127.0.0.1:5005, для простоты.

То есть, записывая данные в 127.0.0.1:5005 на ноутбуке — можем прочитать их в 127.0.0.1:5005 на сервере.

Также допустим, что на обоих сторонах установлены пакеты ppp и netcat, а файл /etc/ppp/options на обоих машинах обнулен, чтобы ничем ничему не мешать.

Запускаем на сервере:

pppd nodetach persist 192.168.50.1:192.168.50.2 pty “nc ‑l 5005”

Что мы сделали: запустили демон PPP в интерактивном режиме, ожидающим подключения, назначили локальный и удаленный адреса, используем псевдотерминал который создаётся командой nc (netcat) слушающей 5005 порт. Этот порт будет соединен с точкой входа/выхода туннеля на сервере.

На клиенте запускаем так:

pppd nodetach persist pty “nc 127.0.0.1 5005”

Что мы сделали: запустили демон PPP в интерактивном режиме, с ожиданием когда он сможет подключиться к псевдотерминал, созданному командой nc, подключающийся к 127.0.0.1:5005 на локальной машине.

Поскольку локальный порт 5005 связан с удаленным портом 5005 — демоны соединятся, установят PPP линк, обменяются адресами и между ними заработает IP ‑сеть.

На локальной стороне демон сообщит о полученных адресах и установлении соединения.

Всё, остальное — вопрос настройки маршрутизации трафика, все что будет маршрутизировано через эту сеть — пройдет между локальной машиной и сервером.

Остаётся привести это все в порядок: практически всю строку запуска кроме самой команды pppd можно записать в файлы /etc/ppp/options, nodetach можно убрать, и установить максимальное количество попыток в 0, в бесконечность. Тогда файл будет выглядеть примерно так:

# server persist maxfail 0  192.168.50.1:192.168.50.2  pty "/usr/bin/nc -l 127.0.0.1 5005"

Клиентский файл будет отличаться только отсутствием строки с IP‑ адресами и параметра ‑l при запуске nc

И запускаем из‑под рута на обоих машинах

pppd

Через некоторое время должна установиться связь. В случае отказа одной из стороны или обрыва соединения параметры persist и maxfail 0 заставят другую сторону пробовать снова и снова.

Вообще у netcat есть разные интересные параметры, можно использовать tcp, udp, разные адреса, к которым подключаться, даже возможность работать через файлы unix‑socket на диске (сеть через /tmp/.xfile — не очень понятно зачем, но можно даже так).

Ну и в целом, принцип сохраняется — соединение между двумя точками, и netcat в данном случае только один из вариантов подключения, подходящий как раз к туннелям i2p.


ссылка на оригинал статьи https://habr.com/ru/articles/871196/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *