Добавление 10 секунд сна в файл /etc/init.d/hostapd
решило проблему для меня.
1)sudo nano /etc/init.d/hostapd
2 )Добавьте sleep
в секцию start)
, как показано ниже
case "$1" in
start)
log_daemon_msg "Starting $DESC" "$NAME"
sleep 10
start-stop-daemon --start --oknodo --quiet --exec "$DAEMON_SBIN" \
--pidfile "$PIDFILE" -- $DAEMON_OPTS >/dev/null
log_end_msg "$?"
;;
Это невозможно со стандартными сетевыми командами. Функции, упрощающие это, были явно отвергнуты Docker несколько лет назад (https://github.com/moby/moby/pull/8216).
Конечно, вы можете вручную переместить интерфейс в сетевое пространство имен контейнера Docker, но это чревато проблемами :, например, каждый раз, когда вы перезапускаете или повторно -создаете контейнер, вам придется повторно -настроить сеть.
Чтобы добавить интерфейс в сетевое пространство имен вашего контейнера:
Получите PID вашего контейнера:
container_pid=$(docker inspect <container_name_or_id> -f '{{.State.Pid }}')
Назначьте интерфейс пространству имен контейнера:
ip link set netns ${container_pid} dev ${device}
И вы закончили... в основном.
Если вы хотите настроить интерфейс после его добавления в пространство имен, вам нужно будет либо:
Запустите свой контейнер с дополнительными привилегиями. Вероятно, просто --cap-add=NET_ADMIN
, хотя вы также можете просто использовать --privileged
во время тестирования.
Используйте nsenter
для выполнения конфигурации снаружи контейнера:
nsenter -t ${container_pid} -n ip addr...
Хотя все это работает, из-за ограничений, которые я отметил, я бы просто придерживался драйвера macvtap
, если мне по какой-то причине нужен физический интерфейс внутри контейнера. Или используйте lxc
или systemd-nspawn
или какой-либо другой инструмент контейнеризации, который упрощает эту конкретную задачу.