From: dindin <dindin@freebsd.org.ua.>
Newsgroups: emial
Date: Mon, 10 Apr 2006 14:31:37 +0000 (UTC)
Subject: Динамическая настройка сети на ноутбуке под FreeBSD
Однажды мне надоело каждый раз вручную перенастраивать
ноутбук для каждой локальной сети, к которой я поключаюсь.
Поскольку DHCP используется не везде, то
я написал несколько скриптов, настраивающих сеть за меня.
Предположим, имеются три локальные сети с маской 255.255.255.0 и адресами
192.168.1.0
192.168.2.0
192.168.3.0
Предположим так же, что в каждой из них есть маршрутизатор:
192.168.1.1
192.168.2.1
192.168.3.1
DNS-сервер:
192.168.1.53
192.168.2.53
192.168.3.53
В каждой из них нам выдается постоянный IP-адрес:
192.168.1.3
192.168.2.4
192.168.3.5
Конфигурация сети в таком случае будет состоять из нескольких этапов:
1) Присвоение IP-aдреса
2) настройка DNS
3) Настройка Firewall'а
4) настройка маршрутизатора по умолчанию
С первым пунктом никаких проблем - добавляем в /etc/rc.conf интерфейс
и алиасы для него:
С DNS-серверами особой сложности тоже нет. Если локальные сети
имеют доменные имена localnet1.com localnet2.com и localnet3.com,
то /etc/resolv.conf выглядит так:
search localnet1.com localnet2.com localnet3.com
server 192.168.1.53
server 192.168.2.53
server 192.168.3.53
Нужно только учитывать, что параметр search может содержать не более
6 доменов общей длинной не более 255 символов.
Firewall. Я использую ipfw.
У ipfw есть опция -p, которая позволяет пропускать правила
через текстовый фильтр. Дело за малым - осталось фильтр написать.
В моём случае выглядит он так:
#!/bin/sh
# /usr/local/bin/preproc-ipfw
# фильтр для шаблона првил ipfw
# Включаем "конфигурационный файл", содержащий список
# портов, разрешеных всем и список доверенных сетей
. /usr/local/etc/preproc-ipfw.conf
SED="/usr/bin/sed"
IFCONFIG="/sbin/ifconfig"
CAT="/bin/cat"
# получаем список серверов DNS из /etc/resolv.conf
NS="`${CAT} /etc/resolv.conf | grep nameserver | awk '{print $2}' `"
NS=`echo ${NS} | ${SED} 's_ _,_g'`
# порты открытые по TCP
ALLOWED_ALL_PORTS_TCP="21,22,25,80,443,2628,3306,6667"
# порты открытые по UDP
ALLOWED_ALL_PORTS_UDP="123"
# доверенные сети
LOCALNET="192.168.112.0/24,192.168.1.0/24"
Теперь, собственно шаблон правил (/usr/local/etc/firewall.conf):
add allow ip from me to me via %localinterfaces%
add allow udp from %ns% to me
add allow udp from me to %ns%
add allow tcp from any to me %allowedportstcp%
add allow udp from any to me %allowedportsudp%
add allow udp from me %allowedportsudp% to any
add allow ip from %localnet% to %localnet%
add deny tcp from any to me tcpflags !ack
add allow tcp from me to any
add allow tcp from any to me
Сразу хочу сказать, что такой набор правил не обеспечивает
достаточной защиты и приведен здесь только в качестве примера.
firewall настроен, пришла очередь маршрутизатора. С моей точки зрения, BGP и
прочий роутинговый инструментарий на ноутбуке - это
аристократическое излишество, поэтому я сделал
все при помощи рабоче-крестьянского шела. Итак, в /etc/rc.conf
routerautoconf_enable="YES"
Добавляем скрипт /usr/local/etc/rc.d/routerautoconf.sh, конфигурирующий роутинг
при старте системы
#!/bin/sh
#/usr/local/etc/rc.d/routerautoconf.sh
# скрипт для определения маршрутизатора
. /usr/local/etc/preproc-ipfw.conf
# используемые утилиты
NETSTAT="/usr/bin/netstat"
AWK="/usr/bin/awk"
GREP="/usr/bin/grep"
SED="/usr/bin/sed"
PING="/sbin/ping"
ROUTE="/sbin/route"
IPFW="/sbin/ipfw"
IPFW_ADD_RULE="add 1 allow icmp from any to any"
IPFW_DELETE_RULE="delete 1"
# Список локальных сетей
LOCALNET="`echo "${LOCALNET}" | ${SED} 's_,_ _g'`"
# ищем, есть ли уже маршрутизатор по умолчанию
CURRENT_DEFROUTER="`${NETSTAT} -r -n -f inet | ${GREP} "default" | ${AWK} '{print$2 }'`";
# если он есть и пингуется...
if [ "${CURRENT_DEFROUTER}" != "" ] && [ "`${PING} -i 0.1 -c 5 -t 1 ${CURRENT_DEFROUTER} | ${GREP} "100% packet loss"`" = "" ]
then
# то всё отлично
echo "/etc/rc.conf's defaultrouter seems ok"
${IPFW} ${IPFW_DELETE_RULE}
exit 0;
# a вот если его нет или не пингуется...
else
${ROUTE} delete default
#проверяем все локальные сети
for NET in ${LOCALNET}
do
# предполагаем, что у router'а первый адрес в подсети
DEFROUTER="${NET%0/24}1"
# и снова пингуем
if [ "`${PING} -i 0.1 -c 5 -t 1 ${DEFROUTER} | ${GREP} "100% packet loss"`" = "" ]
then
# до тех пор, пока не запингуется
${ROUTE} add default ${DEFROUTER}
echo "Set default router to ${DEFROUTER}"
${IPFW} ${IPFW_DELETE_RULE}
exit 0
fi
done
fi
# если ничего не помогло - беспомощно разводим руками
echo "No any routers found. Sorry.."
${IPFW} ${IPFW_DELETE_RULE}
exit 1