VPN c динамической маршрутизацией (GRE Racoon OSPF): различия между версиями

Материал из ALT Linux Wiki
Строка 167: Строка 167:


=== Динамическая маршрутизация ===
=== Динамическая маршрутизация ===
Динамическая маршрутизация реализована с использование протокола [[ruwp:OSPF]]:
Динамическая маршрутизация реализована с использованием протокола [[ruwp:OSPF|OSPF]]
(англ. Open Shortest Path First) — протокол динамической маршрутизации, основанный на технологии отслеживания состояния канала (link-state technology) и использующий для нахождения кратчайшего пути Алгоритм Дейкстры (Dijkstra’s algorithm). Протокол OSPF был разработан IETF в 1988 году. Последняя версия протокола представлена в RFC 2328. Протокол OSPF представляет собой протокол внутреннего шлюза (Interior Gateway Protocol — IGP). Протокол OSPF распространяет информацию о доступных маршрутах между маршрутизаторами одной автономной системы.
(англ. Open Shortest Path First) — протокола динамической маршрутизации, основанного на технологии отслеживания состояния канала (link-state technology) и использующего алгоритм Дейкстры (Dijkstra’s algorithm) для нахождения кратчайшего пути. Протокол OSPF был разработан IETF в 1988 году. Последняя версия протокола описана в RFC 2328. Протокол OSPF представляет собой протокол внутреннего шлюза (Interior Gateway Protocol — IGP). Протокол OSPF распространяет информацию о доступных маршрутах между маршрутизаторами одной автономной системы.
OSPF предлагает решение следующих задач:
OSPF предлагает решение следующих задач:
*Увеличение скорости сходимости (в сравнении с протоколом RIP2, так как нет необходимости выжидания многократных тайм-аутов по 30с);
*Увеличение скорости сходимости (в сравнении с протоколом RIP2, так как нет необходимости выжидания многократных тайм-аутов по 30 сек.);
*Поддержка сетевых масок переменной длины (VLSM);
*Поддержка сетевых масок переменной длины (VLSM);
*Достижимость сети (быстро обнаруживаются отказавшие маршрутизаторы, и топология сети изменяется соответствующим образом);
*Достижимость сети (быстро обнаруживаются отказавшие маршрутизаторы и топология сети изменяется соответствующим образом);
*Оптимальное использование пропускной способности (т.к строится минимальный остовный граф по алгоритму Дейкстры);
*Оптимальное использование пропускной способности (т.к. строится минимальный остовный граф по алгоритму Дейкстры);
*Метод выбора пути.
*Метод выбора пути.


Устанавливается с пакетом quagga, в который входят так же протоколы
Функциональность OSPF содержится в пакете Quagga, пережившем не только животное (подвид южноафриканской зебры), давшее ему название, но и проект GNU Zebra, благодаря усовершенствованию которого проект Quagga в своё время появился на свет.
*ospfd (протокол OSPFv2);
Quagga поддерживает следующие протоколы маршрутизации:
*ripd (протокол RIP v1, V2);
*собственно OSPF v2 — демон ospfd;
*ospf6d (протокол OSPFv3 IPv6);
*RIP v1, v2 — демон ripd;
*ripngd (протокол RIP ng IPv6);
*OSPF v3 IPv6 — демон ospf6d;
*bgpd (протокол BGPv4+, включая поддержку multicast и IPv6)).
*RIP ng IPv6 — демон ripngd;
а так же демон zebra.
*BGP v4+, включая поддержку multicast и IPv6 — демон bgpd;
Работает схема так:
Базовым ядром Quagga является демон маршрутной информации zebra, выполняющий роль промежуточного уровня абстракции (abstraction layer) ядра ОС, и предоставляющий Zserv API клиентам (демонам маршрутизации) по протоколу TCP.
Демоны динамической маршрутизации (какие включены) каждый просчитывает свои маршруты по своему протоколу и выдает результаты зебре, которая на основе административного расстояния выбирает лучший маршрут и добавляет в главную таблицу маршрутизации.
 
Установка:
Суть такова:
Демоны маршрутизации просчитывают маршруты по своему протоколу и выдают результаты zebra, который выбирает лучший маршрут на основе административного расстояния и добавляет его в таблицу маршрутизации.
 
