Чер 012013
 

FreeBSD: как работать с NAT

У нас задача включить маскарадинг (или NAT – Network Addresses Translation) во FreeBSD с использованием ipfw. Мы в примере включим NAT на основе демона natd, не останавливаясь на ядерном NAT из-за его проблем (на момент FreeBSD 8.1) с длинной строки конфигурации.

NATd во FreeBSD, на самом деле, встроен из коробки и ничего дополнительно ставить не придется. Он уже установлен.

1) Включаем NAT в rc.conf

Редактируем /etc/rc.conf и вставляем в него следующие строки:

natd_enable="YES"
natd_flags="-f /usr/local/etc/natd.conf"
natd_interface="xl0"

Где:
natd_enabled=”YES” : включаем NAT
natd_flags=”-f /usr/local/etc/natd.conf” : откуда брать конфиг-файл для NATd
natd_interface=”xl0″ : здесь вместо xl0 указывайте имя интерфейса, смотрящего наружу

Создаем сам файл natd.conf

Переходим в /usr/local/etc и создаем файл с именем natd.conf и следующим содержимым:

# ee /usr/local/etc/natd.conf
same_ports
use_sockets

Обратите внимание – пустая строка в конце файла обязательна! Особенно если вы используете MC
В этом файле ничего особенного NATd не говорится – только то, что он должен пытаться использовать те же исходящие порты, что и от серого клиента, а так-же то, что он должен использовать сокеты.

3) Правила в ipfw
Теперь нам нужно прописать в ipfw задачу перенаправлять все пакеты, выходящие через внешний интерфейс на адрес интернет и входящие на внешний интерфейс на адрес самого роутера – на демон natd.

Вот необходимый кусок кода перенаправляет трафик с интерфейса xl0 на подсеть xl0:

internet='vr0'
ipfw='/sbin/ipfw -q'
iface_local='xl0'

${ipfw} flush
${ipfw} pipe flush
${ipfw} queue flush

${ipfw} 100 add allow ip from any to any via lo0
${ipfw} 110 add deny ip from any to 127.0.0.0/8
${ipfw} 115 add deny ip from 127.0.0.0/8 to any

${ipfw} 3000 add divert natd ip from any to me in via $internet
${ipfw} 3020 add divert natd ip from 192.168.70.0/24 to any via $internet out
${ipfw} 3030 add allow ip from any to 192.168.70.0/24 via $internet in
${ipfw} 3040 add allow ip from any to 192.168.70.0/24 via $iface_local out
${ipfw} 3050 add allow ip from 192.168.70.0/24 to any via $iface_local in

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

ВНИМАНИЕ! Будьте очень внимательны с IPFW (файерволом) – идеально вообще в момент таких действий находится перед консолью роутера. Ибо если Вы где-то накосячите – имеете все шансы потерять возможность подцепиться к роутеру для исправления косяков.

FreeBSD: настраиваем port forwarding (D-NAT) или проброс портов через NAT

Наша цель: настроить проброс портов через роутер на базе FreeBSD во внутреннюю сеть на определенные компьютеры.
Проброс портов: это когда кто-то ломится на внешний IP Вашего роутера (его белый IP) на определенный порт, а роутер этот трафик (приходящий на этот порт) перекидывает на определенный компьютер внутри локальной (или серой) сети, сам его не обрабатывая.

# ee /usr/local/etc/natd.conf
same_ports
use_sockets
redirect_port tcp 192.168.70.10:25 25
redirect_port udp 192.168.70.33:53 53
redirect_port tcp 192.168.70.1:3389 12345

Трафик, идущий на внешний IP Вашего роутера на порт 25 по TCP – будет переброшен на компьютер 192.168.0.10 на тот-же порт 25.
Трафик, идущий на внешний IP Вашего роутера на порт 53 по UDP – будет переброшен на компьютер 192.168.0.33 на тот-же порт 53.
Трафик, идущий на внешний IP Вашего роутера на порт 12345 по TCP – будет переброшен на компьютер 192.168.0.1 на другой порт – на порт 3389.

Это, конечно, лишь пример. Но суть составления правил Вам должна быть понятна – меняете внутренние IP на те, которые Вам необходимы, и порты на те, которые Вам необходимы.

