понедельник, 19 июня 2017 г.

Настройки IPTV для роутеров Mikrotik в сети TTK

Как настроить IPTV в ТТК.

1. ОЧЕНЬ рекомендую в случае использования IPTV подключать его проводом. Иначе эфир у вас будет мягко говоря засран. Далее рассматривается схема с двумя бриджами - bridgeEthernet и bridgeWifi (конечно можно и не создавать бриджи, а оперировать сразу интерфейсами, к примеру ether2 (остальные будует подключены по master-slave) и просто wlan1), но лучше рассматривать бридж, так как есть и 2011, и мультидиапозонные роутеры (где WiFi 2.4+5). У нас будет bridgeEthernet, так как телевизор подключен проводом.

2. Устанавливаем пакет multicast.

3.
/routing igmp-proxy interface
add interface=bridgeEthernet
add alternative-subnets=0.0.0.0/0 interface=ether1 upstream=yes

В качестве апстрима выбираем физический интерфес в который у нас приходит провод от провайдера -
есть два важных момента -
а) НИ В КОЕМ СЛУЧАЕ НЕ ПППОЕ! 
б) ДОЛЖЕН БЫТЬ ОБЯЗАТЕЛЬНО НАЗНАЧЕН ЛЮБОЙ СТАТИЧЕСКИЙ АЙПИШНИК!!!

В качестве локального интерфейса выбираем нужный нам интерфейс в локальной сети. Здесь также есть нюанс - ОБЯЗАТЕЛЬНО НА ЭТОМ ИНТЕРФЕЙСЕ ДОЛЖЕН БЫТЬ НАЗНАЧЕН АЙПИШНИК!!!

То есть на обоих интерфейсах должны быть айпишники из домашних диапазонов (Из разных).
/ip address
add address=192.168.123.1/24 interface=bridgeEthernet network=192.168.123.0
add address=192.168.10.10/24 interface=ether1 network=192.168.10.0

Если IPTV нужен через WiFi - ОБЯЗАТЕЛЬНО включите MulticastHelper. Но старайтесь чтобы не потребовалось.

Также надо настроить параметры IGMP Proxy

/routing igmp-proxy
set query-interval=1m5s query-response-interval=5s quick-leave=yes

Всё. Можете проверять работу IPTV.

суббота, 14 января 2017 г.

"Колхозное" крепление Mikrotik SXT

Иногда нужно срочно устанавливать точку доступа Mikrotik SXT, причём не на мачту, а на стену. Но нормального крепления ( https://routerboard.com/QM ) нет. Да и вообще никаких креплений, кроме стандартного, нет. А магазины где можно купить что-либо для микротика далеко.

В таком случае может помочь использование такой штуки как "ответная часть петли". Стоит рублей 50. Отверстия для крепления есть. Нагрузку в виде антенны точно выдержит :) Продаётся в разных хозяйственных и строительных магазинах.


четверг, 1 декабря 2016 г.

Тестовая задача C# - создание самораспаковывающегося архива

Реализовать программу, которая создаёт самораспаковывающийся архив.

  1. Тип результирующего файла - exe.
  2. Одного файла должно быть достаточно, чтобы передать его для извлечения в другом месте.
  3. При старте спрашивает папку в которую распаковать.
  4. Сжатие любое, но должно присутствовать.
  5. Программа должна уметь создавать архив из произвольного количества папок и файлов, произвольного типа.

Сторонние библиотеки использовать нелья, только Net.Framework (любая версия на ваш выбор).


пятница, 28 октября 2016 г.

Функционал tool snmp-[get|walk] в новых версиях Mikrotik

В последнем релиз кандидате 6.38rc19 появилась интересная функция -
snmp - added basic get and walk functionality "/tool snmp-[get|walk]";

Теперь можно получить информацию о другом устройстве через snmp. Что открывает некоторые интересные возможности (можно сделать небольшой мониторинг на основе микротика).

Для примера узнать занятую память на другом микротике (с адресом 192.168.0.1 и включенным SNMP без авторизации), можно простым запросом -
tool snmp-get address=192.168.0.1 oid=.1.3.6.1.2.1.25.2.3.1.6.65536

С помощью запроса
tool snmp-walk 192.168.0.1
Мы можем получить все значения всех OID которые есть в устройстве (лучше так не делать, а выводить только нужные ИМХО)

Какие плюсы -

  • мы не ограничены ПРОИЗВОДИТЕЛЕМ, можем получать информацию и от систем Windows, Linux, Cisco и всех прочих гд реализовано SNMP.


Какие минусы -

  • я пока не понял, как положить значение в какую-нибудь переменную. Операторы put, get, set, find и прочие не работают (или я не понял как из завести, если кто знает поправьте - добавлю в описание). Как костыль записывать вывод в файл и его парсить
  • Нет реализации snmp-set, как я надеюсь пока. Потому что лично у меня есть оборудование которое его использует. 

