Для сборки Open-Wrt и прошивки в Mikrotik RouterBoard 750 потребуется:
- Linux box;
- прямой кабель ethernet (патчкорд).
Установить необходимые пакеты для сборки образа Open-WRT (список возможно не полный и вам потребуется что-то ещё)
Команда выполняется с привилегиями root
# yum install gcc gcc-c++ ncurses-devel zlib-devel flex git -y
Установить и настроить dhсpd и tftpd
Здесь возможны варианты. Поставить отдельно dhcp tftp серверы, либо установить dnsmasq который содержит в себе как dns так и dhcp tftp серверы. На вкладках приведены обе конфигурации.
# yum install dhcp tftp-server -y
включить tftp в xinetd
# chkconfig tftp on
в файле /etc/xinetd.d/tftp посмотреть куда указывает каталог
# cat /etc/xinetd.d/tftp | grep server_args server_args = -s /var/lib/tftpboot
Создать каталог для файлов tftp если он не создан и поставить права (хотя мой tftp сервер выполняется от root и права ему не особо нужны)
# touch /var/lib/tftpboot # chmod 664 /var/lib/tftpboot
Настройка dhcp сервера (полный конфиг):
MAC адрес WAN интерфейса RB750 можно узнать на коробке или по наклейке на нижней части роутера.
allow booting; allow bootp; subnet 192.168.89.0 netmask 255.255.255.0 { range 192.168.89.50 192.168.89.150; option routers 192.168.89.1; } host mikrotik-rb750 { hardware ethernet d4:ca:6d:8f:03:e3; fixed-address 192.168.89.10; option routers 192.168.89.1; next-server 192.168.89.1; filename "openwrt-ar71xx-nand-vmlinux-initramfs.elf"; }
Если на машине с DHCP сервером активен более чем один интерфейс неплохо бы указать какие именно интерфейсы он должен слушать. В файле /etc/sysconfig/dhcpd указать в качестве параметра интерфейс (у меня eth1)
DHCPDARGS="eth1"
Сконфигурировать интерфейс в который вставлен wan порт роутера если он не был сконфигугирован. Например так:
# ip addr add 192.168.89.1/24 dev eth1 # ip link set eth1 up
И перезапустить xinetd и dhcpd
# /etc/init.d/xinetd restart # /etc/init.d/dhcpd restart
Включить их на постоянно.
# chkconfig xinetd on # chkconfig dhcpd on
# yum install dnsmasq -y
файл конфигурации /etc/dnsmasq.conf
bootp-dynamic interface=eth1 dhcp-range=192.168.89.50,192.168.89.150,255.255.255.0,12h dhcp-option=option:router,192.168.89.1 dhcp-boot=openwrt-ar71xx-mikrotik-vmlinux-initramfs-lzma.elf dhcp-lease-max=150 dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases log-dhcp enable-tftp tftp-root=/var/lib/tftpboot
Обратите внимание на опцию bootp-dynamic. На современных дистрибутивах dnsmasq без этой опции вы скорее не сможете загрузить Mikrotik по сети, так как запрос
0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 4c:5e:0c:ee:b2:f6, length 300, xid 0xdaae35f7, Flags [none] (0x0000)
скорее всего останется без ответа.
Запуск dnsmasq
# service dnsmasq start
Проверка того что на необходимых адресах udp 67 и 69 порты слушает dnsmasq.
# netstat -nlp | grep dnsmasq [root@fileserver etc]# netstat -nlp | grep dnsmasq tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 2202/dnsmasq tcp 0 0 :::53 :::* LISTEN 2202/dnsmasq udp 0 0 0.0.0.0:53 0.0.0.0:* 2202/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2202/dnsmasq udp 0 0 0.0.0.0:69 0.0.0.0:* 2202/dnsmasq udp 0 0 :::53 :::* 2202/dnsmasq
Включить dnsmasq чтобы запускался автоматически при каждом старте системы
# chkconfig dnsmasq on
Если запуск dhcp+tftp не входит в ваши постоянные планы, то можно обойтись запуском из командной строки. Этот вариант удобен и для отладки.
dnsmasq -i eth1 --dhcp-range=192.168.89.100,192.168.89.200 --dhcp-boot=openwrt-ar71xx-mikrotik-vmlinux-initramfs-lzma.elf --enable-tftp --tftp-root=/var/lib/tftpboot/ -d -p0 -K --log-dhcp --bootp-dynamic
Теперь необходимо убедиться что разрешены запросы по DHCP и TFTP портам.
Вот как выглядит упрощённый /etc/sysconfig/iptables
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :TFTP - [0:0] :DHCP - [0:0] :SSH - [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j SSH -A INPUT -m state --state NEW -m udp -p udp --dport 67 -j DHCP -A INPUT -m state --state NEW -m udp -p udp --dport 69 -j TFTP -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited -A SSH -j ACCEPT -A SSH -j REJECT --reject-with icmp-host-prohibited -A TFTP -i eth1 -j ACCEPT -A TFTP -j REJECT --reject-with icmp-host-prohibited -A DHCP -i eth1 -j ACCEPT -A DHCP -j REJECT --reject-with icmp-host-prohibited COMMIT
Перед дальнейшей работой смените пользователя на пользователя без привелений root. У меня это пользователь openwrt.
# su openwrt $
Для компиляции мне потребовалось 3.8 GB дискового пространства. Немало.
Перейдите в рабочй домашний каталог и туда вытяните свежее дерево.
# svn co svn://svn.openwrt.org/openwrt/trunk/ A trunk/rules.mk A trunk/toolchain A trunk/toolchain/glibc A trunk/toolchain/glibc/patches ..... A trunk/README A trunk/feeds.conf.default U trunk Checked out revision 37652.
У вас будет наверняка другая ревизия потому что проект активно развивается и ревизии меняются очень часто. За день может быть несколько ревизий.
Перейдите в каталог trunk
# cd trunk
Подготовим образ
$ make menuconfig
Выберите следующие опции:
Target System: <strong>(Atheros AR7xxx/AR9xxx)</strong> Subtarget: <strong>(Devices with NAND flash (mostly Mikrotik))</strong> Target Images: <strong>tar.gz</strong> Global build settings: <strong>[ ] Enable IPv6 support in packages</strong> Kernel modules: Network Support: <strong><*> kmod-tun.. Universal TUN/TAP driver</strong> Kernel modules: LED modules: <strong><*> kmod-leds-rb750.. RouterBOARD 750 LED support</strong> <strong>exit&save</strong>
Находясь в каталоге trunk компилируем проект. Лучше будет запустить make в screen так как процесс это длительный.
$ ls -l -rw-r--r--. 1 root root 2043984 Aug 1 15:11 openwrt-ar71xx-nand-rootfs.tar.gz -rwxr-xr-x. 1 root root 2920732 Aug 1 15:11 openwrt-ar71xx-nand-vmlinux.elf
Скопировать полученный образ в каталог tftpd сервера (от имени root пользователя). Надеюсь вы помните что находитесь в каталоге trunk.
# cp bin/ar71xx/openwrt-ar71xx-nand-vmlinux-initramfs.elf /var/lib/tftpboot/
Считаем что перед следующим шагом роутер обесточен (отключён от питания).
- Подсоединить роутер (Mikrotik RB750) первым (1) портом прямо к компьютеру куда мы только что скопировали образ и с которого по DHCP будем грузить RB750.
- После подключения нажмите и удерживайте кнопку RESET на RB750 и подсоедините питание.
- Оба светодиода PWR и ACT будут постоянно включены но вы продолжайте удерживать кнопку.
- Через несколько секунд (около 7 сек) светодиод ACT начнёт моргать, вы по прежнему продолжаете удерживать кнопку.
- Ещё через несколько секунд (около 18 сек) светодиод ACT погаснет после чего сразу нужно отпустить кнопку RESET.
После этого роутер будет пытаться получить IP адрес через DHCP/BOOTP протоколы и загрузить образ системы c TFTP сервера.
Чтобы знать как дела используйте tcpdump на сетевом интерфейсе компьютера откуда грузится образ и по DHCP раздаются IP адреса. У меня это eth1.
# tcpdump -i eth1или посмотрите соответствующие файлы журналов системы на которой работает TFTP и DHCP
# tail -n 200 /var/log/messagesПримечание Если вы настроили TFTP и DCHP но у вас почему-то не работает проверьте две вещи: firewall и права к файлам и каталогу где расположены образ для загрузки RB750. Не забывайте про SELinux !. Если что-то идёт не так я обычно первым делом отключаю SELinux. Отключается он и проверяется так:
# setenforce 0 # getenforce Permissive
Проверить работу tftp можно при помощи tftp клиента:
# yum install tftp # cd /root/ # tftp 192.168.89.1 get openwrt-ar71xx-nand-vmlinux-initramfs.elf quit # ls -l openwrt-ar71xx-nand-vmlinux-initramfs.elf -rw-r--r--. 1 root root 4950500 Aug 1 00:56 openwrt-ar71xx-nand-vmlinux-initramfs.elf
Если на машине с которой будет проверяться работа tftp клиента, включён iptables, то обязательно нужно загрузить модуль nf_conntrack_tftp иначе сервер не сможет установить соединение в сторону клиента и оба отвалятся по таймауту. Вот как выглядит это у меня:
# lsmod | grep nf_conntrack_tftp nf_conntrack_tftp 12910 0 nf_conntrack 82780 8 nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,xt_connmark,nf_conntrack_ftp,nf_conntrack_ipv4,nf_conntrack_tftp
Временно руками модуль грузится так:
# modprobe ip_conntrack_tftp
Если модуль нужен на постоянной основе, то в /etc/sysconfig/iptables-config нужно добавить опцию:
IPTABLES_MODULES="ip_conntrack_tftp"
Если у вас имеется там какая-то другая опция то добавьте ip_conntrack_tftp через пробел и перегрузите iptables и проверьте что после рестарта модуль подгрузился.
IPTABLES_MODULES="ip_conntrack_ftp ip_conntrack_tftp"
Когда всё в порядке то роутер загрузится в течении одной двух минут. После этого перевставьте кабель из порта 1 RB750 в его порт 2-4. Тоесть из WAN в LAN. Так как машина на которой у меня стоит DHCP и TFTP имеет четыре сетевые платы то я использовал одновременно два кабеля которые вставил в роутер в 1 и 2 порты. Загруженный по сети OpenWrt по началу пускает только изнутри из LAN, а это порты 2-4.
Заходим на RB750. Помните я не рекомендовал использовать сеть 192.168.1.0/24 ?
А вот ответ почему:
$ telnet 192.168.1.1 Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. === IMPORTANT ============================ Use 'passwd' to set your login password this will disable telnet and enable SSH ------------------------------------------ BusyBox v1.19.4 (2012-06-20 22:03:36 UTC) built-in shell (ash) Enter 'help' for a list of built-in commands. _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- ATTITUDE ADJUSTMENT (Bleeding Edge, r32466) ----------------------------------------------------- * 1/4 oz Vodka Pour all ingredients into mixing * 1/4 oz Gin tin with ice, strain into glass. * 1/4 oz Amaretto * 1/4 oz Triple sec * 1/4 oz Peach schnapps * 1/4 oz Sour mix * 1 splash Cranberry juice ----------------------------------------------------- root@OpenWrt:/#
Вот наш баннер OpenWRT. На этом этапе мы добились что по сети можем загружать нужную прошивку и экспериментировать с ней. Старая прошивка тем временем остаётся неизменной и находится в двух блоках вот здесь:
root@OpenWrt:/# cat /proc/mtd dev: size erasesize name mtd0: 00040000 00020000 "booter" mtd1: 003c0000 00020000 "kernel" mtd2: 07c00000 00020000 "rootfs"
Теперь нам нужно будет установить свою прошивку на постоянно. Надеюсь что при конфигурировании ядра вы не выбросили из него утилиты mtd для работы с флешками. С её помощью освобождаем блоки для ядра и корневой файловой системы.
root@OpenWrt:/# mtd erase kernel Unlocking kernel ... Erasing kernel ... root@OpenWrt:/# mtd erase rootfs Unlocking rootfs ... Erasing rootfs ... root@OpenWrt:/#
Создаём два временных каталога. Они исчезнут при перезагрузке так как находятся в tmpfs (в памяти)
root@OpenWrt:/# mkdir /mnt/kernel /mnt/rootfs
и монтируем ядро из блока mtd1
root@OpenWrt:/# mount -t yaffs2 /dev/mtdblock1 /mnt/kernel
и монтируем корневую файловую систему из блока mtd2
root@OpenWrt:/# mount -t yaffs2 /dev/mtdblock2 /mnt/rootfs
Нам нужно воспользоваться scp для копирования файлов на роутер поэтому нужно установить пароль. Это отключает telnet и включает ssh.
root@OpenWrt:/# passwd Changing password for root New password: Retype password: Password for root changed by root
На компьютере где строили прошивки переходим в каталог trunk/bin/ar71xx. Здесь находятся все построенные файлы. Нам понядобятся два из них.
openwrt-ar71xx-nand-rootfs.tar.gz
openwrt-ar71xx-nand-vmlinux.elf
Их нужно скопировать во временный каталог RB750
# scp openwrt-ar71xx-nand-rootfs.tar.gz openwrt-ar71xx-nand-vmlinux.elf root@192.168.1.1:/tmp root@192.168.1.1's password: openwrt-ar71xx-nand-rootfs.tar.gz 100% 1827KB 1.8MB/s 00:01 openwrt-ar71xx-nand-vmlinux.elf 100% 2719KB 1.3MB/s 00:02
После мы компиляции позаботились о том чтобы kernel влез в вот эти 3 свободных мега. Очень мне интересно куда исчезло 768.0К а это почти 20%. Слабо верится что yaffs2 имеет такие накладные расходы.
root@OpenWrt:/tmp# df -h Filesystem Size Used Available Use% Mounted on tmpfs 14.2M 4.8M 9.4M 34% /tmp tmpfs 512.0K 0 512.0K 0% /dev /dev/mtdblock1 3.8M 768.0K 3.0M 20% /mnt/kernel /dev/mtdblock2 124.0M 1.1M 122.9M 1% /mnt/rootfs
Переносим из временного каталога kernel.
root@OpenWrt:~# mv /tmp/openwrt-ar71xx-nand-vmlinux.elf /mnt/kernel/kernel root@OpenWrt:~# chmod +x /mnt/kernel/kernel root@OpenWrt:~# umount /mnt/kernel
И переносим rootfs и сразу распаковываем
root@OpenWrt:~# cd /mnt/rootfs root@OpenWrt:/mnt/rootfs# tar -xvzf /tmp/openwrt-ar71xx-nand-rootfs.tar.gz ./ ./proc/ ./sys/ ./mnt/ ./init ./bin/ ./bin/egrep ./bin/touch ./bin/gunzip ./bin/true ./bin/chgrp ./bin/ubus ./bin/sync ./bin/cp ... Распаковался архив... ... ./lib/modules/3.3.8/xt_limit.ko ./lib/modules/3.3.8/xt_multiport.ko ./lib/modules/3.3.8/crypto_algapi.ko ./lib/modules/3.3.8/crc-ccitt.ko ./lib/modules/3.3.8/nf_nat_irc.ko ./lib/modules/3.3.8/pppox.ko ./lib/lua/ ./lib/lua/ubus.so
Теперь отмонтируем rootfs и kernel и перезагрузим роутер.
root@OpenWrt:/mnt/rootfs# cd / root@OpenWrt:~# umount /mnt/rootfs root@OpenWrt:~# umount /mnt/kernel root@OpenWrt:~# reboot
Сейчас нужно снова поставить пароль рута. Прежний был в RAM и удалился при перезагрузке.
# telnet 192.168.1.1 # passwd Changing password for root New password: Retype password: Password for root changed by root
Ключ сгенерированный для ssh тоже находился в памяти и исчез при перезагрузке поэтому при входе через ssh по тому-же адресу (192.168.1.1) вы получите ошибку:
$ ssh root@192.168.1.1 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 60:97:95:75:f2:ed:e6:11:98:28:2c:56:5e:54:ba:82. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending key in /root/.ssh/known_hosts:2 RSA host key for 192.168.1.1 has changed and you have requested strict checking. Host key verification failed.
Чтобы небыло этой ошибки удалите из файла /root/.ssh/known_hosts строку с адресом 192.168.1.1
После этого вы нормально войдёте в роутер.
Далее можно заниматься настройкой роутера на своё усмотрение.