вторник, 29 сентября 2009 г.

Radeon 9200 - Разрешение экрана своими руками

В продолжение поста о проблемах с дравером для ATI Radeon 9200 под Windows Seven хочу рассказать о решении проблемы с разрешением экрана, которое фактически не поддерживается этой видео картой.

Итак, у нас есть видео карта ATI Radeon 9200, широкоформатный монитор Acer AL1916W с диаганалью в 19 дюймов и родным разрешением в 1440*900 точек, спецификация к видео карте, в которой говориться, что это разрешение не поддерживается.

Путь первый, зайти в дополнительные настройки экрана и в настройках монитора убрать галочку "Скрыть режимы, которые монитор не может использовать", а потом уже выбрать нужный режим, но в моем случае этот вариант не сработал, хотя драйвер монитора стоял верный, пришлось воспользоваться вторым вариантом решения проблемы.

Путь второй, запускаем редактор реестра...

Переходим в ветку HKEY_CURRENT_CONFIG\System\CurrentControlSet\Contr ol\VIDEO\, здесь находится несколько разделов в виде шестнадцатеричных кодов видео карты, если в каждом из этих разделов просматривать подраздел 0000, то можно по параметру Device Description найти нужное нам устройство, исправляем значения ключей DefaultSettings.XResolution и DefaultSettings.YResolution на необходимые, где первый ключ это разрешение по оси X, а второй по Y, следовательно 1444 и 900, а в шестнадцатеричной системе это будет 5a0 и 384.

Перегружаемся.

Читать дальше...

Windows Seven + Radeon 9200


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

Первый момент, действительно приятный, после смены железа (просто воткнул винт в другой системный блок) Windows Seven вполне успешно загрузилась, за Windows Vista не ручаюсь, но XP приветствовала бы такие перемены синим экраном. Была мать от Intel, а стала от Foxconn, хотя по характеристикам они очень похожи.

Второй момент это то, что встроенной видео карты там не было, а стаял старенький ATI Radeon 9200, который как оказалось не поддерживается ни Windows Vista ни Windows Seven.

Третий сюрприз заключался в том, что ATI Radeon 9200 не поддерживает разрешение в 1440*900 (Acer AL1916W), но это уже выяснилось в процессе поиска решения проблемы с драйверами.

Итак, Windows Seven + Radeon 9200 - установка драйвера:

  1. Скачиваем последний доступный драйвер (он для Windows XP)
  2. Запускаем установку, но она не дойдет до конца, вылетит ошибка о не совместимости с версией операционной системы.
  3. Идем в папку c:\ATI\Support\6-11-pre-r300_xp-2k_dd_ccc_wdm_38185\Driver\, туда распаковался драйвер, запускаем Setup.exe в режиме совместимости в Windows XP, устанавливаем.
  4. Не перегружаемся! Выполняем команду move %systemroot%\system32\ati2dvag.dll %temp%\ati2dvag.dll, т.е. перемещаем файл ati2dvag.dll во временную папку.
  5. Завершаем сеанс пользователя и снова входим.
  6. Возвращаем файл ati2dvag.dll на прежнее место коммандой move %temp%\ati2dvag.dll %systemroot%\system32\ati2dvag.dll.
  7. Теперь можно попробовать перегрузиться.
Если на протяжении всех этих действий не вывалился синий экран, то значит все получилось.


Решение проблемы с разрешением экрана в следующем посте.

Читать дальше...

среда, 2 сентября 2009 г.

MikroTik - Winbox & Console



MikroTik Router OS предоставляет несколько инструментов для настройки и управления системой, пожалуй, основными являются консоль (telnet, ssh) и winbox.
В этой статье я попробую рассказать про плюсы и минусы обоих методов, а так же как читать консольные команды и представлять их в виде графического интерфейса winbox.



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


Старый интерфейс

Новый интерфейс со списком устройств

В новом интерфейсе есть возможность сохранить настройки к нескольким устройствам, а так же экспортировать их в отдельный файл, но будьте внимательны, пароли очень даже легко читаются в этом экспортном файле.

Следующим шагом winbox скачивает с роутера файлы интерфейса, причем от версии к версии эти файлы меняются, так что будьте готовы к тому, что до 20мб трафика на это уйдет.

Если все нормально, то попадаем в интерфейс winbox:

интерфес к версии 2.5

интерфес к версии 2.7

интерфес к версии 2.9

интерфес к версии 3,20

Как видно от версии к версии основное меню все так же остается на прежнем месте, вертикальный список с левой стороны, оно практически полностью повторяет основное меню консольного интерфейса:

[mkt@MikroTik] >
certificate -- Certificate management
driver -- Driver management
file -- Local router file storage.
import --
interface --
ip --
ipv6 --
isdn-channels -- ISDN channel status info
log -- System logs
password -- Change password
ping -- Send ICMP Echo packets
port -- Serial ports
ppp -- Point to Point Protocol
queue -- Bandwidth management
quit -- Quit console
radius -- Radius client settings
redo -- Redo previosly undone action
routing --
setup -- Do basic setup of system
snmp -- SNMP settings
special-login -- Special login users
store --
system --
tool --
undo -- Undo previous action
user --
xen --
export -- Print or save an export script that can
be used to restore configuration
Второй уровень меню точно так же похож на консольное, в этом пожалуй, первое преимущество графического интерфейса - удовольствие кликать по меню мышкой, а если серьезно, то когда только начинаешь знакомиться с системой, то лучше что бы все доступное было перед глазами и переход от одного раздела к другому занимал секунды, пускай по началу обилие всего будет пугать и глаза будут разбегаться, но потом все встанет на свои места. К тому же если на моменте установки ограничиться только теми пакетами, которые на самом деле нужны, то количество пунктов в меню заметно уменьшится.

Практически каждое окно настроек содержит одинаковый набор инструментов:


Добавить элемент, аналогично консольной команде add.
Удалить выбранный элемент, консольная команда remove.
Сделать выбранный элемент активным, в консоле это выглядит как enable.
Сделать выбранный элемент не активным, в консоле это выглядит как disable.
Добавить комментарий к выбранному элементу (работает не на всех элементах), то же в консоле comment="".
Открывает дополнительную панель фильтрации, в консоле для тех же функций используется команда find.
Сброс счетчика пакетов и трафика для выбранного элемента, или же reset-counters.
Сброс всех счетчиков, равносильно команде reset-counters-all.
В версии 3 появляется возможность быстрого поиска.
Быстрый фильтр по типам элементов.

Рассмотрим несколько примеров работы с интерфейсом.

Добавление адреса сетевому интерфейсу:

Вводим адрес в поле Address, через "/" указываем маску, поля Network и Broadcast будут автоматически рассчитаны.

В поле Interface выбираем интерфейс, которому назначается адрес.

По нажатию на кнопку Comment можно добавить комментарий.

Кнопками Enable/Disable активируется или выключается этот адрес.

Кнопкой Copy можно продублировать запись, кнопка Remove удаляет адрес.

Тоже самое можно записать в виде консольной команды:
[mkt@MikroTik] > ip address add address=192.168.0.1/24 interface=LOCAL
comment="Local network"
Попробую представить это все вместе и разделить действие на блоки, каждому блоку назначу определенный цвет.

ОписаниеКонсоль
Добавить ip адрес 192.168.0.1 с маской 255.255.255.0 на сетевой интерфейс LOCAL и вставить комментарий "Local network"
ip address add address=192.168.0.1/24 interface=LOCAL
comment="Local network"
Winbox

Добавление правила в Firewall rules:

Разрешить трафик с адреса 192.168.0.2 на любые адреса по 80 порту, плюс добавить комментарий к правилу. Набор кнопок тот же самый, только добавляется возможность сброса счетчиков.

Теперь тоже самое, но в консоле:
[mkt@MikroTik] > ip firewall filter add chain=forward src-address=192.168.0.2 protocol=tcp
dst-port=80 action=accept comment="Allow http for server (out)"
Можно сказать, что в консоле все гораздо красивее и понятнее, практически как звучит само описание правила, так она и записана.
Но! Теперь мы сталкиваемся с ситуацией, что после добавления наше правило попадает в конец списка, это вполне нормально, если настройка идет в первый раз, набор правил уже известен, только и набирай, а если в таблице уже существует под 50 строк правил и новое добавляется где-то в середину?
В консоле на набираем:
[mkt@MikroTik] > ip firewall filter print

Flags: X - disabled, I - invalid, D - dynamic
0 ;;; Drop invalid connection
chain=forward action=drop connection-state=invalid