P.S. Распространенная ошибка – пробовать рабоать с пробросом портов изнутри локальной сети – т.е. с серых адресов. Работать не будет – ибо трафик должен прилетать из интернета на сетевую карту, смотрящую во-вне. Поэтому изнутри Вашей же сети проброс портов банально не проверить.

Перезагрузка natd во FreeBSD может понадобиться, например, при внесении изменений в файл конфигурации. Например, Вы добавили порт для проброса из-вне во-внутрь через D-NAT и нужно, чтобы эта настройка заработала сейчас. Перезагружать весь сервер – тяжкое занятие, а вот ребутнуть только NAT – в самый раз.

# /etc/rc.d/natd restart
Тра 152013
 

FreeBSD проброс портов

Есть множество разнообразных вариантов проброса портов в FreeBSD.
Опишем, возможные варианты:
С помощью простой утилиты RINETD

# cd /usr/ports/net/rinetd/
# make install clean

Правила конфига:
ip_ваш_внешний:желаемый_порт ip_внутренний_компутера:желаемый_порт
Открываем конфиг демона на редактирование:

# ee /usr/local/etc/rinetd.conf
85.85.85.85 12345 192.168.1.9 1234

Добавляем запуск демона в rc.conf:

# echo 'rinetd_enable="YES"' >> /etc/rc.conf

Запускаем демон:

# /usr/local/etc/rc.d/rinetd start
Кві 172013
 

Мониторинг диска с помощью smartmontools

Следить за дисками необходимо так же тщательно, как и за температурой, пылью в сервере. Даже если вы используете супер надежный Raid массив, контроль за сервером показывает уровень Системного Администратора.
Для мониторинга и диагностики состояния HDD существует технология smart – технология оценки состояния жесткого диска с помощью встроенной аппаратной диагностики.

Специально для систем мониторинга в Unix системах разработана утилита smartmontools. Данный софт присутствует во всех известных мне Unix системах.

Сейчас мы настроим smartd который находится в пакете smartmontools для непрерывного мониторинга HDD штатными средствами smartmontools, устанавливаем smartmontools: (или из Backports)

Устанавливаем пакет в Debian или Ubuntu:

# apt-get install -y smartmontools

Устанавливаем пакет в CentOS или RedHat:

# yum install -y smartmontools

Устанавливаем пакет в FreeBSD

# cd /usr/ports/sysutils/smartmontools
# make install clean

smartctl — просмотр текущих значений S.M.A.R.T., запуск тестов диагностики диска вручную;
smartd — демон для записи в системный журнал изменений в значениях S.M.A.R.T, уведомления по электронной почте об ошибках, запуска тестов диагностики по расписанию;

Проверяем установлен ли S.M.A.R.T., с помощью команды:

# smartctl -i /dev/sda

Если S.M.A.R.T. отключен, то включаем:

# smartctl -s on /dev/sda

Настраиваем S.M.A.R.T. как демон в /etc/default/smartmontools, для примера добавляем два диска:

enable_smart=”/dev/sda /dev/sdb”
start_smartd=yes
smartd_opts=”–interval=1800″

Автоматизируем мониторинг для для дисков.

В файл /etc/smartd.conf (записываем email для получения уведомлений, о состоянии HDD)

/dev/sda -S on -o on -a -I 194 -W 4,38,45 -R 5 -H -l error -l selffortest -m sistemadmin@mail.ru -s (S/../.././02|L/../../6/03)
/dev/sdb -S on -o on -a -I 194 -W 4,38,45 -R 5 -H -l error -l selffortest -m sistemadmin@mail.ru -s (S/../.././02|L/../../6/03)
или
/dev/sda -S on -o on -a -I 194 -m sistemadmin@mail.ru

-a заставляет smartd наблюдать за всеми доступными SMART-параметрами дисков
-I 194 указывает smartd игнорировать изменения значения атрибута #194
-m указывает на необходимость отправки email-уведомлений.

Внимание! В файле smartd.conf вы сможете увидеть уже готовые примеры с описанием! Воспользуйтесь ими.

Запускаем сервис:

# /etc/init.d/smartmontools start

Можно проверить пишутся ли логи:

cat /var/log/syslog | grep smartd

