ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Архив за Август, 2010

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Делалось по статье http://tuxnotes.ru/articles.php?a_id=18
Тут приведу её полностью, со своими комментариями и дополнениями [в квадратных скобках].

В конце статьи будут приведены мои конфиги сервера и клиента.
—————————————————————————————————————

Создание сервера OpenVPN в FreeBSD

Однажды передо мной предстала задача реализации безопасного доступа из внешнего мира к внутренней корпоративной сети. На выходе из корпоративной сети стоял FreeBSD 7.0, в качестве реализации был выбран OpenVPN.
В данной статье я на примере из личной практики опишу процесс создания OpenVPN сервера на системе FreeBSD, с возможностью подключения к нему удаленных пользователей (с различных операционных систем: Windows, Linux, MacOS etc.).

Настройка проводилась на системе FreeBSD версии 7.0, настройка на других версиях аналогична данной.

Адрес внутренней сети — 192.168.1.0/24

1. Установка OpenVPN, создание сертификатов и ключей

Устанавливаем OpenVPN из портов:

cd /usr/ports/security/openvpn
make install clean

Далее создаем сертификаты и ключи:

cd /usr/local/share/doc/openvpn/easy-rsa/
[при моей инсталляции требуемые файлы лежали в /usr/local/share/doc/openvpn/easy-rsa/2.0]

Редактируем файл vars, содержащий переменные окружения:

chmod +w vars
vi vars

[также нужно отчмодить и скрипты в каталоге, за исключением файлов *.cnf и текстовых Makefile и README]

затем добавляем в файле vars к переменной export KEY_DIR=$D/keys еще каталог server (для удобства). Должно получиться так:

export KEY_DIR=$D/keys/server
[я не добавлял дополнительный каталог]

Загружаем переменные в оболочку:

sh
. ./vars

[таким образом переменные у меня не загрузились и чтобы не терять время на разборы, я сделал экспорт всех переменных вручную. они нужны только для создания файлов сертификации и т.д.]

создаем каталог keys и в нем подкаталог server

mkdir -p keys/server

создаем сертификат для сервера:

chmod +x build-ca
./build-ca

Пример ввода данных:

#./build-ca
Generating a 1024 bit RSA private key
....................++++++
...++++++
writing new private key to 'ca.key'
----- You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----

Country Name (2 letter code) [UA]:UA
State or Province Name (full name) [Kiev]:Kharkov
Locality Name (eg, city) [Kiev]:Kharkov
Organization Name (eg, company) [x]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) []:server
Email Address [root@localhost]:

Создаем файлы index.txt и serial:

touch /usr/local/share/doc/openvpn/easy-rsa/keys/server/index.txt
echo «00»>/usr/local/share/doc/openvpn/easy-rsa/keys/server/serial

Затем создаем сертификат X.509 для сервера. Всё необходимо заполнить аналогично и добавить строки с указанием пароля и имени организации:

chmod +x build-key-server
./build-key-server server

