RouterBoard RB750 + OpenWRT

Для сборки Open-Wrt и прошивки в Mikrotik RouterBoard 750 потребуется:

  • Linux box;
  • прямой кабель ethernet (патчкорд).
Примечание: у меня Mikrotik отказывался загружаться через кросоверный (перекрещенный) кабель соединяющий его с интерфейсом компьютера Mikrotik<->Компьютер.

Установить необходимые пакеты для сборки образа Open-WRT (список возможно не полный и вам потребуется что-то ещё)
Команда выполняется с привилегиями root

# yum install gcc gcc-c++ ncurses-devel zlib-devel flex git -y


Установить и настроить dhсpd и tftpd
Здесь возможны варианты. Поставить отдельно dhcp tftp серверы, либо установить dnsmasq который содержит в себе как dns так и dhcp tftp серверы. На вкладках приведены обе конфигурации.

dhсpd + tftpddnsmasq
Установка с автоподтверждением

# 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
Обратите внимание что я выбрал сеть 192.168.89.0/24. Можно ставить любую сеть за исключением 192.168.1.0/24 потому что это сеть будет внутреняя сеть у роутера после установки OpenWRT. А нам туда ещё предстоит входить.

Теперь необходимо убедиться что разрешены запросы по 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 так как процесс это длительный.

как выглядит процесс компиляции
Нужно обязательно сразу проверить размер полученных файлов. Потому что для ядра доступно всего лишь 3 Мегабайта. Я как-то использовал настройки ядра по умолчанию и получил ядро 3142452 байт. Ясно что такое не влезет. Поэтому перед компиляцией внимательно смотрим что подключено и проверяем получившийся размер.

$ 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 
как выглядит вывод tcpdump при загрузке и запуске образа OpenWRT
или посмотрите соответствующие файлы журналов системы на которой работает 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
После этого вы нормально войдёте в роутер.

Далее можно заниматься настройкой роутера на своё усмотрение.