Страницы

четверг, 30 января 2014 г.

Проба программного приёмника (SDR) из DVB-T адаптера Realtek RTL2832U в Ubuntu

SDR-приёмник - перспективная технология цифрового радио.
Простым пользователям, с некоторых пор, можно недорого попробовать программное радио в работе, благодаря делам энтузиастов.

На аукционе ebay.com (как теперь покупать?) был год назад куплен приёмник цифрового телевидения DVB-T именно для целей программного радио. Можно найти на aliexpress.com и у других китайских товарищей.

Теперь дошла очередь до подключения RTL-SDR к Linux. Проведу несколько экспериментов.

Подключение в Ubuntu 13.10


Как устройство определяется в Ubuntu 13.10:

$ dmesg

...
[34983.059051] usb 3-1: new high-speed USB device number 3 using xhci_hcd
[34983.090097] usb 3-1: New USB device found, idVendor=0bda, idProduct=2838
[34983.090104] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[34983.090108] usb 3-1: Product: RTL2838UHIDIR
[34983.090111] usb 3-1: Manufacturer: Realtek
[34983.090114] usb 3-1: SerialNumber: 00000000
[34983.168308] usb 3-1: dvb_usb_v2: found a 'Realtek RTL2832U reference design' in warm state
[34983.169246] usbcore: registered new interface driver dvb_usb_rtl28xxu
[34983.241594] usb 3-1: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
[34983.241627] DVB: registering new adapter (Realtek RTL2832U reference design)
[34983.253899] usb 3-1: DVB: registering adapter 0 frontend 0 (Realtek RTL2832 (DVB-T))...
[34983.259745] r820t 8-001a: creating new instance
[34983.272964] r820t 8-001a: Rafael Micro r820t successfully identified
[34983.280850] Registered IR keymap rc-empty
[34983.281011] input: Realtek RTL2832U reference design as /devices/pci0000:00/0000:00:10.0/usb3/3-1/rc/rc0/input11
[34983.281127] rc0: Realtek RTL2832U reference design as /devices/pci0000:00/0000:00:10.0/usb3/3-1/rc/rc0
[34983.287250] IR RC5(x) protocol handler initialized
[34983.287699] IR NEC protocol handler initialized
[34983.292724] IR RC6 protocol handler initialized
[34983.293159] IR JVC protocol handler initialized
[34983.293592] usb 3-1: dvb_usb_v2: schedule remote query interval to 400 msecs
[34983.293794] IR Sony protocol handler initialized
[34983.293857] input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input12
[34983.294358] IR MCE Keyboard/mouse protocol handler initialized
[34983.295742] IR SANYO protocol handler initialized
[34983.298048] lirc_dev: IR Remote Control driver registered, major 250
[34983.300295] rc rc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0
[34983.300299] IR LIRC bridge handler initialized
[34983.308456] usb 3-1: dvb_usb_v2: 'Realtek RTL2832U reference design' successfully initialized and connected


$ lsusb

Bus 003 Device 003: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

где - "0bda" (VID - vendor id) и "2838" (PID - product id).



Установка GnuRadio


$ sudo apt-get install gnuradio

Также можно установить из исходных кодов, но я выбрал из репозитория, что быстрее.

Сборка из исходных кодов RTL-SDR


Перед сборкой rtl-sdr надо установить пакет libusb-1.0-0-dev, а также иметь установленной утилиту git.

$ sudo apt-get install libusb-1.0-0-dev

Подробно сборка RTL-SDR описана в [1]. Здесь кратко.

Загрузка исходных кодов RTL-SDR. Можно проделать в домашней директории, либо в директории для проектов (у меня ~/dev )

~/dev$ git clone git://git.osmocom.org/rtl-sdr.git
~/dev$ cd rtl-sdr/
~/dev$ mkdir build
~/dev$ cd build
~/dev$ cmake ../
~/dev$ make
~/dev$ sudo make install
~/dev$ sudo ldconfig


Тестирование после сборки

$ sudo rtl_test -t
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000013

Using device 0: Generic RTL2832U OEM