#./build-key-server server
Country Name (2 letter code) [UA]:UA
State or Province Name (full name) [Kiev]:Kharkov
Locality Name (eg, city) [Kiev]:Kharkov
Organization Name (eg, company) [x]:server
Organizational Unit Name (eg, section) []:server
Common Name (eg, your name or your server's hostname) []:server
Email Address [root@localhost]:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: your_password
An optional company name []:server

Если все пункты выполнены в строгой последовательности, то далее должно быть предложено скриптом согласиться с созданием сертификатов.

Создаём ключ для клиента:

chmod +x build-key
./build-key client

# ./build-key client
Generating a 1024 bit RSA private key
........++++++
...................................++++++
writing new private key to 'client.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:UA
State or Province Name (full name) [NA]:Kharkov
Locality Name (eg, city) [BISHKEK]:Kharkov
Organization Name (eg, company) [OpenVPN-TEST]:server
Organizational Unit Name (eg, section) []:client
Common Name (eg, your name or your server's hostname) []:client
Email Address [me@myhost.mydomain]:root@localhost
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:your_password
An optional company name []:client

Стоит заметить, что поле organizationName должно совпадать с тем, которое мы ввели при создании сертификата сервера. В нашем случае это будет имя server.

Создаем ключ Диффи-Хелмана (необходим для безопасной авторизации двух сторон):

chmod +x build-dh
./build-dh

выходим из sh:

exit

Создаем ключ для tls-аутентификации:

openvpn —genkey —secret keys/server/ta.key

создаем каталоги для нашего openvpn-сервера:

cd /usr/local/etc/
mkdir openvpn
cd openvpn/
mkdir keys
mkdir ccd

Переходим в каталог /usr/local/etc/openvpn/keys и копируем в него необходимые для сервера ключи и сертификаты:

cd /usr/local/etc/openvpn/keyscp /usr/local/share/doc/openvpn/easy-rsa/keys/server/ca.crt
cp /usr/local/share/doc/openvpn/easy-rsa/keys/server/dh1024.pem
cp /usr/local/share/doc/openvpn/easy-rsa/keys/server/server.crt
cp /usr/local/share/doc/openvpn/easy-rsa/keys/server/server.key
cp /usr/local/share/doc/openvpn/easy-rsa/keys/server/ta.key

Когда сертификаты и ключи созданы, переходим к настройке OpenVPN-сервера.

2. Настройка сервера

в каталоге /usr/local/etc/openvpn создаем файл конфигурации нашего openvpn-сервера

touch server.conf

#указываем порт, на котором будет работать наш сервер
port 2000
# протокол будет использоваться udp (по идее он работает быстрее чем tcp)
proto udp
# используемый тип устройства и номер
dev tun0
#указываем файл CA
ca /usr/local/etc/openvpn/keys/ca.crt
#указываем файл с сертификатом сервера
cert /usr/local/etc/openvpn/keys/server.crt
#указываем файл с ключем сервера
key /usr/local/etc/openvpn/keys/server.key
#указываем файл Диффи Хельман
dh /usr/local/etc/openvpn/keys/dh1024.pem

#задаем виртуальный IP-адрес сервера и маску подсети, которые будут использоваться в нашем туннеле между сервером и удаленным клиентом
server 10.0.0.0 255.255.255.0

#указываем клиенту маршрут к серверу по виртуальному интерфейсу
push «route 10.0.0.0 255.255.255.0»

# указываем где хранятся файлы с настройками клиентов
client-config-dir ccd

# включаем TLS аутентификацию
tls-server
# указываем tls-ключ, и указываем 0 для сервера, а 1 для клиента
tls-auth keys/ta.key 0
# таймаут до реконекта
tls-timeout 120
auth MD5
# включаем шифрацию пакетов с использованием алгоритма симметричного шифрования Blowfish. Пока не было известно ни одно случая взлома данного алгоритма + он быстрее DES
cipher BF-CBC
[в моём случае шифрование не использовалась и поэтому этот пункт закомменчен]

#указывем, что каждые 10 секунд пинговать удаленный хост, и в случае если, в течении 120 секунд не будет ответа — то разрывать соединение
keepalive 10 120

# сжатие трафика
comp-lzo
[если эта опция используется на одной из сторон, она должна обязательно использоваться и другой стороной. иначе коннект будет рваться на этапе согласования MTU туннеля
между сервером и клиентом
]

# максимум клиентов
max-clients 100

#по умолчанию используется аутентификация пользователей по файлам сертификатов, то есть пользователь у себя хранит файлы сертификатов, соответственно пароль в таком случае не используется. На мой взгляд это не совсем безопасно (т.к. если кому-то удастся заполучить эти сертификаты, то он легко сможет получить доступ к нашей корпоративной сети). Я решил добавить к аутентификации по сертификатам еще и аутентификацию по паролю. Будет использоваться пара логин/пароль пользователя в системе FreeBSD ( которого необходимо заранее создать).
[разумеется, используется пользователь с паролем и без шелла — /usr/sbin/nologin
в случае автора эти логин-пароль при установлении соединения нужно ввести вручную, как сделать это автоматически рассмотрено ниже
]

Для добавления аутентификации по паролю подключаем плагин openvpn-auth-pam (который обычно идет вместе с пакетом OpenVPN):

plugin /usr/local/lib/openvpn-auth-pam.so loginuser nobody
group nobody

# Не перечитывать ключи после получения
# SIGUSR1 или ping-restart
persist-key
# Не закрывать и переоткрывать TUN\TAP
# устройство, после получения
# SIGUSR1 или ping-restart
persist-tun
# логирование (не забудьте создать дирректорию /var/log/openvpn/)
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log

# Уровень информации для отладки
verb 3

затем создаем в каталоге ccd файл с настройками удаленного клиента (имя файла должно строго совпадать с именем сертификата, то есть в нашем случае это имя client) следующего содержания:

push «route 192.168.1.0 255.255.255.0»

это сделано для того, чтобы когда пользователь подключался к нашему серверу, ему автоматически прописывался марштрут к внутренней офисной сети, которая находится за сервером.

добавляем в файл /etc/rc.conf следующие строчки, для атоматического запуска openvpn-сервера при загрузке системы

openvpn_enable=»YES»
openvpn_if=»tun»
openvpn_configfile=»/usr/local/etc/openvpn/server.conf»
openvpn_dir=»/usr/local/etc/openvpn»

Если у вас стоит фаервол, то не забудьте открыть в нем порт. У меня стоит pf, я добавляю следующие правила:

set skip on tun0
pass in inet proto udp from any to $ext_if port 2000 keep state
pass quick on tun0

Не забудьте указать в /etc/rc.conf:

gateway_enable=»YES»

для того, что что бы ваше сервер мог перенаправлять пакеты.

[если до этого момента gateway_enable не было в /etc/rc.conf, то что бы применить изменения без перезагрузки выполните: sysctl net.inet.ip.forwarding=1]

Все. На этом настройка нашего сервера закончена.

3. Настройка клиента

С сервера необходимо скопировать созданные ранее сертификаты, но не все, а только необходимые пользователю, а именно: ca.crt, client.crt, client.key, dh1024.pem, ta.key.

В рабочем каталоге OpenVPN на стороне клиента создаем папку keys, куда и копируем вышеприведенные файлы. Затем создаем конфигурационный файл с любым именем, например client.ovpn, со следующим содержимым:

dev tun
proto udp
remote 11.11.11.11
#(вместо 11.11.11.11 необходимо указать внешний IP вашего сервера)
port 2000 #(порт к которому устанавливать соединение)
client
resolv-retry infinite
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-client
tls-auth keys/ta.key 1
auth MD5

auth-user-pass
# команда, указывающая клиенту использовать авторизацию по паролю
cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun

#proxy 192.168.1.50:3128 #Раскомментируйте эту строчку, если вы работаете через прокси-сервер

status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3

На этом настройка закончена. Все конфиги брались с рабочего сервера.
Процесс создания OpenVPN-сервера на других системах (Debian, Gentoo, Slackware, *BSD) будет аналогичен данному.
Тем и хорош OpenVPN.

Алексей Михайлов
Специально для tuxnotes.ru

[Мои конфиги сервера и клиента]

——————————————————————————-

Сервер:

local 77.87.200.10
port 2000
proto tcp
dev tun0
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/server.crt
key /usr/local/etc/openvpn/keys/server.key
dh /usr/local/etc/openvpn/keys/dh1024.pem

server 172.20.20.0 255.255.255.0 #примечание: сервер забирает себе при организации тунеля первые два адреса из подсети
push «route 172.20.20.0 255.255.255.0»
client-config-dir ccd
tls-server
tls-auth keys/ta.key 0
tls-timeout 120
auth MD5
#cipher BF-CBC
keepalive 10 120
comp-lzo
max-clients 1
plugin /usr/local/lib/openvpn-auth-pam.so login
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3

#tun-mtu 1450 #примечание: можно регулировать размер MTU (должен быть одинаковым на сервере и на клиенте)

Клиент:

dev tun
proto tcp
remote 77.87.200.10
port 2000
client
resolv-retry infinite
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-client
tls-auth keys/ta.key 1
auth MD5
auth-user-pass
#cipher BF-CBC
ns-cert-type server
comp-lzo
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3

#tun-mtu 1450 #примечание: см. сервер
auth-user-pass keys/account #примечание: в текстовом файле account двумя отдельными строками хранятся логин и пароль
auth-nocache #примечание: чтобы логин-пароль не оставались на клиентской стороне в памяти

=========================================================================

[Конфиги OpenVPN (в режиме server) для сервера и клиента под Windows]

——————————————————————————-

Качаем OpenVPN клиента под Windows: http://swupdate.openvpn.net/community/releases/openvpn-2.1.4.tar.gz

Конфиг клиента Windows

C:\Program Files\OpenVPN\config\config.ovpn:

auth-user-pass
remote 191.XXX.XXX.1
port 2000
dev tun
dev-node MyTap
proto tcp
client
resolv-retry infinite
ca C:/Progra~1/OpenVPN/keys/ca.crt
cert C:/Progra~1/OpenVPN/keys/client.crt
key C:/Progra~1/OpenVPN/keys/client.key
tls-client
tls-auth C:/Progra~1/OpenVPN/keys/ta.key 1
auth MD5
cipher BF-CBC
ns-cert-type server
persist-key
persist-tun
verb 3
route-method exe
route-delay 30
ping 5
ip-win32 netsh

Конфиг клиента FreeBSD

/usr/local/etc/openvpn/server.conf:

local 191.XXX.XXX.1
port 2000
proto tcp
dev tun
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/server.crt
key /usr/local/etc/openvpn/keys/server.key
dh /usr/local/etc/openvpn/keys/dh1024.pem
topology subnet
server 10.8.0.0 255.255.255.0
route 10.8.0.0 255.255.255.248
client-config-dir ccd
tls-server
tls-auth keys/ta.key 0
tls-timeout 120
auth MD5
#cipher BF-CBC
keepalive 10 20
#ping-restart 20
#comp-lzo
max-clients 2
ifconfig-pool-persist ipp.txt 0
plugin /usr/local/lib/openvpn-auth-pam.so login
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
#log /var/log/openvpn/openvpn.log
verb 3
log-append /var/log/openvpn/openvpn.log
duplicate-cn
tun-mtu 1500
mssfix
#for udp packets
#fragment 1300

В этом файле мы назначаем нашим 2м клиентам (логины client и client2) статические IP-адреса, /usr/local/etc/openvpn/ipp.txt:
client,10.8.0.3
client2,10.8.0.2

затем в папке /usr/local/etc/openvpn/ccd создаем два файла, имена файлов соответствуют логинам клиентов, в которых описываем персональные настройки для клиентов:

/usr/local/etc/openvpn/ccd/client
push «ip-win32 manual»
ifconfig-push 10.8.0.3 255.255.255.248

/usr/local/etc/openvpn/ccd/client2
push «ip-win32 manual»
ifconfig-push 10.8.0.2 255.255.255.248

При этом в vipw клиенты заведены так:

client:$1$SOigCh/z$Kj8.cP166D9ecve5XoJMh0:65530:65530::0:0:account for openvpn client:/nonexistent:/usr/sbin/nologin
client2:$1$SOigCh/z$Kj8.cP166D9ecve5XoJMh0:65531:65531::0:0:account for openvpn client2:/nonexistent:/usr/sbin/nologin

При использовании Windows XP SP#2 может понадобиться следущее:

http://michaelellerbeck.com/2008/10/27/openvpn-client-hangs-on-dhcp-renewal-gets-apipa-address-instead/

1. Отключить windows firewall на TAP интерфейсе, через «Сетевое окружение» в свойствах соединения
2. Скачать devcon.exe с сайта Microsoft http://support.microsoft.com/kb/311272
3. Переименовать TAP ифейс в «сетевом окружении» в MyTap
4. Через консоль войти в папку с devcon.exe и выполнить:

devcon hwids =net @root\NET\*

Обычно выдаст имя  tap0901, которое будет использоваться ниже.
5. Создать два файла .bat в папке OpenVPN\config, название файлов должны начинаться с названия файла конфига (в моем примере это config.ovpn):
C:\Program Files\OpenVPN\config\config_pre.bat:
devcon enable tap0901
C:\Program Files\OpenVPN\config\config_down.bat:
devcon disable tap0901

Gui OpenVPN`а  будет запускать эти два файла при старте и закрытии соединения.

6. IP-адреса клиентов явно прописать на TAP интерфейсе MyTap (через «Сетевое окружение» в свойствах соединения) с маской как указано в конфиге сервера.

=========================================================================

[Конфиги OpenVPN (в режиме P2P) для сервера FreeBSD и клиента FreeBSD]

10.8.0.1 — тунельный IP-адрес сервера

10.8.0.2 — тунельный IP-адрес клиента

Конфиг сервера

local 191.XXX.XXX.1
port 2000
proto udp
dev tun0
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem

ifconfig 10.8.0.1 10.8.0.2
topology p2p
tls-server
tls-auth keys/ta.key 0
tls-timeout 120
auth MD5
#cipher BF-CBC
keepalive 10 20
#ping-restart 20
#comp-lzo
max-clients 1
plugin /usr/local/lib/openvpn-auth-pam.so login
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
log-append /var/log/openvpn/openvpn.log
#duplicate-cn  #указывается если мы хотим что бы под одним сертификатом могло ходить несколько клиентов
tun-mtu 1500
mssfix
#for udp packets
fragment 1300

#Назначаем нашему клиенту IP-адрес

push «ifconfig 10.8.0.2 10.8.0.1»

Конфиг клиента

dev tun0
proto udp
remote 191.XXX.XXX.1
port 2000
client

# Т.к. в конфиге сервера мы уже назначили клиенту IP-адрес, то строчку с ifocnfig тут можно закоментить

#ifconfig 10.8.0.2 10.8.0.1

resolv-retry infinite
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-client
tls-auth keys/ta.key 1
auth MD5
auth-user-pass
#cipher BF-CBC
keepalive 10 20
ns-cert-type server
#comp-lzo
persist-key
persist-tun
status /var/log/openvpn/openvpn_client-status.log
verb 3
auth-user-pass account
#auth-nocache
user nobody
group nobody
log-append /var/log/openvpn/openvpn_client.log
mssfix
tun-mtu 1500
fragment 1300

Комментарии

1. Если хочется назначать адрес OpenVPN-клиенту с сервера, то в server.conf нужно описать его в строке push, а на клиенте  (в конфиге) строчку ifconfig не писать вовсе.

2. Очень хорошо человек написал, что помогло нам решить проблему рассматриваемую в п. 4, процитирую его (оригинал: http://www.securitylab.ru/forum/forum21/topic42044/)

у OpenVPN есть два режима работы: а) p2p (point to point).
б) server mode.P2P режим был предусмотрен в OpenVPN изначально с самых ранних версий. Он предназначен только для одного соединения типа «точка — точка». Для примера можно привести ситуацию, в которой посредством OpenVPN необходимо соединить два офиса (возможно это как раз ситуация, аналогичная Вашей). В этом случае tun/tap, интерфейс OpenVPN соединения можно сравнить с обычным PPP интерфейсом, а для межсетевого обмена трафиком между peer’ами необходимо просто поднять на каждом из них соответсвующие маршруты через опцию route.

Server mode — это относительно новая фича, которая поддерживается в OpenVPN начиная с версии 2.0. Именно этот режим Вы и выбрали, включив в конфигурационный файл своего сервера опцию «server 10.8.0.0 255.255.255.0». Попробую объяснить в чем суть этого режима. OpenVPN работает через tun или tap интерфейсы. В отличие от p2p, server mode позволяет работать нескольким клиентам (peer’ам) одновременно c одним и тем же сервером, причем через один и тот же tun/tap интерфейс. В связи с этим изменяется и механизм межсетевой маршрутизации. На стороне клиента никаких изменений нет, но на стороне сервера добавляется дополнительный уровень инкапсуляции. Это значит, что при отправке пакета в клиентскую сеть, серверу недостаточно просто бросить его в tun0. Необходимо также каким-то образом указать какому именно клиенту данный пакет предназначен. Стандартным параметром route уже не обойтись т.к. он только направляет пакеты в tun0 к OpenVPN не указывая на конкретного peer’а-адресата. Здесь необходим дополнительный уровень маршрутизации. Эта маршрутизация реализована в OpenVPN посредством опции iroute совместно с опцией client-config-dir (см. ниже).

3.  Если после коннекта в логах клиента:

SENT CONTROL [server]: ‘PUSH_REQUEST’ (status=1)

а в логах сервера:

PUSH: Received control message: ‘PUSH_REQUEST’

и далее ничего  не происходит, а строчки повторяются и повторяются, но адреса на туннеле со стороны клиента не появляются, то попробуйте на сервере (в конфиге) push`уть любую строчку, если там ничего не push`иться (например IPшник клиента (ifcоnfig)), то можно push`уть например:

push «dhcp-option DNS 8.8.8.8»

4. Важное замечание, что если OpenVPN запускается в режиме server (см. комментарии п.2), то статический или динамический  маршрут, даже который смотрит правильно и напрямую в интерфейс tun, ни к чему не приведет, работать не будет.

Т.к. в режиме server получается point-to-multipoint линк и именно поэтому серверу надо уже объяснять какому клиенту за ифейсом tun нужно отправлять трафик. Поэтому туннельные интерфейсы могут пинговаться, а любые подсети за OpenVPN-клиентом нет, т.к. трафик не уедет в туннель.

Это хорошо видно по tcpdump, если с OpenVPN-сервера попробовать попинговать любой адрес из подсети, которая находится ЗА OpenVPN-клиентом.

С одной стороны (со стороны OpenVPN-сервера) трафик в tun виден, а до другой стороны трафик просто не доходит, а если быть точнее, то на самом деле трафик с OpenVPN-сервера просто не отправляется.

Ответ кроется в этом:

By default, when an OpenVPN client is active, only network traffic to and from the OpenVPN server site will pass over the VPN.

Что бы решить данную проблему нужно или переходить на режим p2p или прописать route и iroute на стороне OpenVPN-сервера (см. http://openvpn.net/index.php/open-source/documentation/howto.html):

Including multiple machines on the client side when using a routed VPN (dev tun)In a typical road-warrior or remote access scenario, the client machine connects to the VPN as a single machine. But suppose the client machine is a gateway for a local LAN (such as a home office), and you would like each machine on the client LAN to be able to route through the VPN.For this example, we will assume that the client LAN is using the 192.168.4.0/24 subnet, and that the VPN client is using a certificate with a common name of client2. Our goal is to set up the VPN so that any machine on the client LAN can communicate with any machine on the server LAN through the VPN.

Before setup, there are some basic prerequisites which must be followed:
The client LAN subnet (192.168.4.0/24 in our example) must not be exported to the VPN by the server or any other client sites which are using the same subnet. Every subnet which is joined to the VPN via routing must be unique.
The client must have a unique Common Name in its certificate («client2» in our example), and the duplicate-cn flag must not be used in the OpenVPN server configuration file.

First, make sure that IP and TUN/TAP forwarding is enabled on the client machine.

Next, we will deal with the necessary configuration changes on the server side. If the server configuration file does not currently reference a client configuration directory, add one now:
client-config-dir ccd

In the above directive, ccd should be the name of a directory which has been pre-created in the default directory where the OpenVPN server daemon runs. On Linux this tends to be /etc/openvpn and on Windows it is usually \Program Files\OpenVPN\config. When a new client connects to the OpenVPN server, the daemon will check this directory for a file which matches the common name of the connecting client. If a matching file is found, it will be read and processed for additional configuration file directives to be applied to the named client.

The next step is to create a file called client2 in the ccd directory. This file should contain the line:
iroute 192.168.4.0 255.255.255.0

This will tell the OpenVPN server that the 192.168.4.0/24 subnet should be routed to client2.

Next, add the following line to the main server config file (not the ccd/client2 file):
route 192.168.4.0 255.255.255.0

Why the redundant route and iroute statements, you might ask? The reason is that route controls the routing from the kernel to the OpenVPN server (via the TUN interface) while iroute controls the routing from the OpenVPN server to the remote clients. Both are necessary.

Next, ask yourself if you would like to allow network traffic between client2’s subnet (192.168.4.0/24) and other clients of the OpenVPN server. If so, add the following to the server config file.
client-to-client
push «route 192.168.4.0 255.255.255.0»

This will cause the OpenVPN server to advertise client2’s subnet to other connecting clients.

The last step, and one that is often forgotten, is to add a route to the server’s LAN gateway which directs 192.168.4.0/24 to the OpenVPN server box (you won’t need this if the OpenVPN server box is the gateway for the server LAN). Suppose you were missing this step and you tried to ping a machine (not the OpenVPN server itself) on the server LAN from 192.168.4.8? The outgoing ping would probably reach the machine, but then it wouldn’t know how to route the ping reply, because it would have no idea how to reach 192.168.4.0/24. The rule of thumb to use is that when routing entire LANs through the VPN (when the VPN server is not the same machine as the LAN gateway), make sure that the gateway for the LAN routes all VPN subnets to the VPN server machine.

Similarly, if the client machine running OpenVPN is not also the gateway for the client LAN, then the gateway for the client LAN must have a route which directs all subnets which should be reachable through the VPN to the OpenVPN client machine.

Т.е. возмем наш пример с конфигурацией в режиме server (рассмотренный выше) и допустим что за OpenVPN-клиентом, за его вторым интерфейсом с IP-адресом 192.168.1.1/24, находится подсеть 192.168.1.0/24.

Вот туннель установился, туннельные адреса прекрасно пингуются с обеих сторон, но вот мы берем и прописываем на OpenVPN-сервере маршрут:

route add 192.168.1.0/24 -iface tun0

запускаем  пинг до 192.168.1.1 и….. и ничего, пинга нет…… Почему ?

Для того что бы он появился ещё раз вникните в то, что написано выше и выполните следующие действия:

На OpenVPN-сервере в файле /usr/local/etc/openvpn/ccd/client (где, напомню вам, что название файла соответствует логину клиента) допишем:

iroute 192.168.1.0 255.255.255.0

Затем, там же на OpenVPN-сервере, поправим основной конфиг (server.conf) и добавим в него:

route 192.168.1.0 255.255.255.0

Перезапускайте OpenVPN с обоих сторон и запускайте пинг до 192.168.1.1 и он  будет в наличии.

Все конечно хорошо и здорово, НО есть нюанс…. А что если за OpenVPN-клиентом находится клиент подключенный по BGP и у него куча подсетей ??? Даже не смотря на то, что BGP сессия между OpenVPN-сервером и OpenVPN-клиентом установилась и маршруты приходят, трафик до подсетей анонсированых OpenVPN-клиентом через OpenVPN-сервер не пойдет, т.к. отсутствуют строчки с route и iroute в настройках OpenVPN-сервера. Варианта 2: а) переходить с режима server в режим p2p б) каждый раз описывать на OpenVPN-сервере route и iroute с подсетями клиента.

Как мне кажется, что если вы все же озадачились поднятием BGP через тунель OpenVPN, то проще будет перевести OpenVPN-сервер в режим p2p.

Ссылки

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.

Автор: Будимиров Максим (madmax (at) subnets.ru) и Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 4,60 из 5)
Загрузка...
Отправить на почту Отправить на почту

