Канал FreeBSD<==>Cisco (GRE,IPSec,OSPF)

Тут описывается нелёгкий путь настройки ОС FreeBSD, начиная с установки дистрибутива и заканчивая настройкой каждого сервиса
Ответить
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Канал FreeBSD<==>Cisco (GRE,IPSec,OSPF)

Сообщение RomA »

Введение:
Подобную штуку я уже делал, но вот реалии изменились - на виртуальном хостинге стали доступны сервера на FreeBSD и я с удовольствием начал перебираться на эту систему. Первое что надо было сделать - это настроить тунель, и желательно защищённый. Схему будем брать с тойю статьи, но попробуем использовать полученный опыт. Если раньше я пытался сделать так, что бы cisco цеплялась на сервер, то теперь попробую сервер зацепить клиентом к cisco.

План работ:
Решать данную задачу я буду в несколько этапов:
1) Создание GRE тунеля
2) Защита тунеля IPSec
3) Создание маршрутизации на OSPF
4) Автоматизация процесса
5) Мониторинг

Дано:
1) Сервер FreeBSD 10.1 полностью обновлённый "на сейчас"
2) Cisco 1841
3) Желание воплатить всё задуманное

Работы - создание GRE:
На первом этапе мы попробуем просто создать GRE тунель между фрёй и cisco. Для этого нам понадобится 2 ИП адреса, которые мы дадим тунельным интерфейсам устройств - выделяем для этого подсеть 172.16.0.0/29 - ну так, с запасом ))) Давайте сразу договоримся что 172.16.0.1 - это Cisco а 172.16.0.2 - FreeBSD.
Работы начнём с Cisco, ибо проще - на ней надо создать тунельный интерфейс:

Код: Выделить всё

interface Tunnel3
 ip address 172.16.0.1 255.255.255.248
 ip mtu 1400
 tunnel source Dialer1
 tunnel destination YYY.YYY.YYY.YYY
По строкам:
1) имя номер интерфейса можете задать любой свободный
2) прописываем ИП адрес и маску подсети
3) GRE отбирает байтики, плюс у меня PPPOE работает - страхуюсь, ставлю много ниже
4) Интернетовский порт на Cisco (можно указать IP адрес, но у меня он динамический)
5) Интернетовский IP адрес сервера

Теперь настраиваем сервер:

В файл /etc/rc.conf добавляем

Код: Выделить всё

cloned_interfaces="gre0"
Хотите перегружайтесь, хотите подгружайте модуль руками, но когда всё сделаете можете попробовать поднять тунель
Тут мы сначала пишем адреса сервера, потом удалённой стороны

Код: Выделить всё

/sbin/ifconfig gre0 inet 172.16.0.2 172.16.0.1 netmask 255.255.255.248 tunnel YYY.YYY.YYY.YYY   XXX.XXX.XXX.XXX llink1 up
На фре это будет выглядеть так

Код: Выделить всё

root@mail:/etc #ifconfig

gre0: flags=b051<UP,POINTOPOINT,RUNNING,LINK0,LINK1,MULTICAST> metric 0 mtu 1476
	tunnel inet YYY.YYY.YYY.YYY  --> XXX.XXX.XXX.XXX
	inet6 fe80::601:3aff:fe55:6e01%gre0 prefixlen 64 scopeid 0x3 
	inet 172.16.0.2 --> 172.16.0.1 netmask 0xfffffff8 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Вроде как тунель есть, но его нет. Тунель поднимется и будет жить только тогда, когда по нему идёт трафик. Таким образом что бы он заработал - надо как минимум пингануть удалённый узел - если сделали всё верно - тунель должен подняться и пинги должны идти

Код: Выделить всё

root@mail:/etc # ping 172.16.0.1
PING 172.16.0.1 (172.16.0.1): 56 data bytes
64 bytes from 172.16.0.1: icmp_seq=0 ttl=255 time=63.739 ms
64 bytes from 172.16.0.1: icmp_seq=1 ttl=255 time=63.465 ms
64 bytes from 172.16.0.1: icmp_seq=2 ttl=255 time=63.678 ms
PS:
я не забыл добавить if_gre_load="YES" в файл /boot/loader.conf или написать gre_enable="YES" в /etc/rc.conf и сознательно в этом же файле не написал

Код: Выделить всё

ifconfig_gre0="172.16.0.2 172.16.0.1 netmask 255.255.255.248 tunnel YYY.YYY.YYY.YYY XXX.XXX.XXX.XXX link1 up"
- первое не нужно - оно итак работает, а последнее бесполезно, ибо у меня тунель поднимать будет всёравно скрипт автоматизации

