Июн 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
Ноя 042012
 

Обновления портов freebsd cvsup

Данный метод устарел

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

Первое, что необходимо сделать после установки FreeBSD, это обновить ветку ОС и список ports

# cd /usr/ports/net/cvsup-without-gui/
# make install clean

После успешной установки отправляемся в папку:

# cd /usr/share/examples/cvsup/
doc-supfile < -  для обновление  документации
ports-supfile < - для обновления портов
stable-supfile < - для обновления стабильной ветки FreeBSD

Начинаем обновление:

cvsup -g -L 2 ./doc-supfile -h cvsup.freebsd.org
cvsup -g -L 2 ./ports-supfile -h cvsup2.freebsd.org
cvsup -g -L 2 ./stable-supfile -h cvsup3.freebsd.org

Описание ключей:

-g типа не использовать  GUI
-L вывод на экран обновляемые действия
-h хост с которого будет происходить обновление

Так же вы можете создать на основе примеров свой supfile:

# SRC collection supfile
*default host=cvsup3.ua.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8 # Ваша текущая ветка
*default delete use-rel-suffix
*default compress
src-all

Использование *default release=cvs tag=RELENG_8
При получении или обновлении исходных текстов с использованием cvs или CVSup должен быть указан тег ревизии Тег относится либо к определенной линии разработки FreeBSD либо к определенному моменту времени. Первый тип называется »тегом ветви», второй тип называется »тегом релиза».
Все они, за исключением HEAD (который всегда работает), относятся только к дереву src/. Деревья ports/, doc/ и www/ не имеют тегов ветвей. Поэтому для ports/, doc/ и www/ используют *default release=cvs tag=.
RELENG_8 (рекомендую)
Ветвь разработки FreeBSD-8.X, известная также как FreeBSD 8-STABLE.
RELENG_8_3
Ветвь релиза для FreeBSD-8.3, используемая только для исправлений безопасности и других критических исправлений.

Можно автоматизировать процесс обновления…
Часто все рано не нужно обновляться.
Так что закидывай команду в крон и обновляемся раз в неделю.

#minute  hour    mday    month   wday    who     command
  10     12     6           *     *         root    cvsup -g -L 2 /usr/local/etc/supfile

После обновления ports, желательно так же обновить Index
Есть два варианта обновления:

1) собрать индексный файл самому (рекомендую)
cd /usr/ports && make index
2) скачать уже собранный индексный файл
cd /usr/ports && make fetchindex
Ноя 032012
 

FreeBSD portsnap обновление портов

Установка portsnap

Приступим к установке portsnap.

# cd /usr/ports/sysutils/portsnap && make install clean
# ee /etc/portsnap.conf
SERVERNAME=ru.portsnap.freebsd.org

Для последующего обновления достаточно выполнить команду.

# portsnap fetch extract update

Проверяем командой проверки новые версии портов.

# pkg_version -v | grep need