1 ;;; Allow established connections
chain=forward action=accept connection-state=established

2 ;;; Allow related connections
chain=forward action=accept connection-state=related

3 ;;; Allow UDP
chain=forward action=accept protocol=udp

4 ;;; Allow ICM Ping
chain=forward action=accept protocol=icmp

5 ;;; Allow all for admin
chain=forward action=accept dst-address=192.168.0.10

6 ;;; Allow all for admin
chain=forward action=accept src-address=192.168.0.10

-- [Q quit|D dump|down]

И получаем список правил, который уместился в размер окна, клавишами вверх и вниз ищем нужное место, запоминаем порядковый номер правила, после которого соответствующими командами перемещаем новое правило туда. Прямо по хакерски!
А как же обстоит дело в графическом интерфейсе?

Все просто, находим нужное место и мышкой перетаскиваем туда правило, в колонке Bytes и Packets начинают увеличиваться счетчики, значит правило заработало, так что некоторое преимущество на лицо.

Вернемся опять к нашему правилу и допустим, что нам нужно, что бы оно работало не постоянно, а только в определенные часы, на пример с 9-00 до 17-00 в будние дни. В графическом интерфейсе все очень просто, переходим на вкладку Extra и в разделе Time выставляем параметры.

А что же в консоле?
[mkt@MikroTik] > ip firewall filter add chain=forward src-address=192.168.0.2 protocol=tcp
dst-port=80 action=accept comment="Allow http for server (out)"
time=9h-17h,mon,tue,wed,thu,fri
Вот так постепенно в принципе простая команда "обрастает" множеством параметров, а если добавим сюда еще парочку, как то ограничение на подключения, обработку не конкретного адреса, а группы адресов, и получим хорошую поэму в 5-7 строк!

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

ОписаниеКонсоль
Добавить новое правило фильтрации в firewall. Разрешить исходящий трафик с адреса 192.168.0.2 любой по протоколу tcp, на 80 порт. Добавить комментарий "Allow http for server (out)". Правило должно действовать в будние дни с 9-00 до 17-00.
ip firewall filter add chain=forward src-address=192.168.0.2 protocol=tcp dst-port=80 action=accept сomment="Allow http for server (out)" time=9h-17h,mon,tue,wed,thu,fri
Winbox


Настройка DNS:

Прописать в настройках DNS в качестве первичного сервера 208.67.222.222, а в качестве резервного 208.67.220.220, а так же разрешить удаленные запросы.

Консольная команда будет выглядеть так:
[mkt@MikroTik] > ip dns set primary-dns=208.67.222.222 secondary-dns=208.67.220.220
allow-remote-requests=yes
Теперь добавим статическую DNS запись, что бы обращение к supersite.ru вели к локальному веб серверу по адресу 192.168.0.2, а так же укажем TTL для этой записи в 600сек.


Консоль:
[mkt@MikroTik] > ip dns static add name=supersite.ru address=192.168.0.2 ttl=00:
10:00
Все вместе с разделением на блоки:

ОписаниеКонсоль
Прописать в настройках DNS в качестве первичного сервера 208.67.222.222, а в качестве резервного 208.67.220.220, разрешить удаленные запросы.ip dns set primary-dns=208.67.222.222 secondary-dns=208.67.220.220 allow-remote-requests=yes
Winbox



ОписаниеКонсоль
Добавить статическую DNS запись, что бы обращение к supersite.ru вели к адресу 192.168.0.2, TTL равно 600секip dns static add name=supersite.ru address=192.168.0.2 ttl=00:10:00
Winbox

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

Пожалуй стоит отметить большой набор утилит, которые включены в MikroTik router OS. Они доступны как с графического интерфейса, так и с консоли.


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

Но все же у winbox-а есть один недостаток, он очень любит хорошие и быстрые каналы. Отображать на экране несколько десятков правил и в реальном времени обновлять значения счетчиков, да еще на нескольких экранах сразу, а добавим сюда еще монитор соединений в реальном времени и получим, что надо иметь хотя бы 1-2мб/с для таких игр, хотя если сократить количество открытых одновременно окон до одного - двух, то можно ужиться и на gps соединении.