Kernel driver is active, or device is claimed by second instance of librtlsdr.
In the first case, please either detach or blacklist the kernel module
(dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

usb_claim_interface error -6
Failed to open rtlsdr device #0.

Надо выгрузить модули ядра, привязанные к устройству (это всё же телеприёмник):

$ sudo rmmod dvb_usb_rtl28xxu
$ sudo rmmod rtl2830
$ sudo rmmod dvb_usb_v2

После он напишет:

$ sudo rtl_test -t
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000000

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
Sampling at 2048000 S/s.
No E4000 tuner found, aborting.

Откуда становиться понятно, что тюнер "Rafael Micro R820T". Это один из поддерживаемых тюнеров, с диапазоном 24 - 1766 МГц.


Простейшее прослушивание УКВ-радио (FM)


RTL-FM - консольная программа для декодирования FM. Aplay - консольное проигрывание звука.

$ sudo rtl_fm -f 91.5e6 -s 200000 -r 48000 - | aplay -r 48k -f S16_LE

Вывод команды:

Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000000

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Tuner gain set to automatic.
Tuned to 91800000 Hz.
Oversampling input by: 6x.
Oversampling output by: 1x.
Buffer size: 6.83ms
Sampling at 1200000 S/s.
Output at 200000 Hz.
Воспроизведение Сырые данные 'stdin' : Signed 16 bit Little Endian, Частота 48000 Гц, Моно
недобор!!! (не менее 108,415 мс длинной)

В Петербурге слышно радио на частоте 91.5МГц.


Выводы

- Пока просто приём радио. Что-то больше - это уже радиолюбительство.
- Можно записывать эфир в файл.
- Есть графические программы такие как SDR#, Linradio.


Ресурсы


- Сборка RTL-SDR (en). http://sdr.osmocom.org/trac/wiki/rtl-sdr
- Сборка SDR# (en). http://www.rtlsdr.org/softwarelinux
- Использование программы rtl-fm. http://kmkeen.com/rtl-demod-guide/
- Некоторая техническая информация о микросхеме RTL2832U . http://www.linuxtv.org/wiki/index.php/RealTek_RTL2832U

- Установка и настройка RTL SDR УКВ приёмника в Windows (рус.). http://ua6hjq.qrz.ru/sdr/rtlsdr.htm
- Небольшой план частот. http://ua6hjq.qrz.ru/sdr/rtl-freq.htm

- Встроенные жучки в ноутбуки. http://dangerousprototypes.com/2013/09/04/hp-laptop-security-flaw-discovered-using-rtl-sdr/

четверг, 9 января 2014 г.

Mikrotik admin scripts - некоторые простые скрипты

Некоторые сведения о скриптах RouterOS


Скрипты находятся в меню System/Scripts

Для того чтобы скрипт нормально отрабатывал (а я столкнулся с неработоспособностью встроенной программы fetch, т.к. подразумевал, что я что-то делаю не так, начал искать и нашёл правило - установить флаги Policy - READ,WRITE,TEST,POLICY.

NOTE: В расписании запуска скрипта тоже надо их установить - READ, WRITE, TEST, POLICY

Скрипты не понимают русского языка, так что всё на английском.

Итак, "парочка" скриптов.

Wifi ON/OFF


Скрипт отключения wifi точки доступа по расписанию.
wifi-ap - это имя (name) беспроводного интерфейса у меня (я его переименовал).

# Script for disable wifi-ap at night
# Node: mikrotik RB951G-2HnD
# Date: 09.01.2014
/interface disable wifi-ap
:log info "wifi sleep at night"

Соответственно включения:

# Script to enable wifi-ap access at morning
# Node: mikrotik RB951G-2HnD
/interface enable wifi-ap
:log info "wifi enabled to day work"

И задать в расписании их запуск когда надо. Не забыть про флаги.

※※※

Dynamic DNS updates



Как я выяснил в результате изысканий, достаточно выполнить следующую команду и сервер сам определить IP и если всё в порядке то обновит записи DNS.

Обвязку (вывод сообщений в логи) можно самому себе придумать как хочется.


Пример для www.dyndns.org

/tool fetch user=myusername password=mypassword \
url="http://members.dyndns.org/nic/update\?hostname=myfqdnname" \ dst-path="/dyndns.reply"

NOTE: DynDNS похоже стал платным и удаляет привязки как ему хочется, а посему ...

Следующий пример для twodns.de

Немножко по другому написан, чтобы показать возможности использования переменных

:local myusername "myusername"
:local
mypassword "mypassword"
:local fqdnname "myfqdnname"

/tool fetch keep-result=no user="$myusername" password="$mypassword" url="http://update.two-dns.de/nic/update\?hostname=$
fqdnname"

NOTE: Заметьте, что используется символ \ для снятия специального значения у вопросика (вопрос в консоли выводит список команд доступных в меню).

В принципе, всё. Это работает. Можно установить обновление через пару-тройку часов и забыть. А можно сделать обвязку, которая проверяет доступность интерфейсов, текущее значение IP и пр.

Вот например, получение адреса с маской, отбрасывание маски и установка переменной с текущим значение внешнего IPv4-адреса

# mywan - my wan interface name
:local wan "mywan"
:local wanip [ /ip address get [/ip address find interface=$wan ] address ]
:local wanip [:pick $
wanip 0 [:find $wanip "/"]]
:log info "Wan IPv4 address is $wanip"


Вот получение преобразованного DNS-имени в IP от DNS-серверов, пишется в скриптах.

:log info ("DynDNS: Previous resolved FQDN name $myfqdnname" . [:resolve "$myfqdnname"])

или в переменную
:local dnsip [:resolve "$myfqdnname"]

Если писать в консоли ssh, то можно так смотреть для пошаговой отладки:
:put [:resolve "$myfqdnname"]
а потом в скриптах заменять на переменные.
Это всё потому, что отладка скриптов на микротике дело запутанное.


Условие можно написать так:
:if (wanip != dnsip) do={

} else={

}
В условии if,  do= и else= так и пишутся без пробелов. Да и в циклах.

NOTE: Все спец.инструкции скриптового языка начинаются с символа : .

※※※

Sheduler - Расписание


При задании интервала в 1 день в расписании, через Web-интерфейс, интервал надо указывать в формате   1d 00:00:00
либо воспользоваться консолью:

[admin@MikroTik] /system scheduler> set [find name=wifidayup] interval 1d

※※※

Netwatch


При настроенной электронной почте (/tool e-mail), появляется возможность отправки событий от Сетевого наблюдателя - Netwatch (/tool netwatch).

Все сообщения на английском, т.к. у Mikrotik трудности с кодировками.

Наблюдая за состоянием IP-адреса (например IP камеры), netwatch вызывает события при первой доступности камеры, а также при первой недоступности и соотв. при смене состояния.

Надо заполнить поля On Up и On Down простейшим скриптом.

/tool e-mail send to=my@mail.ru subject="IP Camera 1 up" body="Netwatch say IP Camera 1 up and running"

On Down:

/tool e-mail send to=my@mail.ru subject="IP Camera 1 down" body="Netwatch say IP Camera unreachable"

※※※

PPtP и динамическое имя домашнего роутера


Основная проблема с подъёмом туннеля на Микротик - это отсутствие встроенной функции преобразования имён. Всё сделано на чистых IP-адресах.
Если домашний роутер имеет динамический IP-адрес, который часто меняется, то для того чтобы PPtP-клиент мог автоматически подключаться после изменений адреса, можно приделать такой скрипт, который выясняет изменения IP-адреса домашнего роутера и если было изменение - то выполняет обновление поля Connect-to у PPtP-интерфейса на клиенте (другой роутер). Это простой скрипт, без проверок, чтобы было понятно куда двигаться дальше. А сбои могут быть разные, вплоть до получения текста в значениях переменных.
Чтобы улучшить - надо устраивать проверки.



# Script to update a Connect-to IP address of home router in PPtP tunnel
# Host: router, Mikrotik
# Date: 13.01.2015
# author: Dmitriy for site gimmor.blogspot.com

# defint FQDN of home router
:local homehost "my.dynamic.name"

# define PPtP-interface (copy "name" from "Interfaces" section of pptp-client)
:local tunnelinterface "pptp-to-home"

:local ddnsip [:resolve $homehost ]
:log info ("ddns IP: $ddnsip.")
:local connectto [/interface pptp-client get [/interface pptp-client find name=$tunnelinterface ] connect-to]
:log info ("local Connect-to IP: $connectto.")

:if ($connectto != $ddnsip) do={
   :log info ("ddns IP: $ddnsip.")
   :log info ("local Connect-to IP: $connectto.")
   [ /interface pptp-client set [/interface pptp-client find name=$tunnelinterface ] connect-to=$ddnsip ]
   :log info ("Connect-to Done!")
} else={
   :log info "NO tunnel's connect-to IP address update needed! host $homehost bind to address $ddnsip"
}

Желтым выделена команда обновления поля. После обновления поля "Connect-to" из скрипта происходит автоматический разрыв и переподсоединение. Если всё работает, то туннель PPtP автоматически присоединиться к домашнему роутеру.

Если скрипт не работает, надо его протестировать построчно добавляя в систему.

※※※

Мониторинг питания Микротика


При наличии встроенных датчиков питания и температуры (например в Routerboard RB912UAG-2HPnD) можно осуществить просмотр значений напряжения и температуры:

:put [/system health get voltage]
:put [/system health get temperaute]

Значение напряжения, да и температуры возвращается в виде 3 цифр, без десятичной точки.

Если Микротик запитан от батарейного источника питания, то падение напряжения можно отследить и уведомить пользователя-администратора.



※※※

Ресурсы


1. http://wiki.mikrotik.com/wiki/Scripts
2. http://dyn.com/support/developers/api/perform-update/
3. http://aacable.wordpress.com/tag/mikrotik/



※※※








Обновление старого роутера D-Link DIR-320 A1 с DD-WRT на Open-WRT

Обновление старого роутера

Перед прошивкой мучал вопрос, сможет ли система обновиться. Смогла.
Что-же, для того и придумали флеш память, чтобы обучить старый роутер новым трюкам.

В процессе адаптации сетевого хлама к переходу на IPv6 обновил роутер DIR-320 A1, с прошивкой DD-WRT на прошивку OpenWRT 10.03.1.
Всё прошло буднично и просто.
Отключил от роутера всё. Подключил компьютер с сетевой платой к первому порт LAN. Зашёл в вебинтерфейс.
Скачал образ версии 10.03.1 (ядро 2.6...) и из веб-интерфейса DD-WRT запустил процесс обновления, задав сброс настроек. Подождал пока пошуршит и начнёт перезагрузку. Старое окно со старым интерфейсом dd-wrt закрыл и открыл уже новую прошивку OpenWRT на адресе 192.168.1.1.

Теперь следует определиться что будет на роутере и собрать собственную прошивку, а для этого надо понять что нужно. Можно попробовать иную прошивку (12.09.1), но уже с ядром 3.3.
Ну IPv6 точно уже нужно, а разнообразие пакетов поражает. А что выбрать непонятно. Зависимости тоже непонятны.
Т.к. роутер пока не используется, то на нём и потренируюсь.

Однако и следующий "тупой" роутер Netcomm BigPond 3G9WB надо бы обновить, но это несколько сложнее, надо плотнее разбираться с загрузчиком и поддержкой железа (процессор Broadcom 63xx серии), там встроен 3g модем.

На следующий день прибыл роутер D-Link DIR-320 A2, который был с непонятной нерабочей прошивкой.
1. Обновил через режим восстановления на стандартную прошивку D-Link.
2. Обновил стандартно через TFTP-скрипт на прошивку OpenWRT 10.03.1.




Ресурсы

1. http://ne-ne-ne.ru/openwrt/make-openwrt/openwrt-sborka-iz-isxodnikov-proshivki.html
2. http://autohome.org.ua/12-openwrt/8-openwrt-dlya-dir-320
3. http://4e2e.blogspot.ru/2013/04/d-link-dir-320-a1.html
4. http://h-wrt.com/ru/doc
5. http://dipcore.com/

Тестирование Domolink Open IPTV. Домолинк. Открытое ТВ


Открытое ТВ провайдера Домолинк

Связка из adsl-модема Zyxel 660RT2, роутера Mikrotik RB951G-2HnD.
ADSL-модем подключен мостом к роутеру. На роутере устанавливается PPPoE соединение с провайдером Ростелеком.

1. Настройка ADSL-модема.
В adsl-модеме необходимо настроить второе bridge-соединение (rfc-1483) с параметрами: LLC, VPI=8, VCI=35, на вкладке WAN.
Помимо этого, на модеме должен быть включен протокол IGMP и все связанные с ним опции (IGMP v2, IGMP snooping)

2. Используется обычная программа VLC и список воспроизведения предоставленный провайдером.

Выводы


Телевидение можно смотреть, если модем подключен напрямую к компьютеру (мостом). При использовании роутера, часто возникают сбои, да и качество вещания не очень хорошее, бывает и лучше.
Жаль, а так хотелось видеозапись подключить.

Ресурсы

Описание услуги Открытое ТВ на сайте провайдера. http://www.voronezh.rt.ru/homeinternet/fast_internet/opentv
Список каналов. http://www.voronezh.rt.ru/data/addons/playlist_vr.m3u
Форум БВФ по услуге "Открытое ТВ". http://bvf.ru/forum/showthread.php?t=561341

6to4 IPv6 tunnel на Mikrotik RB951G-2HnD

Настройка IPv6 в домашней сети


Желание передать большой семейный видеофайл частным образом с помощью torrent-протокола привело к понимаю, что необходимо настроить наконец-то белую адресацию домашнего компьютера и перестать мучаться.
Провайдеры в России уже начинают предоставлять доступ по протоколу ipv6, в том числе и мобильные провайдеры, так что можно уже начинать.

Mikrotik для удобства поддерживает переходный механизм 6to4, что даёт возможность установить ipv6-подключение, пока провайдеры тестируют свои сети.
В процессе экспериментов с подключением, чтением справки и руководств, выработалась некая последовательность действий, которая и будет тут приземлена.

Что-бы данная заметка смогла помочь, требуются некоторые условия.

1. Провайдер сети Интернет должен выдавать маршрутизируемый(routed) адрес на интерфейсе подключения, т.е. выдавать "белый" ipv4-адрес. В данной заметке провайдер, а им оказался Rostelecom, подключает по технологии ADSL.
2. Желательно статический маршрутизируемый ipv4 адрес, но может подойти и динамический.

Особенности моего подключения получились следующие:
1. Динамический маршрутизируемый IPv4-адрес.
2. Переподключение каждые 24-часа. Пока не определил, меняется ли адрес или нет. Буду исходить из того, что меняется.

3. Проверить доступность важного ipv4-адреса: 192.88.99.1. Это anycast адрес, который сообщает туннельному клиенту (нашему роутеру) адреса шлюзов IPv4-IPv6.

На Ubuntu:

$ ping 192.88.99.1

На Микротике:

> /ping 192.88.99.1


При использовании трансляции адресов и маскарада (NAT & masquerade) на стороне провайдера, когда IPv4-адрес выдаётся из диапазона немаршрутизируемых сетей, таких как 192.168.x.x, 10.0.0.0 и пр. данная заметка не применима, требуется иное туннельное решение. Но будет частью полезна.

Домашний роутер может быть любой с поддержкой IPv6. Обычно они строятся на платформе Linux или подобной и так или иначе используют сходный набор программ для обслуживания протокола IPv6. Однако Mikrotik RouterOS даёт некоторые возможности управления настройками с помощью пользовательских скриптов, а это важно в случае динамического IPv4-адреса, настройка меняется с помощью скрипта. Также спокойно подойдут и открытые прошивки. Можно посмотреть настройки IPv6 в DD-WRT и Open-WRT.



Простейшее ручное подключение и настройка 6to4 туннеля на маршрутизаторе Mikrotik RB951G-2HnD

Я обновил прошивку роутера, скачав её с сайта производителя и положив в меню "Файлы", после перезагрузился и система RouterOS стала версии 6.7.


1. Итак, в меню роутера Микротик RB951G-2HnD "Interface", надо добавить новый интерфейс туннельного подключения 6to4tunnel, указав в качестве важного свойства "local-address" - текущий ipv4-адрес интернет-соединения, которое должно быть поднято. Свойство Remote-address  заполнить anycast ipv4-адресом 192.88.99.1. Указать MTU=1280.
Если заполнить, то появляется автоматический IP-адрес, из диапазона автоконфигурации, FE80::, вида: FE80::XXXX:XXXX/64.
Таблица маршрутов ipv6 пока пустая.


Итак, для примера, внешний IP-адрес интернет подключения: 77.88.01.239


Можно сделать из консоли:

/interface 6to4 add name=ipng disabled=no local-address=77.88.01.239 remote-address=192.88.99.1 mtu=1280

2. Сформировать и добавить в ручную переходный IPv6-адрес, для туннельного подключения и внести его в меню IPv6/Addresses, привязав к интерфейсу туннельного подключения.
Переходный IPv6-адрес, получен полным отражением полной адресной сети IPv4 (а это 4M адресов) в подсеть IPv6, с префиксом 2002:, если я в правильно выразился.
Формируется так - 32 битный IPv4 адрес преобразуется в шестнадцатиричный вид и укладывается после префикса 2002:, который зарезервирован, при этом соблюдая текстовую нотацию.
Т.е. адрес вида 77.88.01.239 - XXXX:XXXX
Получаем префикс 2002:XXXX:XXXX::/48

Этот префикс будет присутствовать у всех устройств домашней сети. А при изменении внешнего IPv4-адреса, также будет соответственно изменяться, но на роутере это надо будет автоматизировать, поскольку туннель 6to4 всё же любит статические IPv4-адреса. Делаться изменения будут пользовательским скриптом.

Также стоит заметить, что на подсеть (subnet prefix) остается 16 бит (а это 65536 подсетей, от 0 до FFFF).



В консоли:
/ipv6 address add address=2002:XXXX:XXXX::1/16 advertise=no comment=6to4public disabled=no eui-64=no interface=ipng

Т.к. за основу своего скрипта, я взял существующий какой-то скрипт, то метка 6to4public используется в комментарии, чтобы скрипт мог определить, какой адрес менять.

В таблице маршрутов появлятся динамический маршрут 2002::/16, а ipng для него шлюзом.

[admin@MikroTik] >> ipv6 route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 #      DST-ADDRESS              GATEWAY                  DISTANCE
 0 ADC  2002::/16                ipng                            0

Добавленный адрес, пока не доступен извне.


3. Также надо прописать хитрый шлюз, в спец.формате.

/ipv6 route add disabled=no distance=1 dst-address=2000::/3 gateway=::192.88.99.1%ipng


::192.88.99.1 - это специальный формат IPv6-адреса, т.н. "IPv4-Compatible IPv6 Address".

%ipng указывает через какой интерфейс оно доступно. Через наш туннель.


Префикс 2000::/3 - это весь IPv6 интернет. Он попал в подсеть с этим префиксом, что сузило адресное пространство до 125 бит, а остальное как я понял - зарезервировано.


4. Сформировать и добавить вручную подсеть для домашних ipv6-устройств, таких как Windows, Ubuntu, чтобы они все получили маршрутизируемые IPv6 адреса, доступные из сети Интернет, по протоколу IPv6, через туннель 6to4.

2002:IPv4:Местный префикс::1/64

/ipv6 add address=2002:XXXX:XXXX:1::1/64 advertise=yes comment=6to4subnet disabled=no eui-64=no interface=bridge-local

Здесь важна опция  advertise=yes, чтобы встроенная программа radvd в RouterOS начала выдавать префикс (2002:XXXX:XXXX:1:) клиентам сети, которые на основе этого префикса автоматически сформируют белые маршрутизируемые IPv6 адреса. Эта опция влияет на появление динамического префикса в списке меню /ipv6 nd prefix.


Конечная цель всего этого - сделать так, чтобы клиенты домашней сети, получили доступ в IPv6 автоматически. Простая цель, а сколько тонкостей, а всё из-за того, что подзадержались провайдеры с поддержкой IP New Generation.
Цитата
"RouterOS has Ipv6 Neighbor Detection and stateless address autoconfiguration support using Router Advertisement Daemon (RADVD)".
Т.е. в принципе, не нужно включать DHCPv6 сервер, хотя клиентам Windows может понадобиться.


5. Маршрут на всё
Добавить маршрут ::/0 через шлюз ipng.
[admin@MikroTik] /ipv6 route> print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, o - ospf, b - bgp, U - unreachable
 #      DST-ADDRESS              GATEWAY                  DISTANCE
 0 A S  ::/0                     ipng                            1
 1 A S  2000::/3                 ::192.88.99.1%ipng              1
 2 ADC  2002::/16                ipng                            0
 3 ADC  2002:XXXX:XXXX:1::/64    bridge-local                    0

Из-за отсутствия этого маршрута, могут быть проблемы с доступностью IPv6 серверов.



На этом шаге, из консоли роутера (ssh command console), можно выполнить пробу любого ipv6-адреса (команда ping) и IPv6 сеть должна быть доступна.
Также извне, можно попробовать достучаться до адреса роутера, присвоенного интерфейсу туннеля (ipng). Я использовал сайт [3].

NOTE: Имеет смысл перезагрузиться и поправить адреса, в соответствии с новыми IP wan-интерфейса. Перезагрузка нужна, если туннель подключается, но пинги не ходят и извне нельзя достучаться по протоколу ipv6.

Из интересных IPv6-адресов:
2001:4860:4860::8888
2001:4860:4860::8844
Это публичные DNS-сервера Google.

Команда Ping (по протоколу IPv6) в выполняется в Mikrotik следующим образом:

> ping 2001:4860:4860::8888

либо при рабочем преобразовании имён:

> ping [:resolve ipv6.google.com]

Надо получить правильные таблицы маршрутов на клиентах и на роутере,
правильные доступные DNS-сервера.
Можно сделать это 2 путями, с помощью RADVD либо DHCPv6.

RADVD - Router Advertisement Daemon
Простейшее встроенное средство рекламы роутера в сети, на основе которого домашние компьютеры (умеющие это) смогут сформировать свои адреса, получить DNS сервера и полностью стать готовыми для работы в сети IPv6.

Во многих случаях, этого будет достаточно. Это называется Stateless Autoconfiguraton.

Однако, есть и Statefull autoconfiguration которое выполняется DHCPv6 сервисом.


6. DNS

IPv6 без преобразования доменных имен не очень удобно для доступа.
С этим конечно есть некоторые трудности, преодолимые.


IPv6-адреса DNS серверов, могут выдаваться роутером с помощью radvd, либо по протоколу конфигурации хоста DHCPv6.

Чтобы указать выдаваемые клиентами ipv6-адреса DNS серверов, можно их добавить в меню "IP/DNS". Указать их в ipv6-формате.

IPv6 DNS сервера в меню IP/DNS Mikrotik
Надёжное функционирование DNSv6 я ещё не исследовал более подробно, так что могут быть ошибки в конфигурации. Да и вообще, микротик ещё та запутанная штука.




Специальные адреса IPv6

1. Клиент (хост) может выполнить команду Ping на адрес: FF02::1 , чтобы найти доступные компьютеры в локальной сети (один широковещательный домен, один хаб, свитч).

На микротике:
[admin@MikroTik] /ping FF02::1

На Ubuntu:
$ ping6 FF02::1%eth0

указывая интерфейс через который надо искать, т.к. адрес немаршрутизируемый.

2. Доступный адрес FF02::2. Список ipv6-адресов роутеров.
Найти роутеры в локальной сети, которые себя рекламируют (Router advertisement) в данном подключении.
Обычно один, но бывает и несколько.


3. FC00::/7 ULA's. Uniq local addresses. Уникальные локальные адреса
Этот префикс можно использовать для статического конфигурирования неприсоединенной IPv6 сети.


4. FE80::/10. Автоматически присваиваемый каждому аппаратному и неаппаратному интерфейсу IPv6-адрес. Т.н. Link-local.
Позволяет сразу обеспечить связь компьютеров.


Тестирование доступности IPv6 сети на клиенте

Перейти по адресам:
test-ipv6.com
ipv6.nic.ru

Ubuntu

ipv6.google.com - спец.сайт, доступный как видно ниже, только по протоколу ipv6.

$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:4010:c03::6a


Если DNS преобразование имён доступно, то можно проверить:
$ ping6 ipv6.google.com
$ traceroute6 ipv6.google.com



Windows Vista, 7 и т.п.

В свойствах соединения должен быть включен протокол ipv6.


> ping -6 ipv6.google.com



Настройка файрволлов на клиентах

Т.к. компьютеры с поддержкой протокола IPv6 становятся доступными из сети Интернет, то требуется настроить Firewall, на каждом IPv6-подключенном устройстве. Базовые правила можно также настроить и на роутере.
Например, не принимать входящие соединения. Однако может отвалиться ping (icmpv6), если не предусмотреть разрешение.


Отладка

Т.к. технология новая, как работает IPv6 на Mikrotik не совсем понятно, то если что-то не работает, надо начинать с чистого листа - удалить добавленное и перезагрузить роутер, затем начать заново.
Пошагово.
Ещё не все зависимости и особенности выявлены.

Отлаживать скрипты на Mikrotik - это вообще "за гранью".
Основные трудности начинаются после смены динамического ipv4-адреса. Тут вступает в работу скрипт, которые я пока отлаживаю.


Помните, т.к. IPv6-адреса клиентов могут меняться очень часто, при автоподключении, то при использовании внешних утилит, проверяйте каждый раз задаваемый IPv6-адрес.Не используйте извне адреса, содержащие MAC-адрес. Не пытайтесь извне пробовать (ping) автоматические link-local адреса, начинающиеся с префикса FE80:/10, они работают только на конретных линках.

Пример трассировки компьютера, с помощью внешнего сервиса http://www.wservice.info/

1 ipv6.wservice.info 0.965 ms 32.612 ms 0.901 ms
2 2a01:230:3::1 0.568 ms 0.627 ms 0.503 ms
3 khouse-tr1.tcinet.ru 2.660 ms 2.567 ms 2.770 ms
4 KHOUSE-TR2.TCINET.RU 2.331 ms 3.927 ms 2.295 ms
5 * * *
6 2002:XXXX:XXXX::1 39.618 ms 38.146 ms 38.525 ms
7 2002:XXXX:XXXX:1:XXXX:XXXX:XXXX:XXXX 39.453 ms 41.635 ms 39.016 ms


Видно, что щупальце добралось до публичного адреса роутера, а затем полезло в домашний компьютер.

Заметил, что в Ubuntu куда-то часто пропадают IPv6-адреса, и компьютер отваливается от ipv6-сети. Проходит время и опять появляются адреса, уже частично другие. Dmesg команда показывает, что периодически Ethernet-интерфейс уходить в down, а затем поднимается опять. Это что-то видимо Network Manager в Gnome. Короче глючки. Когда ipv6-адреса появляются, то становиться доступным и сеть. Какие-то частые переподключения.

Windows 7 также очень часто обновляет IPv6 адреса. Это было у меня установлено время жизни маленьким, на время отладки (несколько минут).

Похоже это связано с временем жизни префикса:
[admin@MikroTik] /ipv6 nd prefix> print
Flags: X - disabled, I - invalid, D - dynamic
 0  D prefix=2002:XXXX:XXXX:1::/64 interface=bridge-local on-link=yes
      autonomous=yes valid-lifetime=2h preferred-lifetime=1h

Свойство autonomous=yes - это значит параметры будут раздаваться в RA-сообщениях.

2 часа - это 7200 секунд, 1 час соотв. 3600 сек.
Итак, Preffered-lifetime - это основное время жизни префикса (и адреса). В течении этого интервала времени, с этим адресом можно устанавливать новые (NEW) соединения и спокойно обмениваться пакетами. По истечении этого интервала, новые соединения уже нельзя, но существующие ещё можно.
Valid-lifetime можно сделать чуть больше, чем Preffered-lifitime.


Вывод сконфигурированных адресов на Linux host. Видны заданные параметры времени жизни адресов, которые уменьшаются со временем (при повторном запуске команды):
$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: home: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2002:XXXX:XXXX:1:xxxx:xxxx:xxxx:xxxx/64 scope global temporary dynamic
       valid_lft 6878sec preferred_lft 3278sec
    inet6 2002:XXXX:XXXX:1:xxxx:xxff:fexx:xxxx/64 scope global dynamic
       valid_lft 6878sec preferred_lft 3278sec
    inet6 fe80::xxxx:xxff:fexx:xxxx/64 scope link
       valid_lft forever preferred_lft forever 
У интерфейса home (переименованный eth0) видны автосконфигурированные ipv6-адреса, как на основе MAC-адреса, так и произвольный (в соответствии с Privacy Extensions), он помечен меткой temporary.
Зная MAC-адрес интерфейса (записав его куда-нибудь), зная принцип формирования префикса, можно извне достучаться до домашнего компьютера. Однако, это очень не полезно, т.к. если временный адрес, замучаются перебирать, то по MAC-легко будет добраться до компьютера.
И как я понимаю, со временем, будут сформированы базы данных MAC-адресов, если эти адреса будут передаваться по сети (в силу различных причин, например, указав однажды в качестве пункта назначения).

scope global - видимость глобальная
scope link - видимость в пределах соединения (link-local).

Шестая версия NMap (v6) поддерживает IPv6 полностью.
$ nmap -6 -Pn 2002:XXXX:XXXX:1:XXXX:XXXX:XXXX:XXXX
Starting Nmap 6.00 ( http://nmap.org ) at 2014-01-08 17:33 MSK
Nmap scan report for cetonia (2002:XXXX:XXXX:1:XXXX:XXXX:XXXX:XXXX)
Host is up (0.00027s latency).
Not shown: 998 closed ports
PORT    STATE SERVICE
139/tcp open  netbios-ssn
445/tcp open  microsoft-ds

Вот и видно, что SAMBA (SMB/CIFS) висит на своих портах и доступна по протоколу ipv6 (это лучше видно с добавочной опцией -sV).


Скрипт автообновления

Скрипт для автоматического обновления ipv6-адресов, если wan-интерфейс имеет белый динамический ipv4-адрес. Если серый, то ничего не будет работать. Я нашёл в инете какой-то скрипт, который у меня не работал и переделал под свои условия. Получился длинный, т.к. скриптовый язык Mikrotik не очень развит, отсутствуют многие функции (преобразование в шестнадцатиричный вид), которые пришлось написать.
Важную роль играет комментарий к ipv6-адресу, по которому этот скрипт находит его, чтобы изменить префикс.
Его надо запускать, после того как сформированы ipv6 адреса, и поднят туннель 6to4, и сеть ipv6-работает.

Вот такой костыль. Выделять куском и вставлять в окно скриптов.
А потом добавить в расписание запуск этого скрипта, с определённым интервалом. (10 минут или по желанию).

Микротику надо задуматься об добавлении функций в скриптовый язык.

# IPv6 6to4-tunnel endpoint update script
# Automatic update IPv6 address of 6to4 tunnel endpoint when internet connection IPv4 address changed (reconnect)
# Applicable for pppoe (adsl) connection and l2tp with dynamic routed IPv4 address
# Periodic (according setting sheduler) check internet connection IPv4 address and update tunnel endpoint when needed
# Host: router, Mikrotik
# Date: 25.02.2014
# RU: http://gimmor.blogspot.com/2014/01/6to4-ipv6-tunnel-mikrotik-rb951g-2hnd.html

# NOTE: if wan interface down or tunnel disabled then nothing happen.

:local waninterface;
:local 6to4interface;
:local wanaddress;
:local PubAddrComment;
:local SubnetAddrComment;

# IPV4 provider internet connection with routed (white) IPv4 address available on waninterface
:set waninterface "wan";

# 6to4 tunnel
:set 6to4interface "ipng";


# The special lables within comments of ipv6 address needed for script update
:set PubAddrComment "6to4public";
:set SubnetAddrComment "6to4subnet";


# START MAIN LOGIC

:log info "IPv6 6to4-tunnel endpoint update script start...";

:local wanup;
:local ipngup;

# needupdate - flag meens prfixes update needed
# default - false no need update
:local needupdate false;

# Check interfaces up and running
:set wanup (:put [/interface get [/interface find name=$waninterface] running; ]);
:set ipngup (:put [/interface get [/interface find name=$6to4interface] running; ]);

:log info "Wan Interface state: $wanup";
:log info "IPv6 tunnel interface state: $ipngup";

# STARTIF
:if (wanup) do={
:log info "IPv6. WAN interface $waninterface up and running"
:if (wanup && ipngup) do={
:log info "IPv6 tunnel seems to be up and ready to update endpoint";
# Update 6to4 tunnel connection when address changed
:set wanaddress [/ip address get [/ip address find interface=$waninterface] address];
:set wanaddress [:pick [:tostr $wanaddress] 0 [:find [:tostr $wanaddress] "/"]];
#:log info [:put $wanaddress];
:local tunnellocaladdress;
:set tunnellocaladdress [:put [/interface 6to4 get [/interface 6to4 find name=$6to4interface] local-address]];
#:log info $tunnellocaladdress;
:if ($tunnellocaladdress!=$wanaddress) do={
:set needupdate true;
:log info "IPv6. Need update 6to4 tunnel endpoint local-address";

# Disable addresses and tunnel interface prior changes
/ipv6 address disable [find comment=6to4public]
/ipv6 address disable [find comment=6to4subnet]
/interface 6to4 disable $6to4interface;

/interface 6to4 set ($6to4interface) local-address=$wanaddress;
:log info "IPv6. 6to4 tunnel endpoint updated with new local-address $wanaddress";
} else={
:log info "IPv6. No need update 6to4 tunnel endpoint local-address.";
:log info "IPv6. Current tunnel local-address $tunnellocaladdress and WAN address $wanaddress";
}
} else={
:log info "IPv6. 6to4 tunnel $6to4interface needed to be enabled";
}
} else={
:log info "IPv6. IPv4 internet connection (WAN interface) $waninterface must be enabled";
}
# ENDIF




:global toHexDigit do={
:local hexsym;
:set hexsym "0";
:if ($digit < 10) do={ :set hexsym (:tostr $digit); }
:if ($digit = 10) do={ :set hexsym "a"; }
:if ($digit = 11) do={ :set hexsym "b"; }
:if ($digit = 12) do={ :set hexsym "c"; }
:if ($digit = 13) do={ :set hexsym "d"; }
:if ($digit = 14) do={ :set hexsym "e"; }
:if ($digit = 15) do={ :set hexsym "f"; }
:return $hexsym;
};

# Transform ipv4 address into specifix ipv6 address with 2002: prefix and bind to 6to4interface
# 2002:XXXX:XXXX::1
# XXXX:XXXX - a hexadecimal form of public "routed" WAN address stored in wanaddress variable

:local 6to4prefix;
:set 6to4prefix "2002:";

#:log info "STARTF";
{
:local outstr;
:set outstr "";
:local dotpos;
:local numer;

:for i from=1 to=3 do={
:set dotpos [:find $wanaddress "."];
:set numer [:pick $wanaddress 0 $dotpos];
:set wanaddress [:pick $wanaddress ($dotpos + 1) 16];
:if (i=1) do={
 :set outstr ([:put $numer]);
} else={
 :set outstr ([:put $outstr] . "," . [:put $numer]);
};
};
:set outstr ([:put $outstr] . "," . [:put $wanaddress]);
#:log info [:put $outstr];

# Translate array of decimal values into hex values within array
:local octets;
:set octets [:toarray $outstr];
:local j;
:set j (1);
:local outstr;
:foreach octet in=$octets do={
 :local output;
 :local left;
 :local right;
 :local leftsym;
 :local rightsym;
 :set left ($octet / 16);
 :set right ($octet - ($left * 16));
 :set leftsym [:put [$toHexDigit digit=$left]];
 :set rightsym [:put [$toHexDigit digit=$right]];
 :set output ([:put $leftsym] . [:put $rightsym]);
# :log info ([:put $octet] . [:put $output]);
 :if (j=1) do={
  :set outstr ([:put $output]);
 } else={
  :set outstr ([:put $outstr] . "," . [:put $output]);
 };
 :set j ($j + 1);
# :log info [:put $outstr];
};
:local hexoctets;
:set hexoctets [:toarray $outstr];
#:log info [:put $hexoctets];

# Translate array of hex values into required ip prefix
:local ippref;
:set ippref "";
:local kd;
:set kd (1);
:foreach oct in=$hexoctets do={
# :log info [:put $oct];
 :set ippref ([:put $ippref] . [:tostr $oct]);
 :if (kd=2) do={ :set ippref ([:put $ippref] . ":") };
 :set kd ($kd + 1);
};
#:log info [:put $ippref];

# Forming final ipv6 prefix
:local myprefix;
:set myprefix ([:put $6to4prefix] . [:put $ippref]);
:log info ("IPv6. Global IPv6-prefix calculated: " . [:put $myprefix]);

# Update IPv6 white address of 6to4 interface (tunnel)
:foreach i in=[/ipv6 address find interface=$6to4interface] do={
:local addr [/ipv6 address get $i address];
:local cmnt [/ipv6 address get $i comment];
:local name [/ipv6 address get $i interface];
#:log info [:put $i];
#:log info ([:put $name] . [:put $addr]);
#:log info ([:put $cmnt]);
:if ($cmnt=$PubAddrComment) do={
:local newaddr ($myprefix . "::1/16");
if (needupdate) do={
[/ipv6 address set $i address=$newaddr];
 :log info ("IPv6. Changed ipv6-address of interface " . $name . " from " . $addr . " to " . $newaddr);
} else={
 :log info ("IPv6. No changes ipv6-address of interface " . $name . " from " . $addr . " to " . $newaddr);
}
};
}

# Update IPv6 white addresses for LAN

:foreach i in=[/ipv6 address find] do={
:local addr [/ipv6 address get $i address];
:local cmnt [/ipv6 address get $i comment];
:local name [/ipv6 address get $i interface];

:if ($cmnt=$SubnetAddrComment) do={
#:log info ([:put $name] . " " . [:put $addr]);
:local tmp;
:local pos;
:set tmp $addr;
:for j from=0 to=2 do={
 :set pos [:find $tmp ":"];
 :set tmp [:pick $tmp ($pos + 1) 99];
 :if ($j=2) do={
  :set pos [:find $tmp ":"];
  :local newaddr ($myprefix . ":" . [:pick $tmp 0 $pos] . "::1/64");
if (needupdate) do={
[/ipv6 address set $i address=$newaddr];
 :log info ("IPv6. Changed ipv6-address of interface " . $name . " from " . $addr . " to " . $newaddr);
} else={
 :log info ("IPv6. No changes ipv6-address of interface " . $name . " from " . $addr . " to " . $newaddr);
}
 }
}
};
};

# Check another things

};
#:log info "ENDF";

:if (needupdate) do={
:local ipv4addr [/ip address get [find interface=$waninterface] address ]
:local ipv6addr [/ipv6 address get [find comment=6to4public] address ]

# Enable interface and addresses
/interface 6to4 enable $6to4interface
/ipv6 address enable [find comment=6to4public]
/ipv6 address enable [find comment=6to4subnet]

}

:log info "IPv6 End of script Ho-Ho!";





Выводы

Удивительно, до сих пор требуется ручная настройка подключений к сети, с кучей неясных зависимостей. Ха-Ха.
6to4 штука интересная, но надо трясти провайдеров на предмет предоставления нормальной ipv6-сети.

Логика настройки роутера Микротик состоит в том, что вначале готовяться настройки нижнего уровня, а затем верхнего. Т.е. пример - вначале делается pool адресов, а затем конфигурируется DHCP на его основе.


Ресурсы
1. Setting up an IPv6 tunnel via 6to4. http://wiki.mikrotik.com/wiki/Setting_up_an_IPv6_tunnel_via_6to4
. http://www.mikrotik-routeros.com/2010/09/ipv6-and-mikrotik-using-6to4/
. http://6to4.ru/
- Тестирование связи извне по протоколу IPv6. http://www.wservice.info/
- http://wiki.mikrotik.com/wiki/Manual:IPv6_Overview
- IPv6 подключения к Микротику, по протоколу PPP. http://wiki.mikrotik.com/wiki/Manual:IPv6_PD_over_PPP
. http://blog.kladov.su/2013/11/6to4-mikrotik.html
. http://version6.ru/6to4/to-lan
- IPv6 шлюз для локальной сети. http://habrahabr.ru/post/134797/
. http://version6.ru/ip6tables
- IPv6 Address architecture. http://tools.ietf.org/rfc/rfc4291.txt
- IPv6 провайдеры. http://version6.ru/isp
. Internet Protocol Version 6 (IPv6). http://msdn.microsoft.com/en-us/library/windows/desktop/ms738570%28v=vs.85%29.aspx
Настройка IPv6 на OpenWRT. http://wiki.rnet.ru/index.php/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_ipv6_%D0%BD%D0%B0_openwrt
. http://www.mikrotik.by/index.php?showforum=1
. http://tools.ietf.org/html/rfc3056
. http://tools.ietf.org/rfc/rfc2461.txt
. http://wiki.mikrotik.com/wiki/Manual:IPv6/Address
. https://mebsd.com/ipv6-ping-and-traceroute
. http://ipv6-or-no-ipv6.blogspot.ru/2011/11/ipv6-fun-defaced.html