Настройка NAT во FreeBSD

В статье описывается процесс настройки NAT’а (Network Address Translation) на простом примере предоставления доступа к ресурсам внешней сети (или интернету) из внутренней локальной сети.

В данной статье мы будем рассматривать настройку Nat на примере раздачи интернета в локальную сеть.

Итак, у нас есть сервер под управлением FreeBSD, подключенный к сети провайдера («внешняя сеть»).
Также имеется один или несколько компьютеров («внутренняя сеть»), которым нужно дать доступ к ресурсам сети интернет.
Подключить компьютеры внутренней сети напрямую к внешней нельзя, так как у нас есть всего 1 IP-Адрес во внешней сети, который выдан нашему серверу.
Выходом из ситуации будет соединение сетей через сервер (в данной ситуации всётаки «роутер» будет более правильно) при помощи технологии NAT
Предположим что сеть провайдера имеет диапазон 123.123.123.0/24, а IP который выдал нам провайдер 123.123.123.111.
Внутренняя сеть же имеет диапазон 192.168.10.0/24 и IP нашего роутера в ней 192.168.0.1
Диапазон IP адресов во внутренней сети может быть любой, однако необходимо чтобы он не пересекался с диапазонами ни в одной внешней сети.
Read the rest of this entry »

Настройка сетевых интерфейсов для разных Unix систем

В данной статье мы рассмотрим как правильно настроить сетевой интерфейс для разных Unix систем.
В качестве примера предположим что у нас есть следующие данные:

IP address : 192.168.10.14, 192.168.10.15
Mask : 255.255.255.0
Gateway : 192.168.10.1
DNS : 192.168.10.3
DNS : 192.168.10.2

Итак приступим:
Для операционной системы FreeBSD:
В конфигурационный файл /etc/rc.conf добавляем:

# Основной адрес
ifconfig_rl0="inet 192.168.10.14 netmask 255.255.255.0"
# Основной Шлюз
defaultrouter="192.168.10.1"
# Алиас
ifconfig_rl0_alias0="inet 192.168.10.15 netmask 255.255.255.0"

rl0 — название сетевого интерфейса который настраиваемого мы настраиваем.

После того как Вы сохранили файл нужно перезагрузить сеть выполнив команду

/etc/rc.d/netif restart
 Read the rest of this entry »

Проверка и оптимизация всех MySQL бд одной командой

Есть хорошая MySQL утилита, называется mysqlcheck, с помощью этой утилиты можно выполнить сразу несколько полезных операций над всеми MySQL базами данных. Команду нужно запускать от суперпользователя root.

Восстановление & Оптимизация

mysqlcheck -Aor

Только ввостановление

mysqlcheck -Ar

Только оптимизация

mysqlcheck -Ao

Описание аргументов:
-A – Проверить на ошибки все Mysql базы данных
-r – Отремонтировать все Mysql базы данных
-o – Оптимизировать все Mysql базы данных

Не ошибитесь в выборе роутера!

Очень важно: если Вы решили купить роутер от АСУСтека, то не совершите ошибки в его выборе, пытаясь сэкономить!

Модели снятые с производства:
НЕ РЕКОМЕНДУЕТСЯ покупать wl500g, wl500b, wl500b v2 из-за проблем в железе!
НЕ РЕКОМЕНДУЕТСЯ покупать wl520g из-за сильной “усечённости” в софте, связанным с маленьким объёмом флеш!
НЕ РЕКОМЕНДУЕТСЯ покупать wl530g, wl330g из-за “дешевизны” WiFi части (собраны на marvel).
РЕКОМЕНДУЕТСЯ к покупке WL500g Deluxe, как наиболее устойчивая модель.
УСЛОВНО РЕКОМЕНДУЕТСЯ к покупке WL550gE, но следует учесть, что в нём нет внешних USB портов

Модели в продаже
УСЛОВНО РЕКОМЕНДУЕТСЯ к покупке WL320gE/WL320gP (наследники WL550gE), но следует учесть, что в них нет внешних USB портов и только один проводной порт
РЕКОМЕНДУЕТСЯ к покупке WL500g Premium, как наиболее гибкая и быстрая модель в этом семействе
РЕКОМЕНДУЕТСЯ к покупке WL500W, как наиболее быстрая модель в этом семействе

Бюджетные модели в продаже:
УСЛОВНО РЕКОМЕНДУЕТСЯ WL520gC: самая простая модель
УСЛОВНО РЕКОМЕНДУЕТСЯ WL520gU: тоже самое с USB портом и принт-сервером
Эти устройства, тем не менее, вполне работоспособны и имеют в настоящий момент поддержку: http://wl500g.info/showthread.php?t=11830. Хороший выбор, если Вам нужно чтобы просто работала сеть, без лишних затрат. По быстродейтсвию устройства уступают WL500gP, WL500W, но выигрывают у большинства сравнимых по цене изделий других компаний, при этом работают стабильно, без “подвисов и перегревов”.

Модифицированная прошивка работает с: WL300g/WL500g/WL500g Deluxe/WL500b/WL500bv2/WLHDD/WL550gE/WL500g Premium/WL500W/WL320GE/GP/WL500GP v2/WL520GU/WL330gE

Табличка с характеристиками железок здесь.

Покупка ASUS WL-500G Premium – V1 vs V2 – какую версию брать?

Pinba – демон для сбора статистики о PHP-скриптах

Документация, исходники и всё остальное доступно на pinba.org.