Winbox очень помогает в настройке, возможность видеть все и сразу сильно облегчает поиск проблем в сети, но знание консольных команд тоже дорогого стоит, особенно когда поймешь, что любая команда очень легко интерпретируется в графический интерфейс (по моему на примерах выше это хорошо видно).

П
родолжение следует...
Progg it

Читать дальше...

суббота, 29 августа 2009 г.

Фотоальбом 2009/08/29



Эксперименты с HDR






Мир вокруг...








Осторожно! Злая собака... стесняется.


Доча прибежала с криками - "Я змею нашла!".

Семья!


Доча.


Жена.

Читать дальше...

четверг, 27 августа 2009 г.

C# - Захват содержимого экрана (.net 2.0)


Бывает много ситуаций, когда необходимо сделать снимок экрана, на пример при поддержке установленного программного обеспечения снимок экрана может очень сильно помочь в описании проблемы.

В этой статье мы рассмотрим как сделать снимок экрана, отобразить его, а так же сохранить на диск.



В далекие времена .NET Framework 1.0, что бы сделать снимок экрана приходилось прибегать к вызову Windows API. В .NET Framework 2.0 в пространстве имен System.Drawing и System.Drawing.Imaging появляются новые классы, которые, благодаря GDI+, позволяют работать с графикой, используя только .NET.

Для демонстрации создадим простую Windows Forms программу, которая будет получать снимок экрана, отображать его на форме, а так же при необходимости сохранять его в виде графического файла.

Разместим на форме 4-е кнопки с именами btnCapture, btnSaveJpg, btnSavePng, btnClose, один PictureBox с именем img, а так же SaveFileDialog с именем dlg.


Перейдем к коду, нам потребуется подключить пространства имен System.Drawing и System.Drawing.Imaging.

using System.Drawing;
using System.Drawing.Imaging;

Теперь нам понадобится объект Bitmap (растровое изображение), который будет использоваться для хранения снимка экрана, но т.к. он будет нужен как при самом получении изображения, так и при сохранении изображения, то лучше его сделать частью класса frmMain.

