В наше время, когда в каждой квартире интернет «течет» буквально из розетки, из порта роутера или прилетает по 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/
Добавить комментарий