Расширяет возможности Apple Time Capsule как домашнего маршрутизатора:
- Возможность добавить дополнительные опции в dhcpd server
- DNS сервер c обслуживанием локальной зоны с динамическим добавлением выданных dhcpd ip адресов
- Статические IPSec туннели
Не ломает стандартную функциональность утилиты Airport Utility, все сделанные на ней настройки применяются и используются как положено (если иное не указано в конфигурации).
Нормально переживает перезагрузки TC
Проверялось только на TimeCapsule 802.11/ac прошивка 7.9.1
- root доступ на TC
- Распаковать архив
tinydns-earmv4-bin.zip
на встроенный hdd по пути/Volumes/dk2/SharedRoot/tinydns-earmv4-bin
(mkdir -p /Volumes/dk2 && mount_hfs /dev/dk2 /Volumes/dk2
) - настроить конфигурацию в файле
tc/tc.conf
- скопировать содержимое директории
tc
в/mnt/Flash/tc/
- установить ссылку
ln -s /mnt/Flash/tc/setup.sh /mnt/Flash/rc.local
- запустить
/mnt/Flash/tc/setup.sh
- вывод логов смотреть в
/var/log/tc
Самый простой и верный способ: после изменения любых настроек запустить /mnt/Flash/tc/setup.sh
- Настраиваются через Airport Uitility
- Если fixed-address резеревируется на client-dhcp-id, то client-dhcp-id будет использоваться как hostname для этой записи в DNS
- Если fixed-address резервируется на MAC адрес, то такой хост не будет зарегистрирован в DNS. если нужна его регистрация в DNS - добавить его client-dhcp-id на тот же ip, что и MAC
в файле tc.conf:
- DHCPD_GLOBAL - глобальные опции (для всех скоупов)
- DHCPD_LAN - опции для скоупа локальной сети (НЕ гостевой)
Переменные должны быть multiline - одна опция на строку
применение параметров:
/mnt/Flash/tc/bin/dhcpd.sh configure
/mnt/Flash/tc/bin/dhcpd.sh restart
в файле tc.conf:
- ZONE - имя локальной DNS зоны (имя гостевой зоны будет guest.$ZONE)
- DNS_STATIC - статические записи в DNS (в формате https://cr.yp.to/djbdns/tinydns-data.html), multiline, одна запись на строку
- DNS_ACCESS - "внешние" сети, которые имеют право использовать наш DNS север, предназначение - сети на других концах туннелей. Формат записи сеть:
192.168
или172.16.20
. Указываются в строке через пробел:DNS_ACCESS="192.168 172.16.20"
- DNS_FORWARD - тип работы резолвера
- root - рекурсивный резолвер с кэшированием, использующий ip адреса root серверов dns. (для получения/обновления адресов root серверов выполнить:
/mnt/Flash/tc/bin/dns.sh update_root
). Если выбран этот режим, а списка root.ip нет, то будет использоваться поведение по-умолчанию (DNS_FORWARD=) - список ip адресов dns серверов (forwarder) - перенаправлять все запросы к указанным dns серверам (DNS_FORWARD="1.0.0.1 1.1.1.1")
- не задано (DNS_FORWARD=) - штатный режим работы Airport TC
- root - рекурсивный резолвер с кэшированием, использующий ip адреса root серверов dns. (для получения/обновления адресов root серверов выполнить:
- DNS_EXTERNAL - зоны, которые нужно явно нужно запрашивать у конкретных dns серверов, multiline, одна запись на строку
some.local.zone 192.168.1.1
применение параметров:
/mnt/Flash/tc/bin/dns.sh configure
/mnt/Flash/tc/bin/dns.sh setup_dnscache
в файле tc.conf:
- tunnels - перечень туннелей через пробел:
tunnels="TUN1 TUN2"
Для каждого туннеля TUNx:
- TUNx_PUB - публичный ip адрес удаленной стороны туннеля
- TUNx_IP - приватный ip адрес удаленной стороны туннеля
- TUNx_NET - сети, находящиеся на удаленной стороне туннеля в формате
"192.168.1.0/24 192.168.2.0/34"
- TUNx_SPI_IN - идентификатор входящего (по отношению к TC) ipsec SPI
- TUNx_KEY_IN - ключ шифрования ESP входящего SPI
- TUNx_SPI_OUT - идентификатор исходящего (по отношению к TC) ipsec SPI
- TUNx_KEY_OUT - ключ шифрования ESP исходящего SPI
применение параметров:
/mnt/Flash/tc/bin/tunnels.sh
Из гостевой сети туннели также будут доступны, поэтому потребуется фильтровать трафик с гостевых сетей на удаленной стороне туннеля
ifconfig gifX create
ifconfig gifX $TUNx_IP $TC_IP netmask 255.255.255.0
ifconfig gifX tunnel $TUNx_PUB $TC_PUB
setkey -c << EOF
add $TUNx_PUB $TC_PUB esp $TUNx_SPI_IN' -E rijndael-cbc $TUNx_KEY_IN;
add $TC_PUB $TUNx_PUB esp $TUNx_SPI_OUT' -E rijndael-cbc $TUNx_KEY_OUT;
spdadd $TUNx_PUB/32 $TC_PUB/32 ip4 -P out ipsec esp/transport/$TUNx_PUB-$TC_PUB/require;
EOF
route add $TC_NET $TC_IP
где:
- $TC_IP - приватный (LAN) IP адрес Airport TC
- $TC_PUB - публичный IP адрес Airport TC
- $TC_NET - Airpot TC LAN network
- не проверено при статической конфигурации публичного интерфейса
- надо б проверить как это делать с подключенной к TC/Airport usb флешки
ifwatchd ждет окнчания выполнения запущенного if-up/if-down скрипта перед выполнением следующего, даже если события произошли на разных интерфейсах, поэтому используются дополнительные скрипты if-up-interface.sh
- использовать только esp transport
- режим esp tunnel без gif интерфейса - просаживает пропускную способность входящего из туннеля трафика приблизительно в 10(!) раз
- режим esp tunnel c использованием gif интерфейса не работает, потому что в gif интерфейс попадает не деинкапсулированный входящий трафик из ipsec
- дополнительное использование ah - просаживает пропускную способность входящего из туннеля трафика приблизительно в 2 раза
Для запуска tinydns на TC нужно было собрать бинарники:
- 32bit
- архитектура earmv4
- со статически линкованными библиотеками
ВАЖНО: в /mnt/Flash
всего 1M места, туда мало что влезет, полученные 2 бинарника не влезли. Пытался собрать архиватор (gzip, bzip2, compress, unzip) - они получаются минимум 600k, а архив с бинарниками tinydns ~ 550k, поэтому бессмысленны (в базе TC архиваторов нет)
Работало на NetBSD 9.0 и 9.2 x86_64 в UTM(qemu)
В 6.0 нет нужной архитектуры для кросс-компиляции: -m evbarm -a earmv4
Запустить arm версии NetBSD не получилось, пробовал: UTM(qemu), Fusion
cd /usr/src
./build.sh list-arch # list available architectures
LDSTATIC=-static; export LDSTATIC
./build.sh -U -O ~/evbarm-earmv4 -j6 -m evbarm -a earmv4 tools
./build.sh -U -u -O ~/evbarm-earmv4 -f6 -m evbarm -a earmv4 distribution
опционально (для сборки статично линкованными):
- LDSTATIC=-static
- или добавить в /etc/mk.conf
Часть системных утилит можно просто собрать без pkgsrc:
cd /usr/src/{usr.bin,usr.sbin,external....}
/root/evbarm-earmv4/tooldir.NetBSD-9.0-amd64/bin/nbmake-earmv4 install
прочее - из портов
rm -rf /usr/pkgsrc
ftp ftp://ftp.NetBSD.org/pub/pkgsrc/stable/pkgsrc.tar.gz
tar -xzf pkgsrc.tar.gz -C /usr
LDSTATIC=-static
PKG_DBDIR=/var/db/pkg
USE_CROSS_COMPILE?=yes
CROSSBASE=${LOCALBASE}/cross-${TARGET_ARCH:U${MACHINE_ARCH}}
.if !empty(USE_CROSS_COMPILE:M[yY][eE][sS])
MACHINE=evbarm
MACHINE_ARCH=earmv4
TOOLDIR=/root/evbarm-earmv4/tooldir.NetBSD-9.0-amd64
CROSS_DESTDIR=/root/evbarm-earmv4/destdir.evbarm
PACKAGES=${PKGSRCDIR}/packages.${MACHINE_ARCH}
WRKDIR_BASENAME=work.${MACHINE_ARCH}
USE_CWRAPPERS=no
.endif
CONFIGURE_ENV+= CC_FOR_BUILD=${NATIVE_CC:Q}
CONFIGURE_ENV+= ac_cv_file__dev_urandom=yes
Дальше в /usr/pkgsrc/category/port и пробовать make. Результат в work.earmv4
Для сборки БЕЗ кросс-компиляции: make USE_CROSS_COMPILE=no
архитектуру бинарника и какие либы использует (static/dynamic) определяем командой file
Если при сборке пакета выполняются только что собранные бинарники, то они не выполнятся из-за разницы архитектур. В этом случае:
- собрать в текущей архитектуре
- в Makefile пакета (в distfiles) указать полный путь к только собранным файлам при вызове (добавляем NO_CHECKSUM=yes при вызове make)
- посмотреть примененные патчи, может какие-то можно выкинуть
Для сборки со статически линкованными библиотеками, если не работает LDSTATIC=-static добавлять строку -static
при вызове компилятора:
- в Makefile дистрибутива (в distfiles)
- потом в package Makefile
- потом по цепочке *.mk файлов (брать из package Makefile)
- djbdns:
- NetBSD cross-compile
- Airport access & management