Привет!

Указанный в заголовке роутер очень часто ставился Ростелекомом в качестве шлюза для домашнего интернета. Сейчас они уже считаются устаревшими и зачастую просто валяются без дела. У меня таких скопилось три штуки и один из них используется для раздачи интернета беспроводным клиентам в сети.

Меня не устраивало то, что в устройстве нет полноценной настройки dhcp и сейчас я расскажу, что с этим сделал.

Упрощённо интересующий нас сегмент сети можно проиллюстрировать изображением ниже, но суть статьи не в этом, а в том, как получить немного больше от роутера:

Естественно, сеть не статична, она время от времени меняется и главным источником изменений являются мобильные телефоны, которым подавай автоматическую настройку подключения. У роутера на вкладке Advanced Setup / LAN имеются следующие параметры dhcp-сервера:

И, как можно заметить, здесь нет настраиваемого параметра "основной шлюз", в качестве которого роутер просто передаёт свой собственный ip-адрес, чего в обычных условиях использования этого оборудования достаточно.

Долгое время dhcp-сервером работал маршрутизатор 192.168.1.101, но однажды мне мною же была поставлена задача исправить эту несуразицу и всё-таки настроить dhcp на роутере.

Перво-наперво был найден пароль администратора этой железяки. Это не секрет, информация размещена в открытом доступе, в том числе и на форуме производителя оборудования. user: admin, password: kW5i_1bYC6os

К сожалению, вход админом в веб-интерфейс проблему не решил - искомая настройка не появилась.

Зато этот же логин подходит к телнету:

Включить telnet можно в настройках роутера прямо из-под user-а в разделе Management / Access Control

Запускаем шелл (admin / eltexpon):

sh admin

На роутере используется сервер udhcpd, его конфигурационный файл находится в /var/udhcpd/udhcpd.conf. Изменяем конфиг так, как нужно нам:

vi /var/udhcpd/udhcpd.conf
decline_file /var/udhcpd.decline
interface br1
start 192.168.1.230
end 192.168.1.254
option lease 86400
min_lease 30
option subnet 255.255.255.0
option router 192.168.1.101
option dns 8.8.8.8
option dns 8.8.8.8
option domain Home

перезапускаем сервер

/usr/bin/killall udhcpd
/bin/udhcpd &

и видим, что теперь основной шлюз передаётся клиентам так, как нужно нам.

Всё это работает только до перезагрузки, т.к. конфиг udhcpd создаётся заново при включении устройства, однако, способ подсунуть настройки всё-таки есть.

ВНИМАНИЕ! Далее делайте всё аккуратно и только если понимаете, что происходит.
Всё, что будет сделано ниже НЕ отменится сбросом роутера на заводские настройки, соответственно шанс окирпичить роутер крайне высок!

Сначала перемонтируем корневую ФС для записи:

mount -o remount,rw /

Скопируем наш конфиг в корень (хотя можно и создать каталог для этих целей):

cp /var/udhcpd/udhcpd.conf /udhcpd.conf

и внесём в него необходимые изменения. Затем создадим скрипт, задачей которого будет перезапись конфига из корня в /var/udhcpd и перезапуск сервера.

#! /bin/sh

# защитный интервал (устройство грузится долго и скрпит отрабатывает раньше, чем создаётся конфиг)
sleep 60

# замена конфига
rm /var/udhcpd/udhcpd.conf                                                      
cp /udhcpd.conf /var/udhcpd/udhcpd.conf

# перезапуск сервера
/usr/bin/killall dhcpd
/usr/bin/killall udhcpd
/bin/udhcpd &

Автозапуск на роутере реализован с помощью /etc/init.d (а вот /etc/rc.local не работает), притом я не смог зарегистрировать запуск своего скрипта по неизвестной для меня причине, поэтому просто изменил уже имеющийся там скрипт rcS, добавив в него "/dhcp.sh &"

#! /bin/sh

PATH=/sbin:/bin
export PATH

mount -t proc proc /proc
/bin/mount -a

/dhcp.sh &

Конечно, можно применить более изящное решение для исправления файла. Sed на устройстве отсутствует, но можно обойтись и без него, например, сделав скрипт /dhcp.sh таким:

#!/bin/sh
#защитный интервал, т.к. устройство достаточно медленное
sleep 60

# создание временного файла
temp_file=$(mktemp)

# чтение конфига
while IFS= read -r line; do
    # если натыкаемся на строку, с option router, то записываем вместо неё option router 192.168.1.101
   if [[ "$line" =~ ^option\ router ]]; then
        echo "option router 192.168.1.101" >> "$temp_file"
    else
        echo "$line" >> "$temp_file"
    fi
done < "/var/udhcpd/udhcpd.conf"

# заменяем оригинальный файл временным
mv "$temp_file" "/var/udhcpd/udhcpd.conf"

#перезапуск сервера
/usr/bin/killall dhcpd
/usr/bin/killall udhcpd
/bin/udhcpd &

Главная цель статьи - рассказать, как заходить на роутер NTP-RG-1402G-W и расширять его сознание, а применение таким знаниям можно найти и за пределами описываемой задачи.

Удачи!

Комментарии (2)


  1. JBFW
    09.01.2025 11:25

    насколько я помню, единственный скрипт /etc/init.d/rcS вызывается busybox-ом, если указать его в качестве init (там в корне симлинк на него)

    То есть другие скрипты типа rc.local или еще какие-то в init.d он в принципе не вызывает, ну разве что вы сами допишете в rcS.

    Ну мало ли, вдруг пригодится это...


    1. Altfor Автор
      09.01.2025 11:25

      Спасибо за ответ и внимание к посту!
      Да, вероятно, так и есть. У меня не получилось и разбираться я не стал :-)