четверг, 6 октября 2016 г.

Mikrotik: как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?

Увидел вопрос-ответ на http://spw.ru/support/voprosotvet/podklyuchenie/vopros5/
"Mikrotik 1100AH как посмотреть кто из пользователей забивает канал и как ограничить ему скорость?" и решил поделится немного другим способом.

На мой взгляд, приведённый в ответе способ через Tools-Torch не очень наглядно показывает скорость, так как там идёт разбивка по IP адресам.


Так что иногда может помочь определение "качальщика" через Simple Queue.
Создаём для пользователей нашей сети следующие правила -
/queue simple
add max-limit=1G/1G name=X220 target=192.168.0.100/32
add max-limit=1G/1G name=MainComp target=192.168.0.200/32

Далее создаём правило ограничивающее скорость для всех кто не указан в перечислении выше:
/queue simple
add max-limit=2M/2M name="All Other" target=192.168.0.0/24

Теперь чтобы увидеть кто и с какой скоростью качает можно просто смотреть в окно Queue. Причём в достаточно человекопонятном виде.


Также из плюсов можно отметить, что можно смотреть (и ограничивать) скорость не только по IP адресам, но и по подсетям (а там можно разбить к примеру по кабинетам, подразделениям или как вам удобно).

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

PS: Не забывайте, что Queue даёт нагрузку на процессор. Так что проверяйте можно или нет это использовать в вашем случае.

понедельник, 19 сентября 2016 г.

Как на mikrotik cделать фильтрацию трафика с 22:00 до 10:00

Вопрос: Как на mikrotik одним правилом сделать фильтрацию трафика с 22:00 до 10:00? На cisco без проблем. Здесь же говорит "couldn"t add new firewall rule - start time bigger than end time". Если ставить 20:00:00 и 1d 10:00:00 то говорит "Error interval". Mikrotik так не умеет или я что-то делаю не так?

Ответ: Одним правилом сделать это нельзя - mikrotik не воспринимает такие диапозоны, но есть варианты

(далее блокируется пинг до Google DNS 8.8.8.8, не забудьте удалить после тестов)

0) Стандартный способ - использовать два правила с временными промежутками 22:00:00-23:59:59 и 00:00:00-10:00:00

1) Использовать через запрет - Где-то в конце есть правило, которое запрещает, а конкретным правилом разрешать.

/ip firewall filter
add chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16 time=10h-22h,sun,mon,tue,wed,thu,fri,sat

add action=reject chain=forward protocol=icmp src-address=192.168.0.0/16

2) Использовать шедулер -
также создаём правило в файрволе, но не указываем конкретное время -

/ip firewall filter
add action=reject chain=forward dst-address=8.8.8.8 protocol=icmp src-address=192.168.0.0/16

Далее получаем номер правила с помощью
ip firewall filter print

И теперь создаём два правила шедулера -

/system scheduler
add interval=1d name=schedule1 on-event="ip firewall filter disable 1\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=10:00:00
add interval=1d name=schedule2 on-event="ip firewall filter enable 1\r\
    \n" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=sep/19/2016 start-time=22:00:00

Это даёт нам несколько преимуществ -

  1. Мы не привязаны только к правилам файрвола и можем работать с чем угодно - интерфейсы, пользователи и може делать всё что нам захочется.
  2. Если правил для фильтрации много, то в случае изменения временного промежутка нам надо поменять в ОДНОМ месте, иначе пришлось бы менять во всех где используется временной фильтр.
  3. В случае если надо выключить (или включить) фильтрацию, то можно запустить один скрипт который это всё сделает, а не менять время на интерфейсах (или на самом роутере)
  4. Более гибкая работа со временем. Можно сделать несколько разных фильтраций с разными правилами и фильтрациями.


3) Немного "костыльный" способ - через изменение текущего часового пояса - то есть если у нас Московкий часовой пояс +3, то выбираем -7, и теперь надо указывать промежуток - от 12:00:00, до 23:59:59

PS: Надо не забывать обязательно настраивать синхронизацию по времени в случае работы с учётом времени.

пятница, 12 августа 2016 г.

Небольшой хинт который поможет сберечь время и нервы.

Вводная: Есть роутер Mikrotik и хороший-стабильный провайдер. Проблема оказалось в том, что долгое время интернет не пропадал от слова вообще. И мы просто забыли телефон технической поддержки! И когда случилась проблема время реакции сильно больше запланированных. Пришлось вначале звонить в справочную, узнавать номер провайдера, где дали общий номер телефона, на котором уже дали телефон техподдержки. Чтобы уменьшить влияние такой проблемы можно сделать следующий "хинт"



PS: Также можно указать на кого зарегистрированно, номер договора, адрес и другие данные, которые могут уточнить

PS2: Это не отменяет, что желательно иметь номер техподдержки записанным в телефоне.

четверг, 23 июня 2016 г.