Кратко о том, что это и для чего это:
Это демон для сбора статистики о выполнении PHP-скриптов. Статистика есть двух видов – общая (скрипт, время, rusage, объем вывода и др.) и данные по таймерам. Таймеры тут один из ключевых моментов, поэтому они достойны отдельного упоминания, см. ниже.
В то же время, это не standalone-демон, данные собираются отдельным тредом в MySQL. При этом функционал MySQL используется для доступа к данным (которые видны пользователю как обычные таблицы, только read only), т.е. для выборок можно использовать обычный SQL.
Статистика не хранится вечно, это просто невозможно, хранится только актуальная статистика (это понятие для всех разное и конечно это настраивается), так что возьмем для примера 1 000 000 последних запросов или 15 минут – т.е. хранятся все запросы за последние 15 минут, но не более миллиона записей. В зависимости от количества таймеров, эти данные могут занимать от 500Mb до нескольких Gb памяти. На диск, конечно, ничего не пишется.

Подробнее о таймерах:
Таймеры нужны для замеров конкретных частей кода. У таймеров есть “таги” для описания и группировки.
Например, есть у вас коннект к базам – оборачиваете его в таймер с тагами “operation”=>”connect”, “db”=>$dbase. В результате мы получаем статистику по одному тагу – “сколько раз в секунду у нас выполняется операция connect и сколько времени она занимает” и по двум – “сколько раз в секунду у нас выполняется операция connect к конкретному серверу и сколько она занимает”.
Тагов и таймеров может быть произвольное количество (но про разум не стоит забывать тоже, всё это доп. нагрузка на сервер).

Несколько примеров использования от Фишера: http://pinba.org/wiki/Manual:Usage_examples
Вся документация: http://pinba.org/wiki/Manual

Если вам интересно и/или есть вопросы/предложения – welcome.

autoconf 2.62 и старые версии FreeBSD

При необходимости установить autoconf версии 2.62 и выше из портов в FreeBSD 5.x или, тем более, 4.x, возникает проблема с texinfo. Например, появляются такие ошибки:


autoconf-2.62.texi:1723: Unknown command `'.
autoconf-2.62.texi:3353: Unknown command `’.

По этой ссылке указано, что надо с этим делать. В общем, надо всего-то добавить пару строк в Makefile и чуть-чуть изменить последнюю строку, и всё соберётся без проблем.

UPDATE: получившийся у меня Makefile

UPDATE2: in case you don’t speak Russian, please, read this the full version of this post.

If you have ‘old’ version of FreeBSD (4-5) and experiencing problems with texinfo while updating autoconf, you should read this link. It tells what you should add to Makefile in order to update autoconf. As a result, this Makefile worked for me.

Валидация данных в PHP при помощи filter_var

Основой безопасности любого приложения является простое правило: «пришедшим от пользователя данным доверять нельзя». Для этой цели пишется довольно большое количество кода, хотя типичные задачи можно решить стандартными средствами PHP ничего не изобретая.

Например, таким образом можно проверить адрес e-mail при помощи filter_var:


if (filter_var($user_email, FILTER_VALIDATE_EMAIL)) {
// правильный
}

также можно убрать лишнее, например, из URL:


$sanitized_url = filter_var($url, FILTER_SANITIZE_URL);

Хотя filter_var() есть в стандартном PHP начиная с версии 5.2.0, документация на него, особенно русская, хромает.

Нормальная документация и примеры:
Руководство w3schools.
Input Validation: Using filter_var() Over Regular Expressions.
Data Filtering Using PHP’s Filter Functions

MySQL: utf8_unicode_ci или utf8_general_ci?

Какую таблицу из двух выбрать для своей базы данных в случае использования UTF?

utf8_general_ci
Убирает все акценты и приводит к верхнему регистру: ÀÁÅåāă = A, ü = U.
Не очень точно отрабатывает при сортировках. Иногда полезно при поиске. Быстрее utf8_unicode_ci.

Подходит для Русского. При использовании Белорусского и Украинского сортировка будет не верной.

utf8_unicode_ci
Довольно точно при сортировке и поиске. Например, ß (немецкий эсцет) будет при сортировке располагаться рядом с ss, как ему и положено. Медленнее utf8_general_ci.

Замечательно подходит для Русского, Белорусского и Украинского.

Итог
Если проект исключительно русскоязычный и скорость поиска и сравнения критична — можно остановится на utf8_general_ci. Если же есть планы по поддержке большего количества языков — лучше использовать utf8_unicode_ci.

Полные таблички utf8_unicode_ci и utf8_general_ci (там, кстати, и все остальные есть).

MySQL: How do you set up master-master replication in MySQL?

Setting up master-master replication in MySQL is very similar to how we set up master/slave replication. There is obviously pros and cons about using master/master replication. But this is not a post which discuses advantages and disadvantages for using master/master replication. One of the differences between master/master set up and master/slave is that in master/master set up, you have true redundancy. If one server dies, second server can take all the inserts/selects. In master/slave setup, if master dies, you will have to go through steps to make slave become the master. Master/master set up we are going to set up is essentially master/slave and slave/master. Meaning, if you had two servers, db0 and db1, your setup will be db0(master)/db1(slave) and also db0(slave)/db1(master). Here are some assumptions:


Master1 server ip: 10.0.0.1
Master2 server ip: 10.0.0.2
Slave username: slaveuser
Slave pw: slavepw
Your data directory is: /usr/local/mysql/var/

Read the rest of this entry »

Tip: запускать задачу раз в месяц в субботу

Часто необходимо запускать что-то (например полный бекап бд) раз в месяц, но в выходной, допустим в ночь с субботы на воскресенье.

Это можно сделать в crontab следующим образом


0 23 * * 6 [`date "+%d"` -lt 8] && /path/to/script

Это запустит скрипт в первую субботу месяца в 23:00.