3 серп. 2009 р.

Настройка NAT и шейпера на FreeBSD

Задача:

Настроить NAT для локальной сети используя FreeBSD и ограничить скорость доступа при помощи шейпера на аплоад 10 мегабит в секунду, на даунлоад 1 мегабит в секунду.

Дано:

Внутренний интерфейс de0 (192.168.0.1/24)
Внешний интерфейс de1 (10.10.10.2/32)

Решение:

1. Пересобираем ядро с такими опциями:

1. options IPFIREWALL
2. options IPFIREWALL_VERBOSE
3. options IPFIREWALL_VERBOSE_LIMIT=10
4. options IPFIREWALL_DEFAULT_TO_ACCEPT
5. options IPDIVERT
6. options DUMMYNET
7. options HZ=1000


где:

1. Активируем Firewall при загрузке
2. Включаем возможность журналирования
3. Ограничиваем журналирование до 10 записей в секунду
4. По умолчанию разрешаем прохождение любого трафика, тоесть ничего не блокируем
5. Включаем демон NAT
6. Включаем демон шейпера
7. Устанавливаем таймер точности работы для шейпера (Начинает интенсивнее использоваться процессор)

2. Дописываем в файл /etc/rc.conf следующие строки:

1. ifconfig_de0="inet 192.168.0.1 netmask 255.255.255.0 up media 100baseTX mediaopt full-duplex"
2. ifconfig_de1="inet 10.10.10.2 netmask 255.255.255.252 up media 100baseTX mediaopt full-duplex"
3. defaultrouter="10.10.10.1"
4. gateway_enable="YES"
5. firewall_enable="YES"
6. firewall_type="firewall"
7. firewall_quiet="YES"
8. firewall_logging="YES"
9. firewall_script="/usr/local/etc/rc.firewall"
10. natd_enable="YES"
11. natd_flags="-f /etc/natd.conf"


где:

1. Конфигурируем внутренний интерфейс
2. Конфигурируем внешний интерфейс
3. Указываем шлюз по умолчанию
4. Активируем режим пересылки пакетов между интерфейсами
5. Активируем Firewall
6. Указываем тип Firewall (Идентификатор. Мы используем свои настройки, поэтому выбираем название отличное от стандартных типовых - OPEN, CLIENT, SIMPLE, CLOSED, UNKNOWN)
7. Активируем "тихий" режим Firewall (при загрузке/перезагрузке правил не будут выдаваться предупредительные сообщения)
7. Активируем режим журналирования
8. Указываем путь к файлу для загрузки правил Firewall
10. Активируем демон natd
11. Указываем путь к файлу для загрузки опций natd

3. Создаем скрипт /usr/local/etc/rc.firewall и добавляем в него следующие строки:

1. #!/bin/sh
2. ipfw -f flush
3. ipfw -f pipe flush
4. ipfw add 100 allow ip from any to any via lo0
5. ipfw add 200 deny ip from any to 127.0.0.0/8
6. ipfw add 300 deny ip from 127.0.0.1/8 to any
7. ipfw add 400 divert natd all from any to any via de1
8. ipfw add 500 pipe 500 ip from 192.168.0.0/24 to any via de0
9. ipfw add 600 pipe 600 ip from any to 192.168.0.0/24 via de1
10. ipfw pipe 500 config bw 1024Kbit
11. ipfw pipe 600 config bw 10240Kbit
12. ipfw add 65535 allow ip from any to any


где:

1. Указываем интерпретатор в начале скрипта
2. Очищаем правила Firewall
3. Очищаем пайпы (трубы) шейпера
4. Добавляем разрешающее правило 100 для прохода всего трафика через лупбек
5. Добавляем запрещающее правило 200 для доступа к сети 127.0.0.0/8
6. Добавляем запрещающее правило 300 для доступа из сети 127.0.0.0/8
7. Добавляем разрешающее правило 400 для запуска NAT через интерфейс de1
8. Добавляем правило 500, добавляющее пайп 500 от сети 192.168.0.0/24 через интерфейс de0
9. Добавляем правило 600, добавляющее пайп 600 к сети 192.168.0.0/24 через интерфейс de1
10. Конфигурируем пайп соответствующий номеру 500. Устанавливаем скорость 1 мегабит
11. Конфигурируем пайп соответствующий номеру 600. Устанавливаем скорость 10 мегабит.

3. Создаем файл /etc/natd.conf, описывающий настройки демона natd

1. use_sockets yes
2. same_ports yes
3. unregistered_only yes
4. interface de1


где:

1. Выделять для NAT соединений сокеты. Используется больше ресурсов, но уменьшается вероятность некорректной трансляции
2. Пытаться сохранять тот же номер порта если данные для исходящих соединений изменились, полезно для протокола RPC
3. Транслировать только "серые" адреса, читать RFC 1918
4. Указываем имя исходящего NAT интерфейса, полезно в случае если на внешнем интерфейсе IP изменяется динамически.

4. Управляем IPFW при помощи команд

1. freebsd# /etc/rc.d/ipfw start
2. freebsd# ipfw list
3. freebsd# ipfw show
4. freebsd# ipfw pipe list
5. freebsd# ipfw -f flush
6. freebsd# ipfw -f pipe flush


где:

1. Стартуем IPFW. Также доступны опции restart, stop, status
2. Просмотр правил IPFW
3. Просмотр правил IPFW с счетчиками трафика
4. Просмотр пайпов
5. Очистка в тихом режиме правил IPFW
6. Очистка в тихом режиме пайпов

10 коментарів:

Unknown сказав...

Спасибо за статью. Вечером попробую реализовать

plastilin сказав...

Не за что! Главное что статья пригодилась!

Unknown сказав...

замечу пару моментов:
в rc.conf надо прописать dummynet_enable="YES" . Без этого шейп на восьмой Фре не робил. Скорость отдачи почемуто была вдвое меньше обозначенной в правилах (мб глюк сайта спид-тест.нет)

Пы Сы: если необходимо сделать другое ограничение на некоторые адреса, то как это реализовать?

plastilin сказав...

Насчет Dummynet, возможно разработчики 8 что то изменили. А по поводу шейпинга разных айпи я указывал маску сети /32

Анонім сказав...

А как каждому выделить канал, например 256Кбит/с, а не ВСЕМ один? Или как реализуется так называемая "справедливая" т.е. пропорциональная нарезка?

plastilin сказав...

Не задумывался, честно говоря. Как реализуете обязательно поделитесь!

Анонім сказав...

Как вариант можно взять такой http://www.lissyara.su/articles/freebsd/tuning/dummynet/

Анонім сказав...

/sbin/ipfw pipe 1 config bw 1000Kbit/s
/sbin/ipfw queue 1 config pipe 1 weight 50 mask dst-ip 0x00000000
/sbin/ipfw add queue 1 ip from any to 192.168.0.1/24
вообще класс!!!
источник http://ipfw.ism.kiev.ua/nipfw.html

plastilin сказав...

Познавательно, спасибо!

Анонім сказав...
Адміністратор блогу видалив цей коментар.