Небольшой FAQ про локализацию текста в приложениях при разработке в C# Mono на Linux

1. Текущий язык зависит от языка MonoDevelop, если у вас настроен анлгийский, то и язык приложений будет по умолчанию английским. Даже если сама система на русском (как и наоборот).

2. По умолчанию тип проекта "Translation Project" в списке не отображается, чтобы он появился надо включить его в Tools - Add-in Manager - Gettext Translation Support.

3. То что указано в Mono.Unix.Catalog.GetString("Hello World!") является одновременно и именем, и значением по умолчанию (которое используется, если в переводе не найдено)

4. При разработке в GTK# и использовании графической разработки, дизайнер автоматически подставляет GetString, вместо отображаемого значения.

5. По умолчанию имя ВСЕХ проектов переводов - "i8n1", можете поменять в свойствах Translation Project. Также в опциях можно указать в какой католог кидать переводы + увидеть строку для инициализации

6. Для указания где брать переводы используется команда
Mono.Unix.Catalog.Init ("i8n1", "./locale");

7. Чтобы указать в приложении конкретный язык нужно до инициализации (и назначения значений переменных) выполнить
Environment.SetEnvironmentVariable ("LANGUAGE", "ru");

8. Можно сменить язык во время работы приложения. Но для этого нужно заново указать все компоненты (для примера у нас есть три элемента label)


protected void OnButtonRUClicked (object sender, EventArgs e)
{
 Environment.SetEnvironmentVariable ("LANGUAGE", "ru");
 Mono.Unix.Catalog.Init ("i8n1", "./locale");
 nameUpdate ();
}

protected void OnButtonENClicked (object sender, EventArgs e)
{
 Environment.SetEnvironmentVariable ("LANGUAGE", "en");
 Mono.Unix.Catalog.Init ("i8n1", "./locale");
 nameUpdate ();
}

void nameUpdate()
{
 label1.LabelProp = global::Mono.Unix.Catalog.GetString ("label1");
 label2.LabelProp = global::Mono.Unix.Catalog.GetString ("label2");
 label3.LabelProp = global::Mono.Unix.Catalog.GetString ("label3");
}

9. Если после создания проекта перевода в основном проекте были добавлены компоненты которые нужно переводить, то чтобы они появились в ранее созданом проекте перевода нужно просто щелкнуть правой кнопкой на нём и выбрать "Update Translations"

10. На текст перевода распространяются ограничения обычного текста в коде. То есть спецсимволы, такие как "\" или сами кавычки нужно экранировть.

11. Вы можете в любом месте проекта сделать
string str = global::Mono.Unix.Catalog.GetString ("TestMessage");
затем сделать Update Translations и новое сообщение появится для перевода

12. В переводах допустима подстановка -
string str = global::Mono.Unix.Catalog.GetString ("Hello {0}!");
string str2 = string.Format (str, "World");

пятница, 10 июня 2016 г.

Тестовая задача на программиста C# №2

Что выведет этот код. Почему? Есть ли здесь ошибка? Если есть то какая и как исправить?

void Main()
{   
   var Ref1 = new SomeClass { Val = 111 };
   var Ref2 = Ref1;

   Ref2.Val += 1;
   
   Console.WriteLine(Ref1.Val);
   Console.WriteLine(Ref2.Val);
}

public class SomeClass { public int Val; }

понедельник, 18 апреля 2016 г.

Mikrotik и проблема с первым портом


Вводная: Новый роутер mikrotik 951Ui-2HnD. Интернет по PPPoE - приезжаем ставить к заказчику. Не работает. При прямом подключении к ноутбуку всё спокойно. Сбрасываем конфигурацию, пробуем настроить с нуля - не работает. На другом объекте никаких проблем с этим роутером нет, также в офисе все проверки проходит и везде подключается.

Решение: Изначально считали, что "глюк" провайдера, но РТК кивал на то, что
а) с ноутбука всё работает
б) если подключаешь простейший D-Link то тоже всё работает.
Ради интереса решили переткнуть в другой порт на роутере (на ether5), заработало без проблем и плясок с бубном.

Далее провели небольшое исследование и выяснили, что если переобжать кабель от провайдера по четырёхпроводной схеме (1, 2, 3 и 6 пин), то проблема уходит. При этом мультиметром на "лишних" парах никакого напряжения нет. Видимо шум, помехи или что-то ещё.

Учитывая, что первый порт это PassivePoE-In, то видимо он пытался получить питание, или конфликтовал с питанием от БП, или срабатывали какие-либо фильтры. Или ещё какие-нибудь возможные проблемы - если есть предположения - пишите в комментарии.

PS: Также подсказывают, что иногда в таких случаях, помогает замена блока питания на более мощный.

PS2: Такие же глюки (из-за БП) могут быть на оборудовании подключённом через PoE-Out порт. Если блок питания корявый или малой мощности - жди глюков.