Обеспечить функционирование второго канала (backup) в Интернет для офиса при использовании канала от Yota.
Для обеспечения NAT`а возьмем ng_nat.
Железо
USB-модем Samsung SWC-U200
Сервер FreeBSD 8.2-STABLE
Реализация
Для USB-модемов Samsung SWC-U200 и Samsung SWC-E100 в портах появились userland-драйвер, находящийся в /usr/ports/net/lvwimax.
Инсталлируем их обычным способом:
# cd /usr/ports/net/lvwimax/
# make install clean
Перезапускаем демон отслеживания изменения состояния устройств:
# /etc/rc.d/devd restart
Для автостарта драйвера при загрузке системы добавим в /etc/rc.conf:
lvwimax_mac_address=»60:D0:A9:XX:YY:ZZ»
lvwimax_enable=»YES»
где 60:D0:A9:XX:YY:ZZ – MAC адрес USB-модема (его можно посмотреть либо на коробочке либо в личном кабинете).
Для логгирования отладочной инфы в отдельные файлы в начало /etc/syslog.conf следует добавить:
local6.err /var/log/lvwimax_err.log
local6.info /var/log/lvwimax_info.log
local6.debug /var/log/lvwimax_debug.log
Создать файлы лога:
# touch /var/log/lvwimax_err.log
# touch /var/log/lvwimax_info.log
# touch /var/log/lvwimax_debug.log
и перезапустить syslogd:
# /etc/rc.d/syslogd restart
Загружаем модули ядра для работы NAT:
# kldload ng_ipfw
# kldload ng_nat
Для загрузки модулей при старте системы добавим в /boot/loader.conf:
ng_ipfw_load=»YES»
ng_nat_load=»YES»
dhclient вызывает скрипт конфигурации сетевых параметров - dhclient-script, который после конфигурирования сетевого интерфейса смотрит, есть ли файл с именем /etc/dhclient-exit-hooks. Если файл находится, то он запускается на исполнение.
Этим мы и воспользуемся для изменения конфигурации NAT после получения IP-адреса по DHCP от провайдера.
Создадим файл /etc/dhclient-exit-hooks с содержанием:
#!/bin/sh
if [ "$reason" = "REBOOT" -o "$reason" = "BOUND" -o "$reason" = "RENEW" -o "$reason" = "REBIND" ]; then
ipfw -q delete 410
ipfw -q delete 420 ipfw -q delete 430
if ngctl show Yota_nat: >/dev/null 2>&1; then
/usr/sbin/ngctl shutdown Yota_nat:
echo "Destroy old nat config was complete" >>/var/log/dhc.log
fi
/usr/sbin/ngctl mkpeer ipfw: nat 70 out
/usr/sbin/ngctl name ipfw:70 Yota_nat /usr/sbin/ngctl connect ipfw: Yota_nat: 80 in /usr/sbin/ngctl msg Yota_nat: setaliasaddr $new_ip_address
echo "Create nat config was complete" >>/var/log/dhc.log
ipfw -q add 410 netgraph 80 ip from any to $new_ip_address via tap0 in
ipfw -q add 420 netgraph 70 ip from table"(99)" to any via vlan10 in ipfw -q add 430 fwd $new_routers ip from $new_ip_address to any
echo "Apply ipfw rules for nat was complete" >>/var/log/dhc.log
fi
Сделаем скрипт исполняемым:
# chmod a+x /etc/dhclient-exit-hooks
В нем вся «магия» по управлению конфигурацией NAT при изменении адреса после работы dhclient’a:
удаление старых правил ipfw, удаление старой конфигурации NAT, создание новой конфигурации NAT, применение новых правил ipfw.
При этом маршрут по умолчанию не изменяется.
Вставляем USB-модем в сервер и в путь:
# /usr/local/etc/rc.d/lvwimax start
Смотрим в ifconfig для проверки наличия интерфейса и полученного по DHCP IP-адреса: