Что такое LPF и Socket/Fallback в выводе dhclient -v?

Вот мой пример того, как большой bash-скрипт можно разделить на несколько файлов, а затем встроить в один результирующий скрипт:https://github.com/zinovyev/bash-project

Для этой цели я использую Makefile:

TARGET_FILE = "target.sh"
PRJ_SRC = "${PWD}/src/main.sh"
PRJ_LIB = $(shell ls -d ${PWD}/lib/*) # All files from./lib

export PRJ_LIB

SHELL := /bin/env bash
all: define_main add_dependencies invoke_main

define_main:
    echo -e "#!/usr/bin/env bash\n" > ${TARGET_FILE}
    echo -e "function main() {\n" >> ${TARGET_FILE}
    cat "${PRJ_SRC}" | sed -e 's/^/  /g' >> ${TARGET_FILE}
    echo -e "\n}\n" >> ${TARGET_FILE}

invoke_main:
    echo "main \$$@" >> ${TARGET_FILE}

add_dependencies:
    for filename in $${PRJ_LIB[*]}; do cat $${filename} >> ${TARGET_FILE}; echo >> ${TARGET_FILE}; done

0
24.05.2021, 23:30
1 ответ

По-видимому, LPF относится к Linux Packet Filter:https://gitlab.isc.org/isc-projects/dhcp/-/blob/master/common/lpf.c

В других контекстах он также известен как Linux Socket Filtering или Berkeley Packet Filter.

DHCP-клиент должен иметь возможность отправлять и получать широковещательные UDP-пакеты, а сетевой интерфейс еще не обязательно имеет настроенный IP-адрес. Он также должен заботиться о том, через какой интерфейс будут проходить пакеты, чтобы назначить сетевую конфигурацию конкретному сетевому интерфейсу, на который они были получены, а не просто любому интерфейсу в системе, в которой их больше одного.

API-интерфейс фильтрации пакетов -, такой как LPF в Linux, является наиболее гибким и эффективным способом для программного обеспечения DHCP сообщить сетевому стеку ОС :«Я собираюсь использовать сокет необработанных пакетов, потому что моя сеть потребности в трафике немного необычны, но я по-прежнему не хочу получать копию каждого отдельного пакета , поступающего через сетевой интерфейс -, только пакеты UDP на эти конкретные номера портов».

Если LPF или аналогичный пакетный -фильтр API недоступен, программное обеспечение DHCP должно полагаться на стандартные сетевые сокеты API и его различные расширения -, особенно параметры сокетов. Но они не единообразно поддерживаются во всех операционных системах, поддерживаемых набором ISC DHCP, поэтому код сокетов ISC DHCP довольно сложен и полон #ifdefс.

Если нет ни API фильтра пакетов -, ни конкретных доступных параметров сокета,пакет DHCP может работать правильно, только если хост имеет только один сетевой интерфейс:

#if !defined(SO_BINDTODEVICE) && !defined(USE_FALLBACK)
    /* Make sure only one interface is registered. */
    if (once) {
        log_fatal ("The standard socket API can only support %s",
               "hosts with a single network interface.");
    }
    once = 1;
#endif

Когда используется API-интерфейс фильтрации пакетов -, набор ISC DHCP также устанавливает резервный сокет с использованием стандартного API-интерфейса сетевых сокетов. На принимающей стороне резервный сокет просто отбрасывает весь входящий трафик :, возможно, какой-то пакетный -фильтр API создаст копию входящего трафика, и для обеспечения ОС не будет думать, что порт UDP, используемый для DHCP, закрыт, и вызовет отправку сообщений об ошибках ICMP для любых полученных одноадресных пакетов DHCP (, т. е. обновления существующей активной аренды ).

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

1
28.07.2021, 11:29

Теги

Похожие вопросы