PPPd через SOCAT с использованием опции INTERFACE

Моя цель - использовать pppd вместо socat. У меня есть два бокса Ubuntu с eth0, подключенными (физически) друг к другу. Я могу пропинговать оба IP-адреса. Я делаю следующее для каждой коробки Ubuntu.

  1. Создайте псевдосерийное устройство и свяжите его с моим сетевым интерфейсом "eth0".
    socat PTY, link = / dev / ttyp10 INTERFACE: eth0
  2. Используйте pppd на этом псевдосерийном устройстве.
    Устройство A:
    pppd noauth / dev / ttyp10 10.10.10.10:20.20.20.20
    Устройство B:
    pppd noauth / dev / ttyp10 20.20.20.20 : 10.10.10.10

Я вижу, что мой интерфейс ppp0 создается на короткое время, но я не могу проверить связь с обоими IP-адресами (10.10.10.10 или 20.20.20.20). Я знаю, что мое решение не является полным, так как мне нужно указать, как мои пакеты pppd должны маршрутизироваться с моего интерфейса eth0, но не знаю, как это сделать (я использовал tcpdump на интерфейсе eth0 и нашел некоторые данные).

Я попробовал тот же эксперимент, привязав socat к TCP-серверу / клиенту, и он сработал.

Устройство A:
1. socat pty, link = / dev / ttyp10, raw, echo = 0 TCP4-LISTEN: 7001, reuseaddr &
2. pppd noauth / dev / ttyp10 10.10.10.10:20.20.20.20

Устройство B:
1. socat pty, link = / dev / ttyp10, raw, echo = 0, waitslave TCP4: 20.1.1.2: 7001 &
2. pppd noauth / dev / ttyp10 20.20.20.20:10.10.10.10

Примечание. 20.1.1.2 - это IP-адрес "eth0" устройства A. Теперь мой интерфейс ppp0 включен, и я могу пинговать оба IP-адреса (10.10.10.10 и 20.20.20.20).

Зачем мне нужно использовать псевдосерийное устройство, когда у меня есть рабочий интерфейс eth0 - это другой вопрос, и мы не будем его обсуждать.


person Neo    schedule 14.03.2016    source источник
comment
Какого стека протоколов вы пытаетесь достичь?   -  person ysdx    schedule 15.03.2016
comment
@ysdx Я хочу отправить IP через PPP, но поскольку для PPP нужен последовательный порт, я использовал SOCAT для преодоления этого пробела. Надеюсь, я ответил на ваш вопрос.   -  person Neo    schedule 15.03.2016


Ответы (1)


Вы, вероятно, захотите адаптировать этот пример, взятый из socat справочной страницы:

socat PTY,link=/var/run/ppp,rawer INTERFACE:hdlc0

позволяет обойти проблему, заключающуюся в том, что pppd требует последовательного устройства и, следовательно, может быть не в состоянии работать на синхронной линии, представленной сетевым устройством. socat создает PTY для работы pppd, связывается с сетевым интерфейсом hdlc0 и может передавать данные между обоими устройствами. Затем используйте pppd на устройстве / var / run / ppp.

В этом примере интерфейс - это синхронная линия (воспринимаемая ОС как интерфейс HDLC). pppd использует (по умолчанию) кадрирование, подобное HLDC, поэтому имеет смысл передавать необработанные данные из pppd к устройству HDLC.

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

Во втором примере вам удалось перенести сеанс PPP через TCP, что является довольно простым и жизнеспособным вариантом. Другое решение в вашем случае - использовать PPPoE, который предназначен для передачи PPP через Ethernet.

person ysdx    schedule 15.03.2016
comment
Согласен, я хотел обработать необработанные пакеты pppd. Я все еще использовал SOCAT для передачи данных с псевдотерминала и их маршрутизации в сокет TCP. Я написал приложение для подключения к этому TCP-сокету (созданному SOCAT) и обработки сырых пакетов pppd. - person Neo; 17.03.2016
comment
Я обнаружил, что pppd иногда дает отказ в доступе при попытке использовать символическую ссылку, созданную socat. Решением было использовать "$(realpath /tmp/uart)" (или, предположительно, readlink тоже подойдет) вместо "/tmp/uart" в списке аргументов pppd, чтобы он получил прямой путь к виртуальному устройству, а не символическую ссылку на него. - person Mark K Cowan; 11.06.2018