Траблешутинг:
На самом деле данная конфигурация работает сразу и безотказно, если всё сделано верно. Остальные случаи делятся на:
1) Неверно или не в той последовательности указали IP адреса
2) Провайдер режет GRE (или вы сами забыли снять файрвол)

Литература:

Послесловие:
Ну а теперь, когда мы вдохновились этим успехом - приступим к самому интересному и сложному :-)
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Шифруем наш трафик

Сообщение RomA »

Введение:
Итак, у нас есть тунель - труба, по которой ходит наш трафик. По сути сейчас там только трафик между 2мя ИП адресами, но в дальнейшем может мы заходим что-то ещё? Я бы хотел думать, что это мой локальная сеть, что она защищена, что бы каждый раз не париться, защитил я тот или иной интерфейс или протокол. Потому будем шифровать всё, что попадает к нам с тунель - то есть шифранём всю трубу. Для шифрования будем использовать IPSec.

Реализация:
Давайте опять начнём с cisco:

Опишем клиента - а именно: пропишем ИП адрес клиента (YYY.YYY.YYY.YYY), пароль для соединения (P@SSw0rd), а так же для удобства присвоим клиенту имя (Akey).
Так же создадим профиль (CAipsec) шифрования: где опишем клиента (CAisakmp) а так же создадим общий профиль, которым будем шифровать тунель (EXAMPLE).

Код: Выделить всё

crypto keyring Akey 
  pre-shared-key address YYY.YYY.YYY.YYY key 6 P@SSw0rd
!
crypto isakmp policy 10
 encr aes
 hash md5
 authentication pre-share
 group 2
!
crypto isakmp profile CAisakmp
   keyring Akey
   match identity address YYY.YYY.YYY.YYY  255.255.255.255 
!
crypto ipsec security-association lifetime seconds 28800
!
crypto ipsec transform-set EXAMPLE esp-aes esp-md5-hmac 
!
crypto ipsec profile CAipsec
 set transform-set EXAMPLE 
 set isakmp-profile CAisakmp
!

Теперь изменим наш тунель - приведём его к такому виду:

Код: Выделить всё

interface Tunnel3
 ip address 172.16.0.1 255.255.255.248
 ip mtu 1400
 tunnel source Dialer1
 tunnel destination 188.166.12.113
 tunnel protection ipsec profile CAipsec
Как видим тут добавился только профиль шифрования - всё остальное из предыдущего поста

Теперь перейдём на сервер - тут не всё так просто - как минимум надо будет пересобрать ядро со следующими опциями

Код: Выделить всё

device          crypto
options         IPSEC
Справедливости ради отмечу что у меня ядро собрано с опциями

Код: Выделить всё

device          crypto
options         IPSEC
options         IPSEC_FILTERTUNNEL
options         IPSEC_DEBUG
[/color]
После того как пересобрали и перегрузились поставим /usr/ports/security/ipsec-tools - я выбрал следующие параметры

Код: Выделить всё

                         ┌─────────────────────────── ipsec-tools-0.8.1_7 ──────────────────────────────┐
                         │ ┌──────────────────────────────────────────────────────────────────────────┐ │  
                         │ │ [ ] ADMINPORT  Enable Admin port                                         │ │  
                         │ │ [x] DEBUG      Build with debugging support                              │ │  
                         │ │ [ ] DOCS       Build and/or install documentation                        │ │  
                         │ │ [x] DPD        Dead Peer Detection                                       │ │  
                         │ │ [x] FRAG       IKE fragmentation payload support                         │ │  
                         │ │ [ ] GSSAPI     GSSAPI Security API support                               │ │  
                         │ │ [x] HYBRID     Hybrid, Xauth and Mode-cfg support                        │ │  
                         │ │ [ ] IDEA       IDEA encryption (patented)                                │ │  
                         │ │ [ ] IPV6       IPv6 protocol support                                     │ │  
                         │ │ [ ] LDAP       LDAP authentication (Xauth server)                        │ │  
                         │ │ [x] NATT       NAT-Traversal (kernel-patch required)                     │ │  
                         │ │ [ ] NATTF      require NAT-Traversal (fail without kernel-patch)         │ │  
                         │ │ [ ] PAM        PAM authentication (Xauth server)                         │ │  
                         │ │ [ ] RADIUS     Radius authentication (Xauth server)                      │ │  
                         │ │ [ ] RC5        RC5 encryption (patented)                                 │ │  
                         │ │ [ ] SAUNSPEC   Unspecified SA mode                                       │ │  
                         │ │ [x] STATS      Statistics logging function                               │ │  
                         │ └──────────────────────────────────────────────────────────────────────────┘ │  
                         ├──────────────────────────────────────────────────────────────────────────────┤  
                         │                       <  OK  >            <Cancel>                           │  
                         └──────────────────────────────────────────────────────────────────────────────┘  
                                                                                          