ЗАМЕТКА

В рамках поднятия IPTV в сети столкнулись с приставкой D-Link DIB-120.

Симптомы

Приставка D-Link DIB-120 при загрузке показывает логотип Alpha и потом черный экран и больше ничего.

Выяснилось

Компания Dlink завезла в Россию партию DIB-120, залитых безбраузерной прошивкой.
Отличить такую приставку можно по ее серийному номеру. Он начинается с Р1Т818.
В приставке прошит статический IP-адрес 192.168.1.1 и она слушает мультикаст группу с адреса 239.60.8.1:37732

Решение проблемы

Существуют два способа решения проблемы:

1. Если у вас есть сервер с OS Linux, то можно запустить вещание файла прошивки на  мультикаст адрес 239.60.8.1:37732 с помощью проги amfus.

Положите файлы прошивки и amfus в одну папку, затем создайте в этой же папке конфиг:

DIB120.conf:

a0_rootfs a-fs-cramfs.img V4.03.009 14299136 e6d0e447beed049bb2d41798721f29d7
kernel vmlinuz-7402c0 V4.03.009 1602656 7cc07013cc6ff0ea8f078920175791c1

Затем запустите:

./amfus -d DIB120.conf -m 239.60.8.1:37732 -i 1000 -t 32

2. Можно закачать прошивку с помощью HTTP сервера.  Как это сделать было описано в этой статье, процитирую ее:

По умолчанию IP STB D-Link DIB-120 поставляется без прошивки (при загрузке отображается ALPHA и черный экран).

На форумах говорят, что это «бракованная» партия, а на самом деле это «чистый» аппарат без странички.

Чтобы исправить это можно загрузить в него следующую прошивку 4.04.013_multicast.rar (доступна обновленная прошивка для DIB-120 от 6.11.09 4.05.004_multicast.rar).

Для перепрошивки понадобиться любой WEB сервер (например Apache).

В корневую директорию сервера необходимо сохранить два файла, которые находятся в архиве (a-fs-cramfs.img и vmlinuz-7402c0).

В качестве примера установлен IP сервера (компьютера с установленным Apache) – 192.168.1.2.

Устройство по умолчанию имеет IP 192.168.1.1, для этого в командной строке нужно выполнить команду telnet 192.168.1.1 на запрос имени пользователя необходимо указать root, а пароль пустой.

В командной строке DIB-120 нужно выполнить следующие команды:

cd /tmp

wget http://192.168.1.2/vmlinuz-7402c0
eraseall /dev/mtd2 ; dd if=vmlinuz-7402c0 of=/dev/mtd2

wget http://192.168.1.2/a-fs-cramfs.img
eraseall /dev/mtd0 ; dd if=a-fs-cramfs.img of=/dev/mtd0

