Сборка PPPoE-сервера с модулем ядра

Установим пакеты, необходимые для сборки:

# apt-get install ppp-dev devscripts

Скачиваем из репозиториев исходные тексты пакета pppoe, распаковываем их и переходим в каталог с распакованными файлами:

# apt-get source pppoe
# cd rp-pppoe-3.12/

Открываем файл debian/rules, находим в нём следующую строчку:

test -f src/Makefile || (cd src && PPPD=/usr/sbin/pppd ./configure)

И добавляем опцию для сборки плагина, без сборки которого попытки включить поддержку PPPoE со стороны ядра не предпринимаются:

test -f src/Makefile || (cd src && PPPD=/usr/sbin/pppd ./configure --enable-plugin)

При попытке скомпилировать получаем от компилятора множество ошибок вида:

In file included from pppoe.h:134:0,
                 from plugin.c:31:
/usr/include/linux/in.h:28:3: error: redeclaration of enumerator ‘IPPROTO_IP’
   IPPROTO_IP = 0,  /* Dummy protocol for TCP  */
   ^
/usr/include/netinet/in.h:42:5: note: previous definition of ‘IPPROTO_IP’ was here
     IPPROTO_IP = 0,    /* Dummy protocol for TCP.  */
     ^~~~~~~~~~

Компилятор ругается на то, что в заголовочном файле linux/in.h повторяются объявления, которые уже имеются в файле netinet/in.h. Исправим файл src/configure.in, удалив из исходного текста теста строчку с заголовочным файлом netinet/in.h.

Аналогичные изменения понадобится внести в файл src/pppoe.h.

Зафиксируем изменения в пакете:

# dpkg-source --commit

В ответ на запрос имени патча введём, например, pppoe-server-kernel-support, а открывшемся текстовом редакторе отредактируем описание патча, доведя его до следующего вида:

Description: Fixed PPPoE kernel support for pppoe-server
Fixed PPPoE kernel support for pppoe-server
 .
 rp-pppoe (3.12-1.2) unstable; urgency=low
Author: Vladimir Stupin <vladimir@stupin.su>
Last-Update: 2018-09-17

--- rp-pppoe-3.12.orig/src/configure.in +++ rp-pppoe-3.12/src/configure.in @@ -168,7 +168,6 @@ fi AC_TRY_RUN([#include #include #include -#include #include int main() { --- rp-pppoe-3.12.orig/src/pppoe.h +++ rp-pppoe-3.12/src/pppoe.h @@ -131,8 +131,6 @@ typedef unsigned long UINT32_t; #include #endif

-#include - #ifdef HAVE_NETINET_IF_ETHER_H #include

Отметим изменения в журнале изменений пакета. Для этого выполним следующую команду:

# dch -i

И введём описание изменений:

rp-pppoe (3.12-1.2) UNRELEASED; urgency=medium

  * Non-maintainer upload.
  * Fixed PPPoE kernel support for pppoe-server

 -- Vladimir Stupin <vladimir@stupin.su>  Mon, 17 Sep 2018 23:12:00 +0500

Осталось собрать исправленный пакет:

# dpkg-buildpackage -us -uc -rfakeroot

Цель была в том, чтобы добиться поддержки PPPoE хоть тушкой, хоть чучелом. И это-таки получилось - в выводе предыдущей команды можно заметить такие строчки:

checking for Linux 2.4.X kernel-mode PPPoE support... no
*** Your kernel does not appear to have built-in PPPoE support,
*** but I will build the kernel-mode plugin anyway.

Переходим в вышестоящий каталог и устанавливаем собранный пакет:

# cd ..
# dpkg -i pppoe_3.12-1.2_amd64.deb

Пробуем запустить PPPoE-сервер с поддержкой PPPoE со стороны ядра:

# pppoe-server -I eth0 -k

Сервер нормально воспринял опцию -k и, видимо, успешно создал специальный сокет, поддерживаемый модулем ядра pppoe.