поставилось без проблем - переходим к настройкам. Давайте создадим файл /usr/local/etc/racoon/ipsec.conf следующего содержания

Код: Выделить всё

spdflush;
spdadd YYY.YYY.YYY.YYY/32  XXX.XXX.XXX.XXX/32 gre -P out ipsec esp/tunnel/YYY.YYY.YYY.YYY-XX.XXX.XXX.XXX/require;
spdadd XXX.XXX.XXX.XXX/32 YYY.YYY.YYY.YYY /32 gre -P in ipsec esp/tunnel/XXX.XXX.XXX.XXX-YYY.YYY.YYY.YYY/require;
Переходим в файл /etc/rc.conf добавим автозапуск этого дела, а так же сразу нашего racoon, что бы не возвращаться сюда несколько раз

Код: Выделить всё

ipsec_enable="YES"
ipsec_program="/usr/local/sbin/setkey"
ipsec_file="/usr/local/etc/racoon/ipsec.conf"
racoon_enable="YES"
racoon_flags="-f /usr/local/etc/racoon/racoon.conf"
racoon_flags="-l /var/log/racoon.log"

Ну и вернёмся обратно в директорию /usr/local/etc/racoon/ где создадим файлик ключей - это файл, где будет хранится IP адрес удалённой стороны и пароль для соединения. Так как в файле важная информация - сразу выставим права доступа на него

Код: Выделить всё

#cd /usr/local/etc/racoon/
# touch key.txt

Содержимое файла следующее:

Код: Выделить всё

XXX.XXX.XXX.XXX P@$$w0rd
Между IP-адресом и паролем следует поставить либо пробел либо таб - несколько пробелов поставите и работать не будет
Тут же создаём файл racoon.conf содержимое которого я привожу полностью

Код: Выделить всё

path include "/usr/local/etc/racoon";
path pre_shared_key "/usr/local/etc/racoon/key.txt";

log debug2;

padding
{
maximum_length	20;
randomize	off;
strict_check	off;
exclusive_tail	off;
}

listen
{
isakmp YYY.YYY.YYY.YYY [500];
}

timer
{
counter 5;
interval 20 sec;
persend 1;
phase1 30 sec;
phase2 15 sec;
}
remote XXX.XXX.XXX.XXX [500]
{
    exchange_mode main,aggressive;
    doi             ipsec_doi;
    situation       identity_only;
    generate_policy off;
    proposal_check obey;
    my_identifier address YYY.YYY.YYY.YYY;
    peers_identifier address XXX.XXX.XXX.XXX;
    lifetime time 28800 sec;
    passive         off;    

    proposal 
	{
        encryption_algorithm aes;
        hash_algorithm md5;
        authentication_method pre_shared_key;
        lifetime time 28800 sec;
        dh_group 2;
        }
}

sainfo anonymous 
    {
    lifetime time 28800 sec;
    encryption_algorithm aes;
    authentication_algorithm hmac_md5;
    compression_algorithm deflate;
    }
Ну что тут сказать - следите что бы параметры были такие же как и на cisco.
Если всё сделано верно, то тунель должен заработать, но помним про то, что его надо поднять - пустив по нему трафик - до этого момента любой дебаг будет молчать как рыба.

Код: Выделить всё

# ping 172.16.0.1
PING 172.16.0.1 (172.16.0.1): 56 data bytes
64 bytes from 172.16.0.1: icmp_seq=0 ttl=255 time=66.467 ms
64 bytes from 172.16.0.1: icmp_seq=1 ttl=255 time=66.661 ms
Итак, трафик есть - посмотреть на сам тунель можно командой

Код: Выделить всё

# setkey -D
Если тунеля нет - вы ничего не увитиде, а если есть - увидите 2 тунеля - туда и обратно
Циска же это покажет как один тунель

Код: Выделить всё

sh cry is sa
Теперь наше соединение защищено :-)

Траблешутинг:
1) Дебаг - на юниксе он включается в конфиге (на приведённом примере он включен с максимальной детализацией) а на cisco за это отвечает команда debug crypto isakmp
2) Внимательно относимся к параметрам - они должны совпадать с обеих сторон
3) У меня тунель не хотел подниматься, потому что у меня на cisco был уже другой линк с таким паролем (причём даже не работающий) - пришлось сменить пароль.
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Поднимаем маршрутизацию

Сообщение RomA »

Введение:
У нас есть труба. не просто труба, а защищёная. Всё что затекает в эту трубу шифруется. Теперь хотелось бы определить, что именно будет в неё затекать.

