Когда-то был сайт vadim.org.ua, который к сожалению перестал существовать. Этот блог попытка продолжить публиковать мои статьи, заметки...
среда, декабря 26, 2007
Книги по программированию и смежным областям
Англоязычные книги:
http://www.itstudy8.org/
http://knigaonline.net//BooksCatalog.aspx?category=Software%20Books
Русскоязычные книги, в основном по управлению проектами, менежменту в IT:
http://elobook.com/it/index.htm
понедельник, декабря 24, 2007
Цитаты из книги: Этот мифический "человеко-месяц"
1. Чтобы приготовить вкусную пищу,
требуется время. Если вам пришлось ждать, то лишь потому, что мы хотим лучше обслужить вас и доставить вам удовольствие.
МЕНЮ РЕСТОРАНА "АНТУАН" ВНЬЮ-ОРЛЕАНЕ
2. Для программиста, как и для повара, давление со стороны хозяина может определять
запланированный срок завершения задачи, но не может определять время ее фактического завершения. Омлет, обещанный через две минуты, может успешно жариться, но если через две минуты он не готов, то у клиента есть две возможности: ждать еще или съесть его сырым.
3. Закон Брукса:Если проект не укладывается в сроки, то добавление рабочей силы
задержит его еще больше
4. Лучше убрать из системы отдельные необычные возможности и усовершенствования и реализовать единый набор конструктивных идей, чем оснастить ее многими хорошими, но невзаимосвязанными и несогласованными идеями.
5. Как сказал Блау (Blaauw), "архитектура говорит, что должно произойти, а разработка - как сделать, чтобы это произошло".
6. Зачем нужны формальные документы?
Во-первых, необходимо записывать принятые решения. Только когда пишешь, становятся видны пропуски и проступают несогласованности. В процессе записывания возникает необходимость принятия сотен мини-решений, и их наличие отличает четкую и ясную политику от расплывчатой.
Во-вторых, посредством документов решения сообщаются исполнителям. Менеджеру приходится постоянно удивляться, что политика, которую он считал известной всем, оказывается совершенно неизвестной одному из членов его команды. Поскольку основная его работа состоит в том, чтобы все двигались в одном направлении, его главная ежедневная задача заключается в обмене информацией, а не принятии решений, и документы очень облегчат ему эту нагрузку.
7. Планируйте выбросить первую версию - вам все равно придется это сделать.
8. Постоянны только изменения
Фотозастой
Фотографу не нужно быть креативным гением, чтобы сделать интересные или художественно ценные объекты — он просто должен замечать всё интересное, что происходит в мире. Чего ему не хватает в гениальности, восполнят его субъекты. Всё, что вам надо для получения интересных фотографий — это выйти в мир и снять их.
Статью можно прочитать здесь: http://art.photo-element.ru/ps/bored/bored.html
понедельник, декабря 17, 2007
Метод BigBook для менеджера проектов
В 1996 году некая компания BigBook разрабатывала весьма продвинутый программный продукт, предвестника Google Maps. Перспективы для продукта открывались замечательные, но, как это часто бывает, команда не укладывалась в намеченные сроки запуска.
Руководитель компании совершил классическую ошибку управления, удвоив количество разработчиков в попытке ускорить завершение проекта. Программисты, однако, были продвинутые, читавшие “Мифический человеко-месяц” Фреда Брукса: Если проект не укладывается в сроки, то добавление рабочей силы задержит его еще больше. #
Как бы то ни было, попытки повторить аргументы Брукса эффекта не возымели. Тогда разработчики договорились провернуть один трюк.
К следующему совещанию каждый разработчик купил и принес с собой экземпляр книги Брукса, положив в общую стопку, повторяя руководителю: Это очень срочно! Вы должны немедленно прочесть эту книгу. Мы купили вам несколько копий чтобы вы могли читать ее быстрее.
Нужный эффект был достигнут. История, правда, умалчивает, помогло ли это завершить проект успешно.
Взято от сюда: www.developers.org.ua
пятница, августа 31, 2007
Регулярное выражение для валидации списка e-mail-ов, разделенных запятыми
Поиск в инете выдал:
((\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*([,])*)*
Проверил, регулярка работает. Может кому и сгодится :-)
Где искать фриланс работу?
http://weblancer.net/
http://www.free-lance.ru/
http://www.free-lancer.ru/
http://www.free-lancers.net/
http://www.freelance.ru/
http://www.web-lancer.com/
http://www.rentaguru.ru/
http://freelancejob.com.ua/
http://www.weblancer.com.ua
http://www.freelancejob.ru/
http://www.freelancer.com.ua/
http://dalance.ru/
http://estrabota.com.ua/freelance/
http://freelance.co.ua/ (www.freelancehunt.com)
http://www.telejob.ru/ (транслируют объявы с scriptlance.com)
Для знающих английский язык (некоторые буржуйские биржи - с платной регистрацией):
http://www.rentacoder.com/
http://www.guru.com/
http://odesk.com/
http://www.scriptlance.com/
http://www.getafreelancer.com
http://www.cgilance.com/
http://www.elance.com/
http://contractedwork.com/
http://programmingbids.com/
http://www.projectspring.com/
http://www.smarterwork.com/
http://www.freelancecenter.com/
http://www.freelancewebprojects.com/
http://www.totalfreelance.com/
http://www.homeworkers.org/
http://www.gofreelance.com/
http://www.allfreelancework.com/
http://www.freelancebbs.com/
http://www.freelancebank.com/
http://www.freelance-world.co.uk/
Взято от сюда: http://forum.sevastopol.info/viewtopic.php?t=55948
среда, мая 09, 2007
пятница, ноября 03, 2006
вторник, августа 15, 2006
Программист - начальнику отдела
Мы не можем справиться с предложенным проектом! Повторяю: НЕ МОЖЕМ! Это потребует полного изменения структуры дерева наследования, а никто в нашем отделе в ней не разбирается. Более того, никто в компании не знает даже языка, на котором это всё было написано, так что даже если кто-то и захочет этим заняться, он просто не сможет. Если Вас интересует моё мнение, наша компания вообще не должна соглашаться работать над подобными проектами.
Начальник отдела - руководителю проекта
Проект потребует изменения структуры системы. На текущий момент у нас нет сотрудников, имеющих опыт подобной работы. К тому же, язык нам не очень знаком, так что нам придётся организовать кое-какую переподготовку, если мы возьмёмся за этот проект. Если Вас интересует моё мнение, мы не готовы работать над проектами подобного рода.
Руководитель проекта - менеджеру среднего звена
Этот проект подразумевает изменение структуры, а у нас маловато опыта в этой области. К тому же, у нас в компании не так много людей, которые специально обучались таким вещам. Если Вас интересует моё мнение, мы бы смогли справиться с этим проектам, но на это у нас уйдёт немного больше времени, чем обычно.
Менеджер среднего звена - менеджеру верхнего уровня
Этот проект подразумевает пересмотр структуры. У нас есть несколько специалистов, которые работали в этой области и ещё несколько специалистов по языку реализации. Они могли бы организовать обучение персонала. Если Вас интересует моё мнение, нам стоит взяться за этот проект, но действовать нужно осторожно.
Менеджер верхнего уровня - управляющему
Этот проект даст нам возможность продемонстрировать нашу способность полного изменения структуры существующей системы. У нас есть все необходимые умения и ресурсы, чтобы успешно справиться с проектом. Некоторые сотрудники уже начали обучать других необходимым навыкам в неофициальном порядке. Если Вас интересует моё мнение, мы не должны упустить этот проект ни в коем случае.
Управляющий - клиенту
Это как раз тот тип проектов, в которых наша компания специализируется. Мы уже завершили несколько проектов подобного типа для крупных заказчиков. Поверьте, что в этой области именно мы являемся наиболее компетентными. Если Вас интересует моё мнение, мы можем выполнить этот проект успешно и в назначенные Вами сроки.
источник: http://debri.ru/c/delovaja_perepiska/
четверг, августа 10, 2006
Как учиться снимать
Самый простой способ обучения – общеизвестен, практикуется во всех армейских подразделениях и называется «делай, как я». Видишь работу мастера (он же сержант) – и пытаешься повторить. Смотришь, как у тебя получилось, вносишь коррективы, пробуешь снова, и так до тех пор, пока не получится как следует.
Ну, в художественных академиях точно так же будущих гениев дрючат: а нарисуй-ка мне вот эту каменную башку! А теперь вот эту страшную бабу голую! А теперь всё то же самое, но маслом! А если молодой гений хочет проявить себя иначе, хочет показать своё умение в изготовлении шедевров, бывалые академики сразу ставят его в позу «бегущий кабан» и прописывают хорошего пендаля – потому что сначала «делай, как я», а уже потом – шедевры.
Читать: http://www.oper.ru/news/print.php?t=1051601790
понедельник, апреля 03, 2006
Naming convention в событиях класса Page для ASP.NET 2.0
ASP.NET страница во время работы генерирует следующие события (отсортированы в порядке появления):
Page_PreInit
Page_Init
Page_Load
Page_PreRender
Page_Unload
По умолчанию чтобы связать событие с методом необходимо помнить о соглашение о наименовании (naming convention), т.е. методы, которые будут реализовать обработку событий должны называться в стиле:
Для примера, чтобы создать обработчик события Load, вы должны создать метод с именем Page_Load. В время компиляции ASP.NETнайдет методы соответствущие соглашению о наименовании и произведет автоматическое связывание этих методов и событий.
Статьи:
MSDN - ASP.NET Web Server Control Event Model.
MSDN - ASP.NET Page Life Cycle Overview.
четверг, марта 30, 2006
How get timesheet infromation from ms project database.
SELECT
w1.res_name as Lead,
p.PROJ_NAME as Project,
r.RES_NAME as Resource,
a.TASK_NAME as Task,
(w.wwork_value) / 60000 AS [Work],
w.wwork_start AS work_date
FROM dbo.MSP_WEB_RESOURCES r
INNER JOIN dbo.MSP_WEB_ASSIGNMENTS a ON a.WRES_ID = r.WRES_ID
INNER JOIN dbo.MSP_WEB_PROJECTS p ON p.WPROJ_ID = a.WPROJ_ID
INNER JOIN dbo.MSP_WEB_WORK w ON a.WASSN_ID = w.WASSN_ID
LEFT JOIN dbo.MSP_WEB_RESOURCES w1 ON a.WRES_ID_MGR = w1.WRES_ID
WHERE w.wwork_type = 1 AND w.wwork_value > 0
and r.Res_Name in (‘[FIRST_NAME LAST_NAME ]’,…., '[FIRST_NAME LAST_NAME ]')
and w.wwork_start = '[DATE]'
ORDER BY w.wwork_start DESC
Lead – Имя сотрудника, кто поддерждает времена на данной задаче;
Project – Имя проекта;
Resource –Имя сотрудника (ресурса);
Task – Имя задачи;
Work – Актуальное время (Actual Work).
Work_date – Дата.
[FIRST_NAME LAST_NAME ] - Имя и фамилия сотрудника.
[DATE] – Дата, когда сотрудник в вводил время.
понедельник, марта 27, 2006
Пример простой системы учета трафика
В рамках данной статьи мы рассмотрим простую систему учета трафика, которая должна будет обладать следующими характеристика:
Учет всего трафика проходящего через маршрутизатор работающий под ОС Linux;
Возможностью быстрого изменения конфигурации без внесения изменений в код;
Данные о трафике должны храниться в базе данных, в нашем случае мы в качестве
сервера баз данных будем использовать MySQL.
В рассматриваемом примере будем считать, что все IP адреса в нашей сети реальные.
Начнем с создания конфигурационного файла, назовем его billing.conf. Пусть он имеет следующий вид:
<******* billing.conf **************>
# Формируем список IP адресов машин или сетей, для которых мы будем считать
трафик
# Рабочее место WS1="192.168.0.1"
# Ceть нашего клиента NET="192.168.1.0/24"
# Объединим объединим все сети и адреса в один список.
ALLNETS="$WS1 $NET"
<**********************************>
В принципе формировать списки для каждого адреса или сети нет необходимости, т.к. рассматриваемая система использует только список ALLNETS, однако они могут понадобиться в случае если вам нужно будет обрабатывать статистику о каждомпользователе. Данный конфигурационный файл является единой для всей нашей системы, состоящей как минимум из трех программ:
· Программы формирования правил учета для firewall, с использованием iptables;
· Программы снятия статистики;
· Программы отображения статистики;
Рассмотрим программу формирования правил учета для firewall, названную в нашем случае rc.firewall, которую нужно будет добавить в один из файлов, который будет выполняться при загрузке системы.
Для начала немного теории, в ядрах Linux серии 2.4.X используется firewall NetFilter интерфейсом к которому является программа iptables. В NetFilter cущестуют несколько цепочек:
INPUT - все входящии пакеты, адресованные маршрутизатору,
OUTPUT - все исходящии из маршрутизатора пакеты,
FORWARD - все пересланные маршрутизатором пакеты во внешнюю сеть.
<******* rc.firewall **************>
#!/bin/bash
# Подключаем конфигурационный файл.
/etc/lbiling.conf IPTABLES="/sbin/iptables"
# Задаем путь к программе iptables ###################################
# Учет трафика ###################################
# Функция для создания правила учета addrule(){ $IPTABLES -N ACCT_IN_$1
# Создаем правило для учета входяшего трафика $IPTABLES -N ACCT_OUT_$1
# Создаем правило для учета изходяшего трафика
$IPTABLES -F ACCT_IN_$1 # Обнулим полученные цепочки
$IPTABLES -F ACCT_OUT_$1
$IPTABLES -A INPUT -j ACCT_IN_$1
# Включим учет по цепочкам $IPTABLES -A FORWARD -j ACCT_IN_$1
$IPTABLES -A FORWARD -j ACCT_OUT_$1
$IPTABLES -A OUTPUT -j ACCT_OUT_$1
$IPTABLES -A ACCT_IN_$1 -s $2 # Считать входящим трафик у которого источник адрес $2
$IPTABLES -A ACCT_OUT_$1 -d $2 # Считать исходящим трафик у которого получатель адрес $2 }
# Создаем правила для учета трафика
for NET in $ALLNETS;
do # Для всех сетей в списке $ALLNET создать правила учета трафика
addrule $NET $NET
done
<**********************************>
После выполниния нашей программы rc.firewall, набрав в консоле:
# iptables -L
Вы должны будете увидеть нечто подобное:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCT_IN_192.168.0.1 all -- anywhere anywhere
ACCT_IN_192.168.1.0/24 all -- anywhere anywhere
Chain FORWARD (policy ACCEPT) target prot opt source destination
ACCT_IN_192.168.0.1 all -- anywhere anywhere
ACCT_OUT_192.168.0.1 all -- anywhere anywhere
ACCT_IN_192.168.1.0/24 all -- anywhere anywhere
ACCT_OUT_192.168.1.0/24 all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCT_OUT_192.168.0.1 all -- anywhere anywhere
ACCT_OUT_192.168.1.0/24 all -- anywhere anywhere
Chain ACCT_IN_192.168.0.1 (2 references)
target prot opt source destination all -- 192.168.0.1 anywhere
Chain ACCT_IN_192.168.1.0/24 (2 references)
target prot opt source destination all -- 192.168.1.0/24 anywhere
Chain ACCT_OUT_192.168.0.1 (2 references)
target prot opt source destination all -- anywhere 192.168.0.1
Chain ACCT_OUT_192.168.1.0/24 (2 references)
target prot opt source destination all -- anywhere 192.168.1.0/24
Создадим базу данных в MySQL с названием trafficbd, для этого необходимо будет
выполнить следующий SQL запрос (как это сделать не входит в рамки нашей статьи, обратитесь к документации MySQL):
<***** База данных trafficbd.sql *****>
CREATE DATABASE IF NOT EXISTS trafficbd;
use trafficbd;
#
# Структура таблицы `traffic`
#
CREATE TABLE traffic (
id int(11) NOT NULL auto_increment,
date datetime NOT NULL default '0000-00-00 00:00:00',
ip varchar(20) NOT NULL default '',
inb int(11) NOT NULL default '0',
outb int(11) NOT NULL default '0',
KEY id (id)
) TYPE=MyISAM;
<**********************************>
Итак, подведем итоги, мы создали базу данных, написали правила учета трафика,
теперь нам надо паписать программу, которая бы снимала полученную статистику, заносила её в базуданных и после этого обнуляла бы счетчики. Ниже приведен пример такой программы, её можно прописать в CRON и вызывать с некоторым периодом.
<**********************************>
<#!/usr/bin/perl
# Функция занимающаяся сбором и внесением данных в БД.
sub account {
$name=$_[0];
# Имя правила
$IP_IN=0;
# Инициализация счетчиков
$IP_OUT=0;
# Командная строка MySQL для внесения данных в таблицу.
$mysqlcommand="/usr/bin/mysql -hlocalhost trafficbd -e";
# Снимем данные со счетчика входящего трафика и обнулим
$ipstuff=`/sbin/iptables -L -Z ACCT_IN_$name -v -x`;
# Выделим из вывода предыдущей команды значение счетчика
@IPTBMASS=split(/\n/,$ipstuff);
chomp $IPTBMASS[2];
$string=$IPTBMASS[2];
$string=~ s/\s{1,}/ /g;
@INFOMASS=split(//,$string);
$IP_IN=$INFOMASS[2];
# Снимем данные со счетчика исходящего трафика и обнулим
$ipstuff=`/sbin/iptables -L -Z ACCT_OUT_$name -v -x`;
# Выделим из вывода предыдущей команды значение счетчика
@IPTBMASS=split(/\n/,$ipstuff);
$string=$IPTBMASS[2]; $string=~ s/\s{1,}/ /g;
@INFOMASS2=split(/ /,$string);
$IP_OUT=$INFOMASS2[2];
# Получим текущее время
($min, $hours, $day, $mounth,$year) = (localtime)[1,2,3,4,5];
$time=$hours.":".$min.":00";
$mounth=$mounth+1; $year=$year+1900;
$date=$year."-".$mounth."-".$day;
# Формируем SQL запрос
$sql="insert into traffic values('','".$date."
".$time."','".$name."','".$IP_IN."','".$IP_OUT."');";
# Выполняем его `$mysqlcommand "$sql"`;
}
# На этом функция account заканчивается:)
# Основая программа $config=`./lconfreader.sh`;
# Прочитаем конфигурационный файл.
Ниже приводится текст скрипта lconfreader.sh:
#
#!/bin/bash # . ./lbiling.conf
# Включить конфигурационный файл
echo $ALLNETS
# Вывести в stdout список всех сетей, покоторым ведется учет .
chomp $config;
@NETMASS=split(/ /,$config);
foreach $nets(@NETMASS)
{
# Для каждого элемента списка, выполнить функцию
account account $nets;
}
<**********************************>
Вот собственно и вся биллинговая система:)
Как послать письмо с аттачем из shell
mpack -s "$SUBJECT" -c application/octet-stream $ATTFILE $MAILTO
mutt -a $ATTFILE -s "$SUBJECT" $MAILTO < $TXTFILE
Настройка сетевых интерфейсов и машрутизация с помощью пакета iproute 2
Большинство дистрибутивов Linux, впрочем как и UNIX для настройки
сети и маршрутизации используют команды ifconfig, arp и route.
Однако в Linux, начиная с ядра 2.2 была полностью переделана сетевая
система и были добавлены новые возможности, которые ранее требовали
дополнительных утилит, такие как маршрутизация на основе правил,
управление трафиком и т.д. К этим возможностям предоставляет доступ пакет
программ iproute2, который в настоящее время входит в большинство
современных дистрибутивов.
Утилита ip объединяет в себе возможности команд ifconfig, arp и route,
рассмотрим синтаксис команды:
ip [Опции] Объект [ Команда [Аргументы команды] ]
где Опции - опциональные параметры, который влияют на общую работу утилиты
или вывод результатов.
В настоящее время доступны следующие опции:
-V, -Version - выводит в стандартный вывод (stdout) версию программы ip
-s, -stats, -statistic - выводит статистическую информацию.
-f, - family - указывается перед идентификатором протокола, таким как inet
(IPv4), inet6(IPv6) или link (Устройстов). Служит для выбора указания
протокола, если протокол не указан, то по умолчанию протокол выбирается из
параметров команд.
-4 - аналог параметра -family inet
-6 - аналог параметра -family inet6
-0 - аналог параметра -family link
-o, -oneline - каждая запись будет выводиться на новой строке.
-r - выводить на экран символические имена хостов.
Объект - это объект которым с будут работать или получать о котором информацию.
Объекты бывают следующими:
link - сетевое устройство
address - IPv4 или IPv6 адрес на устройстве.
neighbour - ARP адреса
route - машрутизация
rule - база данных правил машрутизации
madress - Multicast-адреса представляют собой особый подвид широковещательных
адресов позволяющих обращаться к группе машин, которые не обязательно должны
быть в той же самой подсети. Они весьма полезны при сетевых голосовых
переговорах и видеоконференциях. Поддерживаются многими, но не всеми
картами Ethernet.
mroute - Multicast-пакетов.
tunnel - туннель через IP.
Команда - описывает действие над Объектом.
ip link - конфигурация сетевого устройства
Доступные команды: set и show (или list)
ip link set - изменение параметров сетевого устройства.
Аргументы:
dev - Имя интерфейса с которым будем проводить какие-то манипуляции.
up (включить) или down (выключить) - включить или выключить сетевой интерфейс.
arp on или arp off - изменяет значение флага NOARP на устройстве.
multicast on или multicast off - изменяет флаг MULTICAST на устройстве.
dynamic on или dynamic off - изменяет флаг DYNAMIC на устройстве.
name - Изменяет имя устройства
txqueuelen Число или txqlen Число - изменяет длину передаваемой очереди.
mtu Число - изменяет значение MTU на устройстве.
address Адрес - изменяет адрес на устройстве.
broadcast Адрес или brd Адрес - изменяет широковещательный адрес на
устройстве.
ip link show (list, ls, sh, lst, l)- показывает информацию об сетевом
интерфейсе.
Аргументы:
dev - Имя интерфейса с которым будем проводить какие-то манипуляции.
up - показать только включенные интерфейсы.
Примеры:
Выведем информацию о состоянии интерфейса eth0
# ip link ls dev eth0
В результате получим:
eth0: mtu 1500 qdisc cbq qlen 100
link/ether 00:04:61:92:21:1d brd ff:ff:ff:ff:ff:ff
Выведем статистику интерфейса eth0
#ip -s link ls dev eth0
2: eth0: mtu 1500 qdisc cbq qlen 100
link/ether 00:04:61:92:21:1d brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
2891892504 15070935 0 0 0 0
TX: bytes packets errors dropped carrier collsns
3139067270 54387014 0 0 0 132934
ip address - управление адресами на интерфейсе
Команда address имеет ряд псевдонимов: addr, a.
Объект address - это адрес IPv4 или IPv6 протокола, связанный с каким-то
устройством, чтобы оно могло работать с данными протоколами. Так же каждое
устройство может иметь несколько IP адресов.
Команда ip address показывает адреса, их свойства, а так же добавляет новые
или удаляет старые.
ip address add - добавляет новый адрес.
Аргументы:
dev Имя - имя устройства.
local Адрес - адрес интерфейса.
peer Адрес - адрес удаленной машины при использовании протокола PPP.
broadcast Адрес - широковещательный адрес на интерфейсе.
В этом случае вы можете использовать специальные символы "+" и "-", в этом
случае широковещательный адрес получается путем установки/сброса бит в адрес
хоста.
label Метка - каждый адрес может быть подписан строкой, однако следует помнить,
что имя должно начинаться с имени устройства, затем после двоеточия идет сама
метка.
Пример:
ip addr add 10.0.0.1/24 brd + dev eth0 label eth0:Alias
Данная команда добавляет адрес 10.0.0.1/24 с маской подсети 255.255.255.0 со
стандартным широковещательным адресом и именем eth0:Alias.
ip address delete - удаляет адреса.
Сокращения:
delete, del, d.
Пример:
ip addr del 127.0.0.1/8 dev lo
Удаляет адрес 127.0.0.1/8 с устройства lo.
ip address show - выводит информацию об адресе.
Сокращения:
show, list, lst, sh, ls, l.
Аргументы:
dev Имя - имя устройства.
to Префикс - вывести информация о адресах с заданным префиксом.
label Имя - вывести информацию об адресах с заданным именем.
Пример работы команды:
kuznet@alisa:~ $ ip addr ls eth0
3: eth0: mtu 1500 qdisc cbq qlen 100
link/ether 00:a0:cc:66:18:78 brd ff:ff:ff:ff:ff:ff
inet 193.233.7.90/24 brd 193.233.7.255 scope global eth0
inet6 3ffe:2400:0:1:2a0:ccff:fe66:1878/64 scope global dynamic
valid_lft forever preferred_lft 604746sec
inet6 fe80::2a0:ccff:fe66:1878/10 scope link
kuznet@alisa:~ $
ip route -управление таблицей машрутизации.
Сокращения:
route, ro, r.
ip route add - добавить новый маршрут
ip route change - изменить маршрут
ip route replace - заменить маршрут
Сокращения:
add, a; change, chg; replace, repl.
Аргументы:
to - назначение маршрута.
metric Число - задание метрики маршрута.
table Идентификатор таблицы - таблица связанная с маршрутом. Идентификатором
таблицы может быть номер или строка из файла /etc/iproute2/rt_tables
dev Имя - имя устройства.
via Адрес - адрес перехода к следующему маршрутизатору
src Адрес - адрес источника
nexthop NEXTHOP - следующий переход в случае если используется многоканальная
маршрутизация.
via Адрес
dev Имя - имя устройства.
weight Число - вес маршрута, определяющийся шириной канала или качеством .
Примеры:
Добавляем маршрут к сети 10.0.0/24 через 193.233.7.65
ip route add 10.0.0/24 via 193.233.7.65
Добавим шлюз по умолчанию в случае использования двух каналов в зависимости от
загрузки канала:
ip route add default scope global nexthop dev ppp0 nexthop dev ppp1
ip route delete - удалить маршрут.
Сокращение:
delete, del, d.
Аргументы:
Аргументы данной команды с сходны с ip route add.
Пример:
Удаляем маршрут созданный в предыдущем разделе.
ip route del default scope global nexthop dev ppp0 nexthop dev ppp1
ip rule - управление правилами машрутизации
Сокращение:
rule, ru
Маршрутизация может производиться не только в зависимости от адреса получателя,
но и по адресу источника, IP протокола и транспортного протокола.
По умолчанию в существуют 3 правила:
Таблица Local (ID 255) - специальная таблица маршрутизации с самым большим
приоритетом, которая содержит таблицы для локальных и широковещательных
адресов.
Таблица Main (ID 254) - обычная таблица маршрутизации.
Таблица Default (ID 253) - пустая по умолчанию таблица.
ip rule add - добавить новое правило.
Ip rule delete - удалить правило.
Сокращения:
add, a; delete, del, d
Аргументы:
from - адрес источник
to - адрес получателя
iif Имя - имя интерфейса с которого будет получен пакет
fwmark Метка - метка пакета, устанавливаемая firewall.
table Идентификатор таблицы - таблица связанная с маршрутом. Идентификатором
таблицы может быть номер или строка из файла /etc/iproute2/rt_tables
priority Число- приоритет таблицы.
Примеры:
Маршрутизировать пакеты с сети 192.203.80.0/24 согласно таблицы example.
ip ru add from 192.203.80.0/24 table example prio 220
Рассмотрим примеры использования маршрутизации на основе правил.
1. Пусть у нас есть два канала в интернет: быстрый модем с IP адресом
212.64.94.251 связанный PPP c 212.64.94.1 и медленный c 212.64.78.148
связанный PPP c 195.96.98.253. Надо пакеты одного пользователя отправлять
через медленный модем. Для этого сформируем новое правило:
# echo 200 User >> /etc/iproute2/rt_tables
# ip rule add from 10.0.0.10 table John
# ip rule ls
0: from all lookup local
32765: from 10.0.0.10 lookup John
32766: from all lookup main
32767: from all lookup default
Далее назначаем для этого пользователя шлюз по умолчанию и очищаем кэш таблицы
маршрутизации для того чтобы наши изменения вступили в действие.
# ip route add default via 195.96.98.253 dev ppp2 table John
# ip route flush cache
2. Необходимо направить весь трафик на 80 порт через сетую карту eth0.
Пометим пакеты идущие на 80 порт.
# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 2
Создадим правила для помеченных пакетов.
# echo 202 www.out >> /etc/iproute2/rt_tables
# ip rule add fwmark 2 table www.out
# ip route add default via 10.0.0.2 dev eth0 table www.out
# ip route flush cache
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ:
1. IP Command Reference Alexey N. Kuznetsov
2. Linux Advanced Routing & Traffic Control HOWTO