reboot

Внимание! После перезагрузки пароль root’a будет изменен (см. файл password.txt в архиве), пароль можно изменить выполнив команду passwd

Оригинал статьи тут: http://cworld.org.ua/2009/09/16/firmware-d-link-dib-120/

Большое спасибо Hades за данную публикацию,  а то у меня FreeBSD и я уже чуть было не озадачился поднятием эмулятора Linux 🙂

Сделал все как описано в статье, за исключением того, что поднял не Apache, а по быстрому поставил  nginx (/usr/ports/www/nginx).

Все получилось, после прошивки и ребута приставка начала стучаться по DHCP и успешно получила от моего сервера DHCP IP-адрес.

Вот конфиг  nginx.conf:

user   www www;
worker_processes  1;

error_log  logs/error.log;
pid         /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       192.168.1.2:80;
        server_name  localhost;

        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }
}

Вот пример вывода с приставки при перепрошивке:

# cd /tmp
# wget http://192.168.1.2/vmlinuz-7402c0
Connecting to 192.168.1.2[192.168.1.2]:80
vmlinuz-7402c0 100% |*****************************| 1565 KB --:--:-- ETA
# eraseall /dev/mtd2 ; dd if=vmlinuz-7402c0 of=/dev/mtd2
Erasing 128 Kibyte @ 1e0000 -- 93 % complete.
3130+1 records in
3130+1 records out
# wget http://192.168.1.2/a-fs-cramfs.img
Connecting to 192.168.1.2[192.168.1.2]:80
a-fs-cramfs.img 100% |*****************************| 13964 KB 00:00:00 ETA
# eraseall /dev/mtd0 ; dd if=a-fs-cramfs.img of=/dev/mtd0
Erasing 128 Kibyte @ 11e0000 -- 99 % complete.

27928+0 records in
27928+0 records out
#
# reboot
# Connection closed by foreign host.

Уверен, что данная заметка пригодится не только мне.

Автор: Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 4,75 из 5)
Загрузка...
Отправить на почту Отправить на почту

IPIP tunnel Juniper MX480 & M7i Routers + static route via IPIP tunnel interface

Появилась тут задача прокинуть между Juniper MX480 и FreeBSD сервером IPIP туннель и пророутить через него подсеть IP-адресов.

Ось: JUNOS Base OS Software Suite [8.5R3.4]

Как водится начал с чтения документации:

Но как и в предыдущей статье толи я  тупой, толи лыжи не едут, толи они так пишут мануалы  🙁

Расскажу как я решил сию «проблему» идя по своим «шагам», т.к. уверен. что не только я, а и кто-то ещё натолкнется на непонимание мануала и кучу, возникающих по мере чтения, вопросов, которые остаются без ответов.

Сначала возник вопрос: «а где взять необходимый интерфейс в джунике ?».

Читаю Tunnel Services Overview:

ipip
Internally generated IP-over-IP interface. This interface is generated by the JUNOS software to handle IP-over-IP encapsulation. It is not a configurable interface.

Смотрю есть ли у меня на джунипере такой. Да  есть, обнаружен интерфейс:

root@juniper> show interfaces ipip

Physical interface: ipip, Enabled, Physical link is Up
Interface index: 11, SNMP ifIndex: 9
Type: IPIP, Link-level type: IP-over-IP, MTU: Unlimited, Speed: Unlimited
Device flags   : Present Running
Interface flags: SNMP-Traps
Input packets : 0
Output packets: 0

Но меня очень напрягают слова «It is not a configurable interface«. Смотрю далее:

ip-0/0/0
Configurable IP-over-IP encapsulation (also called IP tunneling) interface. IP tunneling allows the encapsulation of one IP packet over another IP packet.

Вот это уже ближе, хотя бы указано, что он «Configurable«, но что делать если по show interfaces такого интерфейса нет ??? Блин, приплыли….

Решил попробовать все же отконфигурить интерфейс ipip. Конфигурю его так:
root@juniper# show interfaces ipip

unit 0 {
    tunnel {
        source XX.XX.XX.XX;
        destination YY.YY.YY.YY;
    }
    family inet {
        address 10.255.255.5/30;
    }
}

Где XX.XX.XX.XX это один из внешних IP-адресов джуника, YY.YY.YY.YY внешний IP-адрес FreeBSD сервера, а 10.255.255.5 IP-адрес на туннеле со стороны джунипера.

Коммитим конфигурацию на джунипере и идем на FreeBSD. Конфигуим её:

ifconfig gif0 create mtu 1480 link2 tunnel YY.YY.YY.YY  XX.XX.XX.XX 10.255.255.5 10.255.255.6 netmask 255.255.255.252

С IP-адресами все тоже самое, за исключением того, что ессно они «зеркальные», т.е. идут в другом порядке. 10.255.255.6 IP-адрес на туннеле со стороны FreeBSD.

После этого посмотрим создался ли туннель:
ifconfig gif0

gif0: flags=c051 mtu 1480
        tunnel inet YY.YY.YY.YY --> XX.XX.XX.XX
        inet 10.255.255.6 --> 10.255.255.5 netmask 0xfffffffc

Пробую попинговать с обеих сторон туннельные адреса (10.255.255.X) и результат успешен, с двух сторон пинг ходит.

«УРА !!! Задача решена и так просто !»  — подумал я, но не тут то было…….

Мне же необходимо выполнить вторую часть задачи, а именно пророутить через созданный туннель подсеть  IP-адресов.

Делаю это, добавляю мой статический маршут для подсети, которую я хочу роутить через туннель. Прописываю маршрут в секции routing-options static:

route ZZ.ZZ.ZZ.0/29 {
    next-hop 10.255.255.6;
    retain;
}

коммичу изменения и получаю не совсем ожидаемый результат 🙁