Теория:
Есть 2 подхода к маршрутизации - статическая и динамическая. Первая проще и быстрее, но вторая долговеченее и перспективнее. Я выбираю второе, как более подходящее решение для задачи, которую я хочу сделать и забыть как я это сделал и не держать в памяти что у меня там "где-то что-то есть" - пусть обю этом думаем протокол маршрутизации.
В качестве протокола маршрутизации выбираем OSPF - да, накладно для 2х хостов, но зато куча статей и на работе с ним сталкиваешься тоже.

Реализация:
Начинаем, как всегда, c Cisco - на интерфейсе interface Tunnel3 добавляем ip ospf mtu-ignore - то есть теперь он будет выглядеть так

Код: Выделить всё

interface Tunnel3
 ip address 172.16.0.1 255.255.255.248
 ip mtu 1400
 ip ospf mtu-ignore
 tunnel source Dialer1
 tunnel destination YYY.YYY.YYY.YYY
 tunnel protection ipsec profile CAipsec
А теперь сам протокол

Код: Выделить всё

router ospf 10
 router-id 255.255.255.255
 log-adjacency-changes
 network 172.16.0.0 0.0.0.7 area 0
 network 192.168.10.0 0.0.0.255 area 0
 default-information originate
router-id - это идентификатор маршрутизатора. чем он выше, тем больше шансов, что именно данный маршрутизатор выиграет выборы и станет главным. Я главным пытаюсь сделать cisco
network - тут описаны сети, которые я хочу анонсировать. Из картинки мы помним, что за cisco у меня домашняя сеть, которая должна видеть удалённый сервер, равно как и сервер должен видеть мою домашнюю сеть

С циской всё - переходим к серверу - устанавливаем пакет

Код: Выделить всё

# cd /usr/ports/net/quagga/
# make install clean
в файл /etc/rc.conf добавляем

Код: Выделить всё

quagga_enable="YES"
quagga_daemons="zebra ospfd"
После чего запускаем

Код: Выделить всё

# /usr/local/etc/rc.d/quagga start
Checking zebra.conf
OK
Starting zebra.
Checking ospfd.conf
OK
Starting ospfd.
Ну а дальше всё это настраиваетсся примерно так же как и на cisco
телнетом конектимся к серверу

Код: Выделить всё

# telnet localhost 2604
Trying ::1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.23.1).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password: 
пароль по умолчанию zebra
Первым делом сменим имя маршрутизатора

Код: Выделить всё

ospf> en
ospf# conf t
ospf(config)# hostname vps
Потом зададим свой пароль и скажем что пароли было бы неплохо шифровать

Код: Выделить всё

vps(config)# password NewPassword
vps(config)# service password-encryption
Теперь опишем сеть, которую хотим анонсировать

Код: Выделить всё

router ospf
 ospf router-id 172.16.0.2
 network 172.16.0.0/29 area 0
С этой стороны больше никаких приватных сетей у меня нет.
выйдем из решима конфигурирования и посмотрим увиделась ли cisco

Код: Выделить всё

vps# sh ip ospf neighbor 

    Neighbor ID Pri State           Dead Time Address         Interface            RXmtL RqstL DBsmL
255.255.255.255   1 Full/DROther      30.701s 172.16.0.1      gre0:172.16.0.2          0     0     0
vps# 
Видна. А какие подсети она видит?

Код: Выделить всё

vps# sh ip ospf route 
============ OSPF network routing table ============
N    172.16.0.0/29         [10] area: 0.0.0.0
                           directly attached to gre0
N    192.168.10.0/24       [11] area: 0.0.0.0
                           via 172.16.0.1, gre0

============ OSPF router routing table =============
R    255.255.255.255       [10] area: 0.0.0.0, ASBR
                           via 172.16.0.1, gre0

============ OSPF external routing table ===========
N E2 0.0.0.0/0             [10/1] tag: 10
                           via 172.16.0.1, gre0

vps# 
Вот тут видим что передалась информация о моей домашней сети 192.168.10.0/24 - навероное и работает? Сохраним конфиг и вернёмся в шел сервера

Код: Выделить всё

vps# wr
Configuration saved to /usr/local/etc/quagga/ospfd.conf
vps# exit
Connection closed by foreign host.
root@mail:/usr/local/etc/rc.d #
и пинганём какой нить IP в домашней сети

Код: Выделить всё

root@mail:/usr/local/etc/rc.d # ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2): 56 data bytes
64 bytes from 192.168.10.2: icmp_seq=0 ttl=63 time=67.668 ms
64 bytes from 192.168.10.2: icmp_seq=1 ttl=63 time=68.142 ms
Как видим всё задуманное работает.

Траблешутинг:
1)

Литература:
1) http://muff.kiev.ua/content/quagga-prev ... hrutizator
Ответить