От теории к практике, установка:
<pre>
<pre>
# apt-get install quagga</pre>
# apt-get install quagga</pre>
Обратите внимание, что необходимо сменить права на папку /etc/quagga и все ёе содержимое на quagga:quagga:
Обратите внимание на то, что необходимо рекурсивно сменить права на папку /etc/quagga:
<pre>chown -R quagga:quagga /etc/quagga </pre>
<pre>chown -R quagga:quagga /etc/quagga </pre>
Не нужные протоколы прячем в папку samples(например), оставляем только ospfd.conf и zebra.conf:
Конфиги неиспользуемых протоколов переносим в папку samples (например), оставляем только ospfd.conf и zebra.conf:
<pre># ls -la /etc/quagga/
<pre># ls -la /etc/quagga/
-rw-------  1 quagga quagga  783 Дек 30 22:07 ospfd.conf
-rw-------  1 quagga quagga  783 Дек 30 22:07 ospfd.conf
Строка 259: Строка 262:
!
!
</pre>
</pre>
Опять же конфиги второй стороны зеркальны.
Опять же, конфиги противоположной стороны в плане соответствующих IP адресов зеркальны.
Запуск и настройка автозапуска:
Запуск и настройка запуска при старте системы:
<pre>
<pre>
service zebra start
service ospfd start
service ospfd start
service zebra start
chkconfig ospfd on
chkconfig ospfd on
chkconfig zebra on
chkconfig zebra on
Строка 271: Строка 274:
tcp        0      0 127.0.0.1:2604              0.0.0.0:*                  LISTEN      13294/ospfd
tcp        0      0 127.0.0.1:2604              0.0.0.0:*                  LISTEN      13294/ospfd
</pre>
</pre>
Интерфейс конфигурирования практически идентичен цисковскому. Для подключения к нему необходимо выполнить:
Интерфейс конфигурирования практически идентичен цисковскому. Для подключения к консоли zebra или ospfd, соответственно, необходимо выполнить:
<pre>
<pre>
telnet 127.0.0.1 2601     {консоль зебры}
telnet 127.0.0.1 2601
telnet 127.0.0.1 2604     {консоль OSPFD}
telnet 127.0.0.1 2604
</pre>
</pre>
Пароли все по умолчанию и на доступ и на enable — ''cisco''.
Все пароли по умолчанию ''cisco''.
Если обе стороны сконфигурированы правильно, то в консоле ospfd можно увидеть:
Если обе стороны сконфигурированы правильно, то в консоли ospfd можно увидеть:
<pre>
<pre>
# telnet 127.1 2604
# telnet 127.0.0.1 2604
Trying 127.0.0.1...
Trying 127.0.0.1...
Connected to 127.1.
Connected to 127.0.0.1.
Escape character is '^]'.
Escape character is '^]'.
User Access Verification
User Access Verification
Строка 287: Строка 290:
HOST-X> enable
HOST-X> enable
Password:
Password:
KIEV1-RTR# sh ip ospf neighbor
HOST-X# sh ip ospf neighbor
     Neighbor ID Pri State          Dead Time Address        Interface            RXmtL RqstL DBsmL
     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
192.168.2.1    1 Full/DROther      54.982s 172.17.0.1      gre1:172.17.0.2          0    0    0
</pre>
</pre>
А в таблице маршрутизации появится новый маршрут (или несколько):
В таблице маршрутизации появится новый маршрут (или несколько):
<pre>
<pre>
# ip ro sh
# ip ro sh

Версия от 18:53, 9 марта 2011


Исходные данные

Схема такой сети масштабируема от двух офисов до довольно большой сети крупного предприятия. Применение OSPF позволяет не прописывать вручную на каждом из маршрутизаторов сети удалённых филиалов, а также позволяет организовать несколько резервных каналов с автоматическим переключением. Начнём с простого - два филиала, на каждом в качестве маршрутизатора стоит Linux.

                     |------|                            |------|
192.168.1.0/24 ------|Linux |-x.x.x.x~~~~~~~~~~~y.y.y.y- |Linux |--------192.168.2.0/24
                     |------|                            |------|

Решение

Туннели

