Привет, Хабр! Так уж получилось, что в сети довольно мало документации по работе с региональными интернет-регистраторами (RIR) по получению IP-адресов, а также дальнейшей настройке BGP маршрутизаторов. Зачем закупаться оборудованием и разбираться с настройкой самим? Да потому что это экономит деньги: в нашем случае речь шла о почти 10к долларов ежемесячно. Мы окупили затраты на оборудование за два с небольшим месяца; по стоимости его закупка обошлась в три месяца аренды у Microsoft. В статье рассмотрим наш кейс снижения расходов на инфраструктуру через подключение собственного железа к BGP шлюзу.



Есть несколько вводных, задающих пограничные условия, которые требуют отдельного внимания:

  1. BGP-роутер физически находится вне сети серверной инфраструктуры.
  2. Физические каналы связи сервера предоставлены российскими ISP.

Последний пункт особенно важен, потому что небезызвестный РКН частенько исполняет блокировки целыми подсетями, что может создать ряд сложностей с доступом к ресурсу со стороны зарубежных пользователей, которые при подключении могут использовать маршруты, проходящие через пиры с заблокированными РКН IP-адресами.

Все изложенное в статье так или иначе будет привязано к виду деятельности, связанному с email-сервисами.

Проблема


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

Возможные зоны ответственности:

  1. Железо: где находится физически и кто отвечает за его работоспособность?
  2. Провайдер: кто предоставляет каналы связи?
  3. IP: кто владеет IP-адресами?
  4. Домены: кто представлен в whois и кто регистратор?

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

Сосредоточимся на IP-адресах, так как именно они являются камнем преткновения для некоторых спорных вопросов:

  1. Когда ваш провайдер сообщает, что из вашей сети было установлено соединение с кем-то, кто находится в торрент-сети (или находился ранее) и со стороны правообладателя раздаваемого в сети контента отправлена жалоба на все адреса, которые имели коннект с пиром раздачи.
  2. Когда ваш провайдер блочит отправку писем:

Еще одна важная задача — снизить расходы на инфраструктуру. Используя AWS или Azure, при росте начинаешь замечать, как счета за аренду приближаются к отметке в 10k USD в месяц — так было в нашем случае. Столь огромные накладные расходы сподвигают к приобретению собственного железа, т.к. при покупке и настройке железа на пару миллионов рублей единоразово подобная акция окупается уже через 2-4 месяца.

Исходные данные и задача


  1. Заключенный договор с RIR (в нашем случае это RIPE NCC), выделенные диапазоны IP-адресов, а также AS.
  2. BGP шлюз (в нашем случае это bare metal машина, работающая на Ubuntu), запиренный к парочке ISP (не РФ, в нашем случае это Великобритания).
  3. Физическое железо с российскими ISP (мы находимся в Тамбове).

Как результат, мы должны иметь возможность на своих железках в РФ располагать интерфейсами с белыми IP-адресами нашей подсети, с маршрутизацией через BGP роутер в Великобритании.

В качестве примера рассмотрим работу с IPv4 адресами, но с IPv6 ситуация абсолютно аналогичная.

RIPE


RIPE — один из пяти RIR по всему миру; отвечает за Европу и Западную Азию. Есть вариант обратиться к LIR за выделением IP-адресов, возможно, с присваиванием их вашей организации. Здесь надо понимать, что в случае получения абузы на стороне RIR от любого лица, RIR вправе отобрать у вас адреса, поэтому получение статуса LIR дает некоторую гибкость в вопросе работы с абузами. 

Настройка в RIPE начинается с получения статуса LIR, подписания договора и присвоения ASN, а также диапазона IP-адресов.

Для получения статуса LIR нужно юридическое лицо, причём не принципиально, в какой именно юрисдикции. Ключевой момент — местонахождение железок. В нашем случае юридическое лицо, от которого был подписан договор с RIPE, де факто находится в США, а сама эта организация является дочкой компании, зарегистрированной в Сингапуре. Для успешного заключения договора нужно предоставить информацию о физическом местонахождении железок (договор аренды и копии счетов покупки оборудования).

Для получения ASN необходимо заручиться поддержкой двух других провайдеров, с которыми вы гипотетически можете иметь коннект. При оформлении заявки на получение ASN вы указываете ASN провайдеров с контактами владельцев. В общем виде, RIPE имеет право подтвердить факт возможности пиринга вашей инфраструктуры, связавшись с ISP, ASN которых были вами задекларированы, но в нашем случае такого контакта не было, никто не подтверждал факт наличия канала связи, и в течение пары суток ASN был успешно присвоен.

Предполагаем, что можно также использовать публичные AS от Azure или AWS. Как результат, RIPE в свою базу вносят предоставленные вами ASN, а вы позже можете заменить их на любые угодные вам (в конце концов, вы имеете право сменить провайдера). В записях указывается разрешение на анонс со стороны вашей AS в адрес указанных AS, и наоборот (записи с маркировками export и import).

Процессы аллокации AS и IP-адресов абсолютно асинхронны и не обязательно должны быть последовательными. Мы вначале послали запрос на аллокацию адресов, а потом на присвоение AS.

RIPE предоставляют удобный веб-интерфейс для работы с записями своей базы данных, через который вы крайне быстро можете внести изменения AS или IP диапазона.

Крайне важно после аллокации IP-адресов выполнить их Assignment, чтобы адреса не числились неиспользуемыми. В случае долгого неиспользования адресов есть шанс потерять их, т.к. RIPE оставляет за собой право их отозвать. Assignment происходит через создание Maintainer с присваиванием его нужному диапазону. В нашем случае Maintainer-ами являются разные отделы организации, но в общем виде это могут быть и другие компании. Информация о присваивании является публичной.

BGP + OpenVPN


От слов к делу. Выберите подходящий вам ISP с надёжными каналами связи. Учитывая специфику деятельности (email-рассылки), мы смотрели на ограничения фаерволов роутеров, а также на количество AS, с которыми можно запириться. Возможно, понадобится официальное письмо от вашей организации в адрес ISP с разрешением принимать анонсы от вашей AS. В примере будет указана одна пиринг AS, но крайне рекомендуется использовать минимум две для повышения отказоустойчивости.

В качестве роутера выступает машина, работающая под управлением ОС Ubuntu.

В качестве программного обеспечения — Bird 1.6.3.

Публичный IP BGP шлюза - 
IP адрес пиринг AS шлюза - 
Наш ANS - 
Наш диапазон IP - 

Установка Bird: apt install — y bird

Конфигурация:

/etc/bird/bird.conf

router id <machine ip>;

protocol bgp heficed {
  local as <local as number>;
  source address <machine ip>;
  import all;
  export all;
  graceful restart on;
  multihop 2;
  neighbor <peer router ip address> as <peer AS number>;
  password "<something not easy>";
}

protocol static {
  route <anonsed network in CIDR format (x.x.x.x/mask) via <machine ip>;
}

protocol device {
  scan time 5;
}

Установка OpenVPN: apt install — y openvpn

Конфигурация:

Конфигурация OpenVPN несколько выходит за рамки статьи, поэтому приведём базовые опции, которые мы используем:

/etc/openvpn/openvpn.conf

mode server
;daemon openvpn
port 1984
management localhost 6666
proto udp
dev tun
ca /etc/openvpn/server_keys/ca.crt
cert /etc/openvpn/server_keys/localhost.crt
key /etc/openvpn/server_keys/localhost.key
dh /etc/openvpn/server_keys/dh2048.pem
client-config-dir /etc/openvpn/ccd

tls-auth /etc/openvpn/server_keys/ta.key 0

auth SHA512
cipher AES-256-CBC
topology subnet
server <as network> <as netmask>

push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
keepalive 5 30
persist-key
persist-tun
user nobody
group nogroup
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 2
mute 3
mute-replay-warnings
push "redirect-gateway def1"

Основная идея заключается в том, что интерфейсом с белым IP является tun интерфейс, созданный OpenVPN на стороне клиента.

Конфигурация OpenVPN на стороне клиента:

client
tls-client
auth SHA512
cipher AES-256-CBC
proto udp
remote-cert-tls server
remote <vpn server ip> 1984
dev tun
resolv-retry 5
nobind
keepalive 5 30
persist-key
persist-tun
verb 3
route-delay 2

Клиент-машины могут располагаться в разных физических дата-центрах, при этом весь трафик будет маршрутизироваться через OpenVPN/BGP сервер. Он в данном случае является точкой отказа, поэтому настоятельно рекомендуется в конфигурациях OpenVPN на клиенте использовать доменные имена, чтобы можно было перенаправить трафик через другой роутер, заменив записи DNS. Это не fault-tolerance решение, но поможет избежать длительного даунтайма при возникновении проблем с BGP шлюзом.

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

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