доброе утро у меня такая проблема я добавил сайты с айпишниками в файл host через командную строку роутера но когда я включаю opkg dns-override он перестает работать сайты добавленные host перестают открываться можно ли в entware как то добавит host файл или заставит работать системный host роутера
entware специально патчится и собирается для /opt
проги из entware будут смотреть в /opt/etc/hosts, а не /etc/hosts
проги, не собранные для entware, будут смотреть /etc/hosts
Благодарю Спасибо. Что подсказали. Всё работает
Если точнее, это делает системный DNS-резолвер, а проги уже обращаются к нему.
А вот в какой файл будет смотреть системный резолвер, зависит от того, кто этот резолвер.
Топикстартер отключил системный резолвер командой opkg dns-override
. После этого системный dns-proxy освобождает 53 порт, чтобы туда мог встать AdguardHome или dnsmasq (или ещё какой резолвер) из Entware. А эти DNS-резолверы из Entware, в свою очередь, смотрят в энтварский /opt/etc/hosts
.
Таким образом, если бы топикстартер не отключал системный резолвер, то даже проги из Entware учитывали бы записи в /etc/hosts
. Это легко проверить: достаточно создать запись в /etc/hosts
командой ip host my.comp 192.168.1.33
, а затем установить в Entware wget и дёрнуть этот домен
~ # wget my.comp
--2025-01-13 18:45:20-- http://my.comp/
Resolving my.comp... 192.168.1.33
Клиентская часть системного ресолвера находится в libc.
У entware glibc патчен на /opt. Все, что линковано на патченый glibc, будет искать в /opt/etc/hosts при вызове getaddrinfo
Но если в /opt/etc/resolv.conf локалхост стоит, и там dnsmasq родной от прошивки, то он посмотрит /etc/hosts и вернет результат оттуда
/opt/bin/wget слинкован с /opt/lib/libc.so.6
# ldd /opt/bin/wget
linux-vdso.so.1 (0x77404000)
libpcre2-8.so.0 => /opt/lib/libpcre2-8.so.0 (0x77329000)
libssl.so.3 => /opt/lib/libssl.so.3 (0x77286000)
libcrypto.so.3 => /opt/lib/libcrypto.so.3 (0x76f19000)
libdl.so.2 => /opt/lib/libdl.so.2 (0x76f05000)
libz.so.1 => /opt/lib/libz.so.1 (0x76ee0000)
libgcc_s.so.1 => /opt/lib/libgcc_s.so.1 (0x76ebc000)
libc.so.6 => /opt/lib/libc.so.6 (0x76d29000)
libpthread.so.0 => /opt/lib/libpthread.so.0 (0x76cfb000)
libatomic.so.1 => /opt/lib/libatomic.so.1 (0x76ce6000)
/opt/lib/ld.so.1 (0x773d2000)
Запись в /opt/etc/hosts есть
# cat /opt/etc/hosts
192.168.1.66 my.site
Но домен не резолвится
# /opt/bin/wget my.site
--2025-01-13 19:03:30-- http://my.site/
wget: unable to resolve host address ‘my.site’
/opt/etc/resolv.conf вообще отсутствует
То есть, всё равно используется родной прошивочный резолвер, а самостоятельно wget в /opt/etc/hosts не заглядывет.
Посмотрел исходники.
Действительно, ошибаюсь. В libc там запатчены passwd,group и некоторые другие.
resolv.conf и hosts запатчены только в dnsmasq, но не в libc.
таким образом проги будут использовать стандартные /etc/resolv.conf и /etc/hosts
Но если используется dnsmasq от entware, то он будет смотреть еще в /opt и возвращать ответы оттуда.
-#define HOSTSFILE "/etc/hosts"
-#define ETHERSFILE "/etc/ethers"
+#define HOSTSFILE "/opt/etc/hosts"
+#define ETHERSFILE "/opt/etc/ethers"
-# define RESOLVFILE "/etc/resolv.conf"
+# define RESOLVFILE "/opt/etc/resolv.conf"
Вся эта котовасья идет из расчета , что root может быть readonly, а /etc/resolv.conf может быть линком на динамически генерируемый файл в /tmp.
То, что наверняка нужно модифицировать, уносится из /etc в /opt