OSPF роутеры используют IP multicast для обмена сообщениями, поэтому необходимо использовать туннели GRE over IP. В ALT linux Ark 5 поддержка таких туннелей идёт из коробки. Конфиги: папка /etc/net/ifaces/gre1 (её нужно создать вручную, как и нижеприведенные файлы): /etc/net/ifaces/gre1/ipv4address:

172.17.0.0 peer 172.17.0.1

/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 адреса в TUNLOCAL и TUNREMOTE.

Опционально, разрешить 47 IP протокол (GRE) в ваших правилах фильтрации трафика:

iptables -I INPUT -i eth1 -p 47 -j ACCEPT
iptables -I OUTPUT -o eth1 -p 47 -j ACCEPT

на "внешних" интерфейсах обоих филиалов. Делаем

ifup gre1

на обеих сторонах. Если солнечная активность в день настройки минимальна, в системе появится сетевой интерфейс 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.0  P-t-P:172.17.0.1  Mask:255.255.255.255
          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'). По умолчанию TTL=inherit, что значит "наследовать значение TTL из вкладываемого в туннель пакета". В случае с OSPF, TTL=1, стало быть первый встречный маршрутизатор отбросит такой пакет, что нам совсем не нужно.

Проверка работы - пинг удалённой стороны туннельного интерфейса (в нашем случае это 172.17.0.1).

Если через этот туннель будет передаваться любая бизнес-информация, то её следует шифровать, чем мы сейчас и займёмся.

Шифрование передаваемых данных

Устанавливаем 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 указывается ключ шифрования - должен быть идентичен на обеих сторонах. Обратите внимание, y.y.y.y - внешний 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 адресов (x.x.x.x и y.y.y.y).

Опционально, разрешить порт 500 tcp и udp на внешних интерфейсах в ваших правилах фильтрации трафика.

Запускаем сервис racoon на обеих сторонах:

# service racoon start

Смотрим в /var/log/messages (при необходимости и для общего развития можно повысить debug-level в racoon.conf).

Делаем проверку - пинг противоположной стороны GRE туннеля.

Вуаля!

Динамическая маршрутизация

Динамическая маршрутизация реализована с использованием протокола 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);
  • Достижимость сети (быстро обнаруживаются отказавшие маршрутизаторы и топология сети изменяется соответствующим образом);
  • Оптимальное использование пропускной способности (т.к. строится минимальный остовный граф по алгоритму Дейкстры);
  • Метод выбора пути.

Функциональность OSPF содержится в пакете Quagga, пережившем не только животное (подвид южноафриканской зебры), давшее ему название, но и проект GNU Zebra, благодаря усовершенствованию которого проект Quagga в своё время появился на свет. Quagga поддерживает следующие протоколы маршрутизации:

  • собственно OSPF v2 — демон ospfd;
  • RIP v1, v2 — демон ripd;
  • OSPF v3 IPv6 — демон ospf6d;
  • RIP ng IPv6 — демон ripngd;
  • BGP v4+, включая поддержку multicast и IPv6 — демон bgpd;

Базовым ядром Quagga является демон маршрутной информации zebra, выполняющий роль промежуточного уровня абстракции (abstraction layer) ядра ОС, и предоставляющий Zserv API клиентам (демонам маршрутизации) по протоколу TCP.

Суть такова: Демоны маршрутизации просчитывают маршруты по своему протоколу и выдают результаты zebra, который выбирает лучший маршрут на основе административного расстояния и добавляет его в таблицу маршрутизации.

От теории к практике, установка:

# apt-get install quagga

Обратите внимание на то, что необходимо рекурсивно сменить права на папку /etc/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.conf

hostname 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
!

Опять же, конфиги противоположной стороны в плане соответствующих IP адресов зеркальны. Запуск и настройка запуска при старте системы:

service zebra start
service ospfd 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

Интерфейс конфигурирования практически идентичен цисковскому. Для подключения к консоли zebra или ospfd, соответственно, необходимо выполнить:

telnet 127.0.0.1 2601
telnet 127.0.0.1 2604

Все пароли по умолчанию cisco. Если обе стороны сконфигурированы правильно, то в консоли ospfd можно увидеть:

# telnet 127.0.0.1 2604
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
User Access Verification
Password:
HOST-X> enable
Password:
HOST-X# 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

--Сунцов Дмитрий 21:29, 20 января 2011 (UTC)