Задача
Обеспечить функционирование второго канала (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-адреса:
tap0: flags=8843 metric 0 mtu 1386
options=80000
ether 60:d0:a9:f9:4a:74
inet6 fe80::62d0:a9ff:fef9:4a74%tap0 prefixlen 64 scopeid 0x12
inet 10.184.244.147 netmask 0xfffffc00 broadcast 10.184.247.255
nd6 options=3
Opened by PID 63322
Осталось в table(99) поместить хосты или подсети для доступа в интернет через Yota.
Ссылки
P.S. Естественно, что данный способ будет работать с любым провайдером, для подключения к которому используется dhclient.
P.S.S. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Уважайте чужой труд.
Автор: Панфилов Алексей (lehis (at) subnets.ru