Доброго времени суток и с прошедшими/наступающими!
Выкладываю минихавтушку, всё нижеописаное успешно протестировано и работает не один год.
Схема такой сети масштабируема от двух офисов до довольно большой сети крупного предприятия.
Применение OSPF позволяет не прописывать вручную на каждом из маршрутизаторов роуты удаённых филиалов, а так же позволяет организовать несколько резервных каналов с автоматическим переключением.
Начнём с простого - два филиала, на каждом в качестве маршрутизатора стоит Linux.
|-------| |--------|
192.168.1.0/24 ------|Linux |-x.x.x.x~~~~~~~~~~~y.y.y.y- |Linux |--------192.168.2.0/24
|-------| |--------|
Непосредственно туннели строить удобнее всего (а в случае с OSPF это единственная возможность) при помощи IP туннеля GRE.
В ALT linux Ark 5 поддержка таких туннелей идёт из коробки.
Конфиги:
папка
/etc/net/ifaces/gre1 (её нужно создать вручную, как и нижеприведеные файлы):
/etc/net/ifaces/gre1/ipv4address:
172.17.0.2 peer 172.17.0.1/30
/etc/net/ifaces/gre1/options:TUNLOCAL=x.x.x.x
TUNREMOTE=y.y.y.y
TUNTYPE=gre
TYPE=iptun
TUNTTL=64
TUNMTU=1476
TUNOPTIONS='ttl 64'
DISABLE=no
Встречная сторона - все-то же, только IP адреса между собой поменять соответственно.
Для того, чтобы туннель заработал, нужно разрешить INPUT и OUTPUT на 47 ip протокол на внешних интерфейсах:
iptables -I INPUT -i eth1 -p 47 -j ACCEPT
iptables -I OUTPUT -o eth1 -p 47 -j ACCEPT
на "внешних" интерфейсах обоих филиалов.
Делаем
ifup gre1
на обоих сторонах
Если все хорошо, то дожен появиться сетевой интерфейс
здесь:
# ifconfig gre1
gre1 Link encap:UNSPEC HWaddr 3E-7A-38-81-8A-BF-00-05-00-00-00-00-00-00-00-00
inet addr:172.17.0.2 P-t-P:172.17.0.1 Mask:255.255.255.252
UP POINTOPOINT RUNNING NOARP MTU:1476 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 MiB)
и здесь:
# ip tu sh
gre0: gre/ip remote any local any ttl inherit nopmtudisc
gre1: gre/ip remote y.y.y.y local x.x.x.x ttl 64
Примечание: для нормальной работы OSPF необходимо задать значение TTL для туннеля (например TUNOPTIONS='ttl 64' как у нас), иначе оно будет "inherit", а OSPF обижается на такое некрасивое слово и отказывается нормально рассылать multicast-пакеты.Проверка работы- пингом удалённого ip gre- туннеля (в нашем случае P-t-P:172.17.0.1)
Но по-хорошему нужно ещё этот канал и шифровать, если через него будет передаваться бизнес-информация, т.к. gre сам по себе не шифрует, а только инкапсулирует.
Устанавливаем ipsec_tools
apt-get install ipsec-tools
Конфиги:
/etc/racoon/racoon.conf:
path include "/etc/racoon/";
path pre_shared_key "/etc/racoon/psk.txt";
log notify; # notify,debug,debug2
# "padding" defines some parameter of padding. You should not touch these.
padding
{
maximum_length 20;
randomize off;
strict_check off;
exclusive_tail off;
}
# if no listen directive is specified, racoon will listen to all
# available interface addresses.
listen
{
isakmp x.x.x.x [500];
}
# Specification of default various timer.
timer
{
# These value can be changed per remote node.
counter 5;# maximum trying count to send.
interval 20 sec;# maximum interval to resend.
persend 1;# the number of packets per a send.
# timer for waiting to complete each phase.
phase1 30 sec;
phase2 15 sec;
}
#
remote y.y.y.y
{
exchange_mode main;
#exchange_mode aggressive;
doi ipsec_doi;
situation identity_only;
nonce_size 16;
lifetime time 60 min;
initial_contact on;
support_proxy on;
proposal_check obey;# obey, strict or claim
proposal {
encryption_algorithm 3des;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group 2;
}
}
# Шифруем только GRE
sainfo address x.x.x.x/32 47 address y.y.y.y/32 47
{
pfs_group 2;
lifetime time 24 hour;
encryption_algorithm 3des;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}
/etc/racoon/setkey.conf:
#!/sbin/setkey -f
flush;
spdflush;
spdadd x.x.x.x/32 y.y.y.y/32 47 -P out ipsec esp/tunnel/x.x.x.x-y.y.y.y/unique;
spdadd y.y.y.y/32 x.x.x.x/32 47 -P in ipsec esp/tunnel/y.y.y.y-x.x.x.x/unique;
в
/etc/racoon/psk.txt указывается ключ шифрования - должен быть одинаков с обоих сторон.
IP адрес указывается удалённой стороны
у.y.y.y blablabla_secret_code_Kote_2011
Права на файлы:
# l
...
-rw------- 1 root root psk.txt
-rw-r--r-- 1 root root racoon.conf
-rw-r--r-- 1 root root setkey.conf
Делаем
# setkey -f /etc/racoon/setkey.conf
дабы загрузить правила.
на удалённой стороне конфиг соответствующий, с естесственной ротацией IP адресов.
Разрешаем 500 tcp и udp порт на обоих машинах опять же на внешних интрефейсах.
Врубаем racoon и там и тут (желательно синхронно):
# service racoon start
Смотрим в логи /var/log/messages (можно повысить debug-level в racoon.conf)
Если все поднялось и завязалось - делаем проверку пингом удалённого ip gre- туннеля (может пойти не с первого тыка).
Динамическая маршрутизация реализована с использование протокола
OSPF:
OSPF (англ. Open Shortest Path First) — протокол динамической маршрутизации, основанный на технологии отслеживания состояния канала (link-state technology) и использующий для нахождения кратчайшего пути Алгоритм Дейкстры (Dijkstra’s algorithm).
Протокол OSPF был разработан IETF в 1988 году. Последняя версия протокола представлена в RFC 2328. Протокол OSPF представляет собой протокол внутреннего шлюза (Interior Gateway Protocol — IGP). Протокол OSPF распространяет информацию о доступных маршрутах между маршрутизаторами одной автономной системы.
OSPF предлагает решение следующих задач:
Увеличение скорости сходимости (в сравнении с протоколом RIP2, так как нет необходимости выжидания многократных тайм-аутов по 30с);
Поддержка сетевых масок переменной длины (VLSM);
Достижимость сети (быстро обнаруживаются отказавшие маршрутизаторы, и топология сети изменяется соответствующим образом);
Оптимальное использование пропускной способности (т.к строится минимальный остовный граф по алгоритму Дейкстры);
Метод выбора пути.
Устанавливается с пакетом quagga, в который входят так же протоколы
ospfd (протокол OSPFv2);
ripd (протокол RIP v1, V2);
ospf6d (протокол OSPFv3 IPv6);
ripngd (протокол RIP ng IPv6);
bgpd (протокол BGPv4+, включая поддержку multicast и IPv6)).
а так же демон zebra.
Работает схема так:
Демоны динамической маршрутизации (какие включены) каждый просчитывает свои маршруты по своему протоколу и выдает результаты зебре, которая на основе
административного расстояния выбирает лучший маршрут и добавляет в главную таблицу маршрутизации.
Установка:
# apt-get install quagga
Обратите внимание, что необходимо сменить права на папку /etc/quagga и все ёе содержимое на quagga:quagga:
chown -R quagga:quagga /etc/quagga
Не нужные протоколы прячем в папку samples(например), оставляем только ospfd.conf и zebra.conf:
# ls -la /etc/quagga/
-rw------- 1 quagga quagga 783 Дек 30 22:07 ospfd.conf
drwxr-xr-x 2 quagga quagga 4096 Мар 26 2010 samples
-rw------- 1 quagga quagga 529 Дек 30 22:08 zebra.conf
/etc/quagga/ospfd.conf:
!
hostname host-x
password 8 LrjDz/a2KALVQ
enable password 8 LrjDz/a2KALVQ
log file /var/log/quagga/ospfd.log informational
service password-encryption
no banner motd
!
interface gre0
!
interface gre1
description link-gre1
ip ospf authentication message-digest
ip ospf message-digest-key 1 md5 SecrEtKeY
ip ospf cost 100
ip ospf dead-interval 60
!
interface lo
!
router ospf
ospf router-id 192.168.1.1
redistribute connected route-map RedistNets
network 172.17.0.0/30 area 0.0.0.0
!
access-list 111 permit ip 192.168.1.0 0.0.0.255 any
access-list localhost permit 127.0.0.1/32
access-list localhost deny any
!
route-map RedistNets permit 10
match ip address 111
!
line vty
access-class localhost
/etc/quagga/zebra.confhostname router
password 8 LrjDz/a2KALVQ
enable password 8 LrjDz/a2KALVQ
log file /var/log/quagga/zebra.log informational
service password-encryption
no banner motd
!
interface gre0
!
interface gre1
ip address 172.17.0.2/30
link-detect
!
interface lo
description loopback
!
access-list localhost permit 127.0.0.1/32
access-list localhost deny any
!
ip forwarding
no ipv6 forwarding
!
line vty
access-class localhost
!
Опять же конфиги второй стороны зеркальны.
Запуск и настройка автозапуска:
service ospfd start
service zebra start
chkconfig ospfd on
chkconfig zebra on
# netstat -nlp |grep :260
tcp 0 0 127.0.0.1:2600 0.0.0.0:* LISTEN 13362/zebra
tcp 0 0 127.0.0.1:2601 0.0.0.0:* LISTEN 13362/zebra
tcp 0 0 127.0.0.1:2604 0.0.0.0:* LISTEN 13294/ospfd
Интерфейс конфигурирования практически идентичен цисковскому. Для подключения к нему необходимо выполнить:
telnet 127.0.0.1 2601 {консоль зебры}
telnet 127.0.0.1 2604 {консоль OSPFD}
Пароли все по умолчанию и на доступ и на enable -
cisco.
Если обе стороны сконфигурированы правильно, то в консоле ospfd можно увидеть:
# telnet 127.1 2604
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
User Access Verification
Password:
HOST-X> enable
Password:
KIEV1-RTR# sh ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL
192.168.2.1 1 Full/DROther 54.982s 172.17.0.1 gre1:172.17.0.2 0 0 0
А в таблице маршрутизации появится новый маршрут (или несколько):
# ip ro sh
192.168.2.0/24 via 172.17.0.1 dev gre1 proto zebra metric 20
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
default via x.x.x.x dev eth1