А именно, что с джунипера любой IP-адрес из пророученной подсети пингуется, а вот если пробовать попинговать этот же адрес снаружи, то получаем ответ от джунипера о недоступности сети.

Хм…. что за хрень ? Маршрут для подсети в таблице маршрутизации присутствует и по команде:

root@juniper> show route terse

маршрут виден….. Получается что джунипер отказывается роутить (форвардить) пакеты до этой подсети через себя. Почему ? Потому что ipip «It is not a configurable interface» ?

Лезу в гугл и нахожу похожую проблему: PFE-forwarded IPv6. Не смотря на то, что тут IPv6, а у меня вопрос по IPv4, ответ был найден:

Otherwise the ipip.0 tunnel is only from the RE, which can’t forward transit traffic.

Ну собственно так себя мой джуник и ведет, не форвардит транзитный трафик….

Но я не сдался, лезу снова курить мануалы….. Смотрю в пример «Example: Configuring Unicast Tunnels«:
Configure two unnumbered IP-IP tunnels:

[edit interfaces]
ip-0/3/0 {

    unit 0 {

        tunnel {
            source 192.168.4.18;
            destination 192.168.4.253;
        }

        family inet;
    }

    unit 1 {

        tunnel {
            source 192.168.4.18;
            destination 192.168.4.254;
        }

        family inet;
    }

}

To configure a numbered tunnel interface, include an address under family inet:

[edit interfaces]
ip-0/3/0 {
    unit 0 {
        tunnel {
            source 192.168.4.18;
            destination 192.168.4.253;
        }
        family inet {
            address 10.5.5.1/30;
        }
    }
    unit 1 {
        tunnel {
            source 192.168.4.18;
            destination 192.168.4.254;
        }
        family inet {
            address 10.6.6.100/30;
        }
    }
}

И снова задаюсь вопросом, а откуда они взяли интерфейс ip-0/3/0 ? Почему у них такой интерфейс есть,а у меня нет ! Ведь написано ж, что в MX-серии это встроено:

The MX-series routers support Dense Port Concentrators (DPCs) with built-in Ethernet ports and therefore do not support Tunnel Services PICs. To create tunnel interfaces on an MX-series router, you configure a DPC and the corresponding Packet Forwarding Engine to use for tunneling services at the [edit chassis] hierarchy level. You also configure the amount of bandwidth reserved for tunnel services. The JUNOS software creates tunnel interfaces on the Packet Forwarding Engine. To create tunnel interfaces on MX-series routers, include the following statements at the [edit chassis] hierarchy level

Так, получается, что я должен взять реальный интерфейс и настроить его для работы с tunneling services. Но стоп, у меня нет свободных интерфейсов, все что есть сейчас работают как Ethernet интерфейсы.

Возникает новый резонный вопрос,  а что будет если на отконфигуренном Ethernet интерфейсе добавить настройки и для tunneling services ?

Нашел ответ на этот вопрос вот тут:

The Packet Forwarding Engine of a 10-Gigabit Ethernet 4-port DPC supports either tunnel interfaces or Ethernet interfaces, but not both.

Мда…. опять приплыли… не может интерфейс быть и тунельным и эзернет интерфейсом 🙁

Неужели сделать то что мне надо невозможно если нет свободного физического интерфейса ?

М.б. меня не отпускали слова «встроенный», а м.б. остатки памяти напомнили текст предыдущей статьи, я не знаю, но полез я выполнять команду:

root@juniper> show chassis hardware

...........
FPC 5            REV 08   XXX-XXXXXX   KDXXXX            DPCE 4x 10GE R
...........
PIC 3                   BUILTIN      BUILTIN           1x 10GE(LAN/WAN)

Опа ! А это уже кое что. Встроенный интерфейс fpc 5 pic 3.
Такс… Снова возникает вопрос: «А м.б. именно этот интерфейс и поможет нам создать туннельный интерфейс ?»

Ответа на этот вопрос я так и не нашел, ни в мануалах, ни в гугле, но следуя тому что уже прочел в мануалах и банальной логике решил попробовать.

Для начала сношу все настройки с интерфейса ipip, который я конфигурил выше, затем приступаю к действиям по мануалу:

root@juniper# set chassis fpc 5 pic 3 tunnel-services bandwidth 10g

Получил в конфиге:
root@juniper# show chassis

fpc 5 {
    pic 3 {
        tunnel-services {
            bandwidth 10g;
        }
    }
}
network-services ip;

Так, интерфейс под tunnel services я задал, идем далее.

Попробую создать сам интерфейс:
root@juniper# set interfaces ip-5/3/0 unit 0

Ошибок эта команда не вызвала и интерфейс появился в конфиге. Значит я иду в правильном направлении.

Зададим IP-адреса, по которым и будет строится IPIP туннель:
root@juniper# set interfaces ip-5/3/0 unit 0 tunnel source XX.XX.XX.XX destination YY.YY.YY.YY

Теперь зададим IP-адрес на конце туннеля со стороны джунипера:
root@juniper# set interfaces ip-5/3/0 unit 0 family inet address 10.255.255.5/30

Смотрим что получилось:
root@juniper# show interfaces ip-5/3/0

unit 0 {
    tunnel {
        source XX.XX.XX.XX;
        destination YY.YY.YY.YY;
    }
    family inet {
        address 10.255.255.5/30;
    }
}

Выполняем заветную:
root@juniper# commit check
и получаю радостный для меня ответ:

configuration check succeeds

Ну вот вроде и все. Коммитим изменения и смотрим.

Вот теперь все работает как надо и поставленная задача полностью выполнена:

  • IPIP туннель между  Juniper и FreeBSD создан и работает
  • подсеть IP-адресов статически пророучена через туннель
  • джунипер  форвардит трафик до пророученной статическим маршрутом через IPIP туннель подсети

——

Добавлено 19.04.2011

Потребовалось поднять IPIP туннель, но уже на Juniper M7i .

Ось:  JUNOS Base OS Software Suite [9.4R1.8]

Производим почти аналогичные действия:

root@m7i> show chassis hardware

...........
FPC 1                                                    E-FPC
  PIC 2                   BUILTIN      BUILTIN           1x Tunnel

root@m7i# show interfaces ip-1/2/0

unit 0 {
    tunnel {
        source XX.XX.XX.XX;
        destination YY.YY.YY.YY;
    }
    family inet {
        address 10.255.255.5/30;
    }
}

После commit все завелось, я даже проверил работу BGP по IPIP туннелю — усё арбайтн.

——

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.

 

Добавлено 21.07.2011

З.Ы.Ы. Как в последствии выяснилось реальный интефейс все же занимается ( как минимум на MX480) 🙁

Когда я писал статью в том порту, на котором производилась настройка, реального PIC`а (в FPC 5 pic-slot 3) не было, т.е. порт был пуст.

Как выглядел список hardware на MX480 до установки реального PIC`а :

Hardware inventory:
Item             Version  Part number  Serial number     Description
......
  PIC 3                   BUILTIN      BUILTIN           1x 10GE(LAN/WAN)
Fan Tray                                                 Left Fan Tray

# show chassis fpc pic-status

Slot 5   Online       DPCE 4x 10GE R
  PIC 0  Online       1x 10GE(LAN/WAN)
  PIC 1  Online       1x 10GE(LAN/WAN)
  PIC 2  Online       1x 10GE(LAN/WAN)
  PIC 3  Online       1x 10GE(LAN/WAN)

#show chassis pic fpc-slot 5 pic-slot 3

FPC slot 5, PIC slot 3 information:
  Type                             1x 10GE(LAN/WAN)
  State                            Online
  PIC version                  0.0
  Uptime                         196 days, 4 hours, 57 minutes, 6 seconds

Именно столько проработал туннель 🙂
При этом на самом PIC`е линка не было, в списке интерфейсов он не значился, горела только лампочка «tunnel». Иными словами вновь вставленный PIC не работал.

Пришлось сносить все изменения связанные с туннелем и после этого вот что стало видно:
#show chassis hardware

Hardware inventory:
Item             Version  Part number  Serial number     Description
......
  PIC 3                   BUILTIN      BUILTIN           1x 10GE(LAN/WAN)
    Xcvr 0       REV 02   740-014279   T09J61368         XFP-10G-LR
Fan Tray                                                 Left Fan Tray

Интерфейс появился в конфигурации, лампочка «tunnel» погасла и появился линк.

Так что имейте это в виду…

Автор: Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 3,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

С первого момента как я познакомился с оборудованием Juniper серии «M» я хотел попробовать фичу с логическими системами, т.е. создать роутер внутри роутера, но все как то руки не доходили. То времени не было, то свободной автономки с адресами.

И вот оно случилось, снова появилась свежеполученная AS с блоком адресов и я все же выкроил время для теста.

Пишу данный пост, что бы потом самому не забыть как это делалось, т.к. м.б. я тупой или жара так влияет на мозг человека, но как законектить основную систему с виртуальной я догнал не сразу, даже после того как «покурил» мануалы на juniper.net.

Дано

  • Juniper M7i
  • на нем уже поднят BGP с несколькими апстримами

Задача

Сделать виртуальный роутер (logical-system) внутри реального роутера, соединить их по протоколу BGP и проанонсировать новую ASку в Инет.

Connect Logical System BGP to Main system BGP.

Решение

Logical System Overview

Logical systems perform a subset of the actions of a physical router and have their own unique routing tables, interfaces, policies, and routing instances. A set of logical systems within a single router can handle the functions previously performed by several small routers.

The following are supported on logical systems:
Open Shortest Path First (OSPF), Intermediate System-to-Intermediate System (IS-IS), Routing Information Protocol (RIP), RIP next generation (RIPng), Border Gateway Protocol (BGP), Resource Reservation Protocol (RSVP), Label Distribution Protocol (LDP), static routes, various multicast protocols, and IP version 4 (IPv4) and version 6 (IPv6) are supported at the [edit logical-systems protocols] hierarchy level.
Basic Multiprotocol Label Switching (MPLS) for core provider router functionality is supported at the [edit logical-systems protocols mpls]] hierarchy level.
All policy-related statements available at the [edit policy-options] hierarchy level are supported at the [edit logical-systems policy-options] hierarchy level.
Most routing options statements available at the [edit routing-options] hierarchy level are supported at the [edit logical-systems routing-options] hierarchy level. Only the route-record statement is not supported at the [edit logical-systems routing-options] hierarchy level.
Graceful Routing Engine switchover (GRES) is supported.
You can assign most interface types to a logical system, including SONET interfaces, Ethernet interfaces, Asynchronous Transfer Mode (ATM) interfaces, ATM2 interfaces, Channelized Q Performance Processor (QPP) interfaces, aggregated interfaces, link services interfaces, and multilink services interfaces.
Source class usage, destination class usage, unicast reverse path forwarding, class of service, firewall filters, class-based forwarding, and policy-based accounting work with logical systems when you configure these features on the physical router.
Multicast protocols, such as Protocol Independent Multicast (PIM) and Distance Vector Multicast Routing Protocol (DVMRP) are supported at the [edit logical-systems logical-system-name protocols] hierarchy level. Rendezvous point (RP) and source designated router (DR) functionality for multicast protocols within a logical system is also supported.
The Bidirectional Forwarding Protocol (BFD) is supported.

The following restrictions apply to logical systems:
You can configure a maximum of 15 logical systems on one physical router.
The router has only one configuration file, which contains configuration information for the physical router and all associated logical systems. Master users can access the full configuration. However, logical system users can access only the portion of the configuration related to their particular logical system.
All configuration commits performed by a logical system user are treated as commit private. For more information on the commit private command, see the JUNOS System Basics Configuration Guide.
If a logical system experiences an interruption of its routing protocol process (rpd), the core dump output is saved in a file in the following location: /var/tmp/rpd_logical-system-name.core-tarball.number.tgz. Likewise, if you issue the restart routing command in a logical system, only the routing protocol process (rpd) for the logical system is restarted.
If you configure trace options for a logical system, the output log file is stored in the following location: /var/tmp/logical-system-name.
The following Physical Interface Cards (PICs) are not supported with logical systems: Adaptive Services PIC, ES PIC, Monitoring Services PIC, and Monitoring Services II PIC.
Sampling, port mirroring, IP Security (IPsec), and Generalized MPLS (GMPLS) are not supported.
Label-switched path (LSP) ping and traceroute for autonomous system (AS) number lookup are not supported.
If you configure multiple logical systems, you can configure a VPLS routing instance only for the first logical system configured at the [edit logical-systems logical-system-name routing-instances instance-name protocols vpls] hierarchy level.

Начинаем «курить» мануалы:

Более-менее понятно, что соединить осноной роутер (main) с виртуальным (logical-system) можно через интерфейсы. Но как ?

Читаем мануалы далее и выясняем, что сделать это можно или с помощью петли, т.е. тупо соединив проводом два физических порта  маршрутизатора (один порт будет принадлежать реальной системе, а второй порт виртуальной) или с помощью «Logical Tunnel Interface«.

Соединять с помощью провода между двумя реальными интерфейсами роутера я не мог, в виду отсутствия свободных, остается «логика»:

On M Series and T Series routers, logical tunnel interfaces allow you to connect logical systems, virtual routers, or VPN instances. The router must be equipped with a Tunnel Services PIC or an Adaptive Services Module (only available on M7i routers)

Такс и где же этот встроенный Tunnel Services PIC ?

А вот он:

root@juniper> show chassis hardware

FPC 1                                                    E-FPC
  PIC 2                   BUILTIN      BUILTIN           1x Tunnel

Что видно в интерфейсах:
root@juniper> show interfaces lt-1/2/0

Physical interface: lt-1/2/0, Enabled, Physical link is Up
  Interface index: 142, SNMP ifIndex: 191
  Type: Logical-tunnel, Link-level type: Logical-tunnel, MTU: Unlimited, Speed: 800mbps
  Device flags   : Present Running
  Interface flags: Point-To-Point SNMP-Traps
  Link flags     : None
  Physical info  : 13
  Current address: 00:1f:12:d5:a0:bc, Hardware address: 00:1f:12:d5:a0:bc
  Last flapped   : 2010-07-17 00:24:41 MSD (2w6d 10:13 ago)
  Input rate     : 3088 bps (4 pps)
  Output rate    : 3088 bps (3 pps)

Получается, что все что нам нужно для выполнения задачи присутствует.

Прочитав Configuring Logical Tunnel Interfaces меня напрягли слова:

To connect two logical systems, you configure a logical tunnel interface on both logical systems.

«Эмм…. две логические…..» подумал я, а как же быть если я собираюсь законектить не две логические системы, а логическую и реальную ?

Смотрю на картинку  в примере настройки (Example: Configuring Logical Systems) и вижу что опять же виртуальные роутеры соединяются с реальными, но нигде реальные роутеры не соединяются с виртуальнфми внутри себя. Так делать нельзя ? Хм… как минимум странно.

Зрим в пример туннельного интерфейса:

lt-fpc/pic/port {
     unit logical-unit-number {
          encapsulation encapsulation;
          peer-unit unit-number; # peering logical system unit number
          dlci dlci-number;
          family (inet | inet6 | iso | mpls);
    }
}

Хм…. вроде все понятно, а вроде и нет ? Что такое peer-unit и какой номер указывать ? Читаем о peer-unit:

Syntax
peer-unit unit-number;
Hierarchy Level
[edit interfaces interface-name unit logical-unit-number],
[edit logical-systems logical-system-name interfaces interface-name unit logical-unit-number]
Release Information

Statement introduced before JUNOS Release 7.4.
Description

Configure a peer relationship between two logical systems.
Options

unit-number—Peering logical system unit number.
Usage Guidelines

See Configuring Logical Tunnel Interfaces.
Required Privilege Level

interface—To view this statement in the configuration.

interface-control—To add this statement to the configuration

Стало понятнее ? Мне нет….

Дальнейшее «курение» мануалов просветления в этом вопросе не принесло. Практика, попытки сделать хоть что то, тоже. Все они заканчивались выводом разнообразных ошибок при коммите (commit), например:

peer-unit needs to be configured for logical tunnel interface
error: configuration check-out failed
encapsulation needs to be configured for logical tunnel interface
error: configuration check-out failed

Или о том что интерфейсы реальной системы пересекаются с виртуальной:

Interface lt-1/2/0.1 is also configured at the top-level
error: configuration check-out failed

Либо реальная система не видела виртуальную (не было пинга).

Ну что ж, обратимся к великому гуглу ! Но толи я не так искал, тли не так читал 🙂 не знаю, но ответа на свой вопрос я по прежнему не получил.

Листая форум на juniper.net, а затем  повторное прочтение Configuring Logical Tunnel Interfaces навели меня на мысль о том, что нужно и в реальном (main) роутере и в виртуальном настраивать именно туннельный интерфейс и «натравливать» их друг на друга.

Ну что ж, попробуем. Начнем с интерфейсов.

Для начала создадим наш логический роутер (для примера имя ему дадим virtual-bgp-router), переходим в режим конфигурации и начинаем:

[edit]
root@juniper#
set logical-systems virtual-bgp-router

Затем создадим наш туннельный интерфейс, я возьму номер 999, вы ессно можете указать любой понравившийся вам номер юнита, которого ещё нет на этом интерфейсе:

[edit]
root@juniper#
set logical-systems virtual-bgp-router interfaces lt-1/2/0 unit 999

Зададим инкапсуляцию:

[edit]
root@juniper#
set logical-systems virtual-bgp-router interfaces lt-1/2/0 unit 999 encapsulation ethernet

Зададим с каким юнитом основного (main) роутера  мы будем соединяться:

[edit]
root@juniper#
set logical-systems virtual-bgp-router interfaces lt-1/2/0 unit 999 peer-unit 333

Добавим IP-адрес на интерфейс:

[edit]
root@juniper#
set logical-systems virtual-bgp-router interfaces lt-1/2/0 unit 999 family inet address 192.168.1.2/24

Так, с виртуалкой  пока закончили, теперь нужно реальному роутеру объяснить что к чему. Настроим туннельный  интерфейс и на нем.

[edit]
root@juniper#
set interfaces lt-1/2/0 unit 333

Создали  unit 333, тот юнит, который мы указали при создании туннельного интерфейса в логическом роутере, в кач-ве peer-unit.

Затем все действия точно такие же как делали выше, зададим инкапсуляцию:

[edit]
root@juniper#
set  interfaces lt-1/2/0 unit 333 encapsulation ethernet

Зададим с каким юнитом виртуального роутера мы будем соединяться:

[edit]
root@juniper#
set interfaces lt-1/2/0 unit 333 peer-unit 999

Добавим IP-адрес на интерфейс:

[edit]
root@juniper#
set interfaces lt-1/2/0 unit 333 family inet address 192.168.1.1/24

Ну вот, в первом приближении и все. Коммитим конфигурацию и смотрим, все ли работает как надо.

Для начала проверим есть ли у нас пинг с реального роутера на виртуальный:

[edit]
root@juniper#
run ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.910 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.802 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.839 ms
^C
— 192.168.1.2 ping statistics —
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.802/0.850/0.910/0.045 ms

Затем наоборот, из виртуального на реальный:
[edit]
root@juniper#
run ping logical-system virtual-bgp-router 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=0.932 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.842 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.866 ms
^C
— 192.168.1.1 ping statistics —
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.842/0.880/0.932/0.038 ms

Пинг в наличии ! А значит и все остальное, по нашей задаче BGP пиринг между реальной системой и виртуальной, уже можно воплощать в жизнь.

Как поднимать BGP на Juniper в этой статье я расписывать не буду, т.к. уже делал это в статье «Настройка протокола BGP на оборудовании Juniper«, скажу лишь что в виртуальном роутере все настраивается точно так же как и в реальном, т.е. переходим в режиме редактирования в «ветку» своего виртуального роутера:

[edit]
root@juniper#
edit logical-systems virtual-bgp-router

Забываем о том, что это виртуалка и настраиваем так же как обычный роутер. Т.е. поехали:

[edit]
root@juniper#
set protocols bgp local-as 12345

где «12345»  есть наша свежеполученная AS, затем настраиваем BGP пир (создаем BGP соседа  192.168.1.1 (реальный роутер) и т.д. и т.п.

После того как вы закончите с настройкой протокола BGP на виртуальном роутере, не забудьте создать BGP соседа (192.168.1.2) и в реальном роутере.

По итогу получаем самое обычное взаимоотношение по протоколу BGP между реальным роутером и виртуальным 😉

Реальный роутер видит по BGP виртуальный и получает от него один свой префикс от новой ASки:
root@juniper> show bgp summary | match 192.168.1.2

192.168.1.2 12345 2629 77689 0 0 01:40:19 1/1/1/0 0/0/0/0

Ну и наборот, виртуальный видит реальный роутер, который сгружает ему full-view таблицу:
root@juniper> show bgp summary logical-system virtual-bgp-router

Groups: 1 Peers: 1 Down peers: 0

Peer                     AS      InPkt     OutPkt    OutQ   Flaps Last Up/Dwn State|#Active/Received/Accepted/Damped...
192.168.1.1         54321      77697       2639       0       0    01:44:37 323070/323070/323070/0  0/0/0/0

З.Ы. Внутри виртуального роутера можно создавать и реальные интерфейсы этого роутера, таким образом вы можете связать виртуальный роутер с любой внешней железкой.

З.Ы.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.

Автор: Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 2,67 из 5)
Загрузка...
Отправить на почту Отправить на почту