public partial class frmMain : Form
{
private Bitmap captured;

public frmMain()
{
InitializeComponent();
}
...

Далее создадим процедуру получения снимка экрана по нажатию на кнопку btnCapture. Во первых необходимо определить размер создаваемого изображения, а так же глубину цвета. Эти данные можно получить из свойств объекта Screen. В примере будет использоваться основной экран, что для варианта с одним монитором вполне годится, а в случае с несколькими мониторами необходимо использовать массив Screen.AllScreens[].

Размер изображения:

Rectangle bounds = Screen.PrimaryScreen.Bounds;

Глубина цвета - это количество бит, выделяемых на каждую точку на экране, что в свою очередь определяет количество цветов, которое может принимать эта точка. Для минимизировать использование памяти будем использовать полученное значение для создания растрового изображения:

int colourDepth = Screen.PrimaryScreen.BitsPerPixel;

Что бы использовать полученное значение глубины цвета, необходимо создать объект RixelFormat, который представляет из себя перечисление и присвоить ему соответствующее значение. Существует некоторое ограничение для значения в 8-мь бит, по этому для таких снимков экрана будет создаваться 16-и битное изображение.

PixelFormat format;
switch (colourDepth)
{
case 8:
case 16:
format = PixelFormat.Format16bppRgb565;
break;

case 24:
format = PixelFormat.Format24bppRgb;
break;

case 32:
format = PixelFormat.Format32bppArgb;
break;

default:
format = PixelFormat.Format32bppArgb;
break;

}
Теперь, зная значение глубины цвета и размера изображения, можно инициализировать объект bitmap, которому ранее было присвоено имя captured:

captured = new Bitmap(bounds.Width, bounds.Height, format);
Переходим к использованию GDI+, создадим поверхность для рисования, которая будет связана с нашим растровым изображением.

Graphics gdi = Graphics.FromImage(captured);
Ну и наконец сделаем снимок экрана, в этом нам поможет метод CopyFromScreen, в него передаются 5-ть параметров, первые два это координаты левого верхнего пикселя копируемого изображения, следующие два это координаты места вставки изображения в "холст" GDI+, последний параметр это размер копируемой области.
gdi.CopyFromScreen(bounds.Left, bounds.Top, 0, 0, bounds.Size);
Ну а теперь можно вывести полученное изображение в PictureBox на нашей форме:
img.BackgroundImageLayout = ImageLayout.Zoom;
img.BackgroundImage = captured;
Вся процедура обработки нажатия на кнопку btnCapture:
private void btnCapture_Click(object sender, EventArgs e)
{
Rectangle bounds = Screen.PrimaryScreen.Bounds;
int colourDepth = Screen.PrimaryScreen.BitsPerPixel;
PixelFormat format;
switch (colourDepth)
{
case 8:
case 16:
format = PixelFormat.Format16bppRgb565;
break;

case 24:
format = PixelFormat.Format24bppRgb;
break;

case 32:
format = PixelFormat.Format32bppArgb;
break;

default:
format = PixelFormat.Format32bppArgb;
break;
}
captured = new Bitmap(bounds.Width, bounds.Height, format);
Graphics gdi = Graphics.FromImage(captured);
gdi.CopyFromScreen(bounds.Left, bounds.Top, 0, 0, bounds.Size);
img.BackgroundImageLayout = ImageLayout.Zoom;
img.BackgroundImage = captured;
}
Теперь создадим процедуры сохранения полученного изображения в файл.
Сохранение в формате jpeg при нажатии на кнопке btnSaveJpg.
Проверяем инициализирован ли объект bitmap, если да, то открываем диалоговое окно сохранения файла в котором настроен фильтр на отображение только изображений в формате jpeg, если файл выбран, то сохраняем, используя метод Save объекта Bitmap.
private void btnSaveJpg_Click(object sender, EventArgs e)
{
if (captured != null)
{
dlg.Filter = "Jpeg image|*.jpg|All files|*.*";
dlg.Title = "Save captured screen as jpeg";
if (dlg.ShowDialog() == DialogResult.OK)
{
captured.Save(dlg.FileName, ImageFormat.Jpeg);
}
}
}
Сохранение в формате png при нажатии на кнопке btnSavePng.

private void btnSavePng_Click(object sender, EventArgs e)
{
if (captured != null)
{
dlg.Filter = "PNG image|*.png|All files|*.*";
dlg.Title = "Save captured screen as png";
if (dlg.ShowDialog() == DialogResult.OK)
{
captured.Save(dlg.FileName, ImageFormat.Png);
}
}
}

Вот и все.

Скачать исходный код примера.

Читать дальше...

понедельник, 17 августа 2009 г.

MiktoTik - Два провайдера - распределение по каналам


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

На пример веб сервер, выведенный через NAT на IP адрес первого провайдера получает запрос, а вот вероятность того, что ответ пойдет по нужному каналу уже не 100%. Какой же он после этого веб сервер?


Решить эту проблему нам поможет механизм маркировки пакетов.

Таблица MANGLE предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов.
В частности нас интересует цепочка PREROUTING, которая позволяет маркировать пакет до маршрутизации.

Попробуем разобраться с веб сервером.

Допустим у нас настроен NAT 80 порта с внешнего IP 192.168.1.116 (ISP1, первый провайдер) на 80 порт веб сервера в локальной сети и необходимо гарантировать, что все ответы, которые буду идти от веб сервера попадали на шлюз первого провайдера.


Вот правило для таблицы NAT.
[mkt@MikroTik] > ip firewall nat add chain=dstnat dst-address=192.168.1.116
protocol=tcp dst-port=80 action=dst-nat to-addresses=192.168.0.2 to-ports=80
comment="NAT 80 port from ISP1 to local web server"

[mkt@MikroTik] > ip firewall nat print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=srcnat action=masquerade out-interface=!LOCAL

1 ;;; NAT 80 port from ISP1 to local web server
chain=dstnat action=dst-nat to-addresses=192.168.0.2 to-ports=80
protocol=tcp dst-address=192.168.1.116 dst-port=80

Первым шагом создадим правило в таблице MANGLE.
[mkt@MikroTik] > ip firewall mangle add chain=prerouting  src-address=192.168.0.2
protocol=tcp src-port=80 action=mark-routing new-routing-mark=to-isp1

[mkt@MikroTik] > ip firewall mangle print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=prerouting action=add-src-to-address-list protocol=tcp
address-list=test_list address-list-timeout=0s dst-port=23

1 chain=prerouting action=mark-routing new-routing-mark=to-isp1
passthrough=yes protocol=tcp src-address=192.168.0.2 src-port=80

Пакеты с локального адреса 192.168.0.2 с 80 порта буду маркироваться как to-isp1.

Вторым шагом добавим правило в таблицу маршрутизации.

[mkt@MikroTik] > ip route add gateway=192.168.1.249 routing-mark=to-isp1


[mkt@MikroTik] > ip route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A S 0.0.0.0/0 192.168.1.249 r... 1
1 A S 0.0.0.0/0 192.168.1.249 r... 1
192.168.1.249 r...
192.168.222.1 r...
2 ADC 192.168.0.0/24 192.168.0.1 LOCAL 0
3 ADC 192.168.1.0/24 192.168.1.116 ISP1 0
4 ADC 192.168.222.0/24 192.168.222.100 ISP2 0
Все что приходит с маркером to-isp1 отправляется на шлюз первого провайдера.

Теперь усложним ситуацию, допустим второй провайдер предоставят на выгодных условиях большую локальную сеть по всему городу и через эту сеть объединены все 10 филиалов вашей фирмы. Все филиалы и офис пользуются тем же сайтом, но какой смысл ходить на него через первого провайдера, когда можно настроить доступ к нему практически локально.

В первую очередь добавляем правило в таблицу NAT, по которому все запросы, пришедшие на внешний IP адрес, который предоставляет 2-ой провайдер, на 80 порт будут переадресовываться на 80 порт локального веб сервера.
[mkt@MikroTik] > ip firewall nat add chain=dstnat dst-address=192.168.222.100
protocol=tcp dst-port=80 action=dst-nat to-addresses=192.168.0.2 to-ports=80
comment="NAT 80 port from ISP2 to local web server"

[mkt@MikroTik] > ip firewall nat print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=srcnat action=masquerade out-interface=!LOCAL

1 ;;; NAT 80 port from ISP1 to local web server
chain=dstnat action=dst-nat to-addresses=192.168.0.2 to-ports=80
protocol=tcp dst-address=192.168.1.116 dst-port=80

2 ;;; NAT 80 port from ISP2 to local web server
chain=dstnat action=dst-nat to-addresses=192.168.0.2 to-ports=80
protocol=tcp dst-address=192.168.222.100 dst-port=80


Следующим шагом добавим в таблицу MANGLE еще одно правило:
[mkt@MikroTik] > ip firewall mangle add chain=prerouting src-address=192.168.0.2
protocol=tcp src-port=80 dst-address=192.168.222.0/24 action=mark-routing
new-routing-mark=to-isp2

[mkt@MikroTik] > ip firewall mangle print
Flags: X - disabled, I - invalid, D - dynamic
0 chain=prerouting action=add-src-to-address-list protocol=tcp
address-list=test_list address-list-timeout=0s dst-port=23

1 chain=prerouting action=mark-routing new-routing-mark=to-isp2
passthrough=yes protocol=tcp src-address=192.168.0.2
dst-address=192.168.222.0/24 src-port=80

2 chain=prerouting action=mark-routing new-routing-mark=to-isp1
passthrough=yes protocol=tcp src-address=192.168.0.2 src-port=80

Пакеты с локального адреса 192.168.0.2 с 80 порта буду маркироваться как to-isp2 если они предназначены для подсети второго провайдера.

Ну и в заключении правило в таблице маршрутизации:

[mkt@MikroTik] > ip route add gateway=192.168.222.1 routing-mark=to-isp2

[mkt@MikroTik] > ip route print
Flags: X - disabled, A - active, D - dynamic,
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme,
B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A S 0.0.0.0/0 192.168.1.249 r... 1
1 A S 0.0.0.0/0 192.168.222.1 r... 1
2 A S 0.0.0.0/0 192.168.1.249 r... 1
192.168.1.249 r...
192.168.222.1 r...
3 ADC 192.168.0.0/24 192.168.0.1 LOCAL 0
4 ADC 192.168.1.0/24 192.168.1.116 ISP1 0
5 ADC 192.168.222.0/24 192.168.222.100 ISP2 0
Теперь на запросы, пришедшие со стороны первого провайдера, ответ пойдет на шлюз первого провайдера, а на запросы со стороны второго провайдера и из подсети второго провайдера ответ пойдет на шлюз второго провайдера.

Продолжение следует.

Progg it

Читать дальше...