Ключи программы взятые из MAn:

-d TYPE Тип устройства: ata, scsi, marvell, removable, 3ware,N, hpt,L/M/N
-T TYPE допустимое отклонение: normal, permissive
-o VAL Включает/выключает автоматические оффлайн тесты (on/off)
-S VAL Включает/выключает автосохранение атрибутов (on/off)
-n MODE Не проверять. Один из режимов: never, sleep, standby, idle
-H Мониторить SMART статус, уведомлять только при ошибках.
-l TYPE Мониторить SMART логи. Режимы: error, selftest
-f Монитор отказа для любых атрибутов ‘Usage’
-m ADD Письмо с варнингами на ADD для -H, -l error, -l selftest, and -f
-M TYPE Изменение поведения отсыла е-майлов (см. ман)
-s REGE Запустить тест когда дата совпадает с регулярным выражением (см. ман)
-p Сообщать о изменениях в ‘Prefailure’ атрибутах
-u ообщать о изменениях в ‘Usage’ атрибутах
-t Эквивалентно -p и -u директивам
-r ID Также сообщать ‘RAW’ значения атрибутов ID с -p, -u или -t
-R ID Следить за изменениями в атрибуте ID ‘Raw’ значения -p, -u or -t
-i ID Игнорировать атрибут ID для -f директивы
-I ID Игнорировать атрибут ID для -p, -u или -t директивы
-C ID Рапортовать если счётчик `ждущих` секторов не равен нулю
-U ID Рапортовать если счётчик `некорректируемых` секторов не равен нулю
-W D,I,C Monitor Temperature D)ifference, I)nformal limit, C)ritical limit
-v N,ST Mодифицировать метку для атрибута N (для нестандартных атрибутов)
-a Дефолт: эквивалентно -H -f -t -l error -l selftest -C 197 -U 198
-F TYPE Для ошибок в прошивке. Значения: none, samsung
-P TYPE Предустановки для диска: use, ignore, show, showall
# Комментарии: текст после него игнорируется
\ Продолжения строки

Кві 132013
 

Переход с cvsup на subversion для обновления FreeBSD

Уже было анонсировано, что с 28 февраля 2013 года поддержка cvs будет прекращена. Использовать subversion для обновления FreeBSD довольно таки просто.
Первое, что необходимо, это установить сам subversion.

# cd /usr/ports/devel/subversion
#make install clean

Если у вас очень старая версия портов, то devel/subversion-freebsd

Для перехода желательно почистить папки /usr/src и /usr/ports
Клонирование дерева портов осуществляем командой:

# svn co svn://svn.FreeBSD.org/ports/head /usr/ports

Для скачивания исходных кодов мира и ядра нужно выполнить:

# svn co svn://svn.freebsd.org/base/releng/9.1/ /usr/src

Мы скачиваем ветку релиза 9.1 (releng/9.1/).
Узнать какие существуют актуальные на данный момент ветки можно на официальном сайте FreeBSD. Например, на момент написания заметки имеются ветки stable/9 и releng/9.0.
Все существующие ветки можно просмотреть через веб-интерфейс для svn по адресу: http://svnweb.freebsd.org.

Если вы использовали прокси-сервера, то вы можете заменить протокол svn на http или https: https://svn.freebsd.org/base/releng/9.1/.

Для обновление исходных кодов и портов необходимо командой svn update:

#cd /usr/src
# svn update
#cd /usr/ports
# svn update

обновление, переход, cvsup, subversion, обновления, FreeBSD, svn, update

Кві 132013
 

Как изменить кодировку MySQL базы данных или таблицы. Настройка collation для работы с MySQL.

При запросе к базе данных желательно задать Кодировку с которой будет работать клиент с сервером:

set character_set_client='cp1251
set character_set_results='cp1251
set collation_connection='cp1251_general_ci

Изменяем кодировку для базы данных:

ALTER DATABASE `имя базы` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;

Изменяем кодировку для таблицы:

ALTER TABLE `tablename` CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
ALTER TABLE `tablename` DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci;

изменить, кодировка, mysql, базы данных, таблица, collation, Настройка, DATABASE, set, character_set_client, character_set_results, collation_connection, ALTER, TABLE