5 Февраль 2018

Открываем исходящий SMTP трафик по IPv6 на DigitalOcean

How to open outgoing IPv6 SMTP traffic on DigitalOcean

Хостинг-провайдер DigitalOcean пользуется большой популярностью среди размещающих свои ресурсы и сервисы в сети Интернет. Не буду перечислять его преимущества, которые и так достаточно широко известны. Остановлюсь лишь на одном из недостатков, который может стать неприятной неожиданностью для впервые использующих ресурсы DigitalOcean, а именно невозможности использовать представляемые IPv6 адреса для исходящего почтового трафика. Для IPv6 заблокированы на выход порты 25, 465 и 587. При этом входящий трафик для IPv6 равно как и SMTP-трафик в обеих направлениях для IPv4 открыт.

Сам хостинг объясняет это тем, что не имеет возможности предоставлять для каждого сервера отдельную IPv6 подсеть /64 как того требует RFC и, по этой причине осуществляет блокировку исходящего почтового трафика в качестве превентивных мер по защите репутации IPv6 блока, который совместно могут использовать большое количество пользователей.

В качестве возможного решения автор предлагает использовать возможности туннелирования IPv6 адресов внутри IPv4 трафика обепечив, таким образом, использование выделенной подсети на удалённом хосте. Благодаря этому может быть обеспечен обход блокировок исходящего SMTP-трафика и возможность полноценной в этом плане работы на серверах DigitalOcean. Кроме того, получение полного набора адресов IPv6 /64 сети, вместо всего лишь /128 которая предоставляются хостингом, может быть полезно и для других размещаемых сетевых сервисов.

1. Как это работает по умолчанию

DigitalOcean, как уже упоминалось выше, предоставляет 1 IPv4 адрес и до 254 дополнительных IPv6 адресов для каждого созданного сервера или, в терминах самого хостинга, "дроплета".

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

root@z:~ # uname -v
FreeBSD 11.1-RELEASE-p4 #0: Tue Nov 14 06:12:40 UTC 2017     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
root@z:~ # hostname
z.peek.ru
root@z:~ # pkg info | wc -l
      52
root@z:~ # cat /etc/rc.conf
sshd_enable="YES"
digitaloceanpre="YES"
hostname="freebsd-s-2vcpu-2gb-ams3-01"
cloudinit_enable="YES"
digitalocean="YES"

# DigitalOcean Dynamic Configuration lines and the immediate line below it,
# are removed each boot.

# DigitalOcean Dynamic Configuration
defaultrouter="188.166.64.1"
# DigitalOcean Dynamic Configuration
ifconfig_vtnet0="inet 188.166.79.215 netmask 255.255.192.0"
# DigitalOcean Dynamic Configuration
ifconfig_vtnet0_alias0="inet 10.18.0.5 netmask 255.255.0.0"
# DigitalOcean Dynamic Configuration
ifconfig_vtnet0_ipv6="inet6  prefixlen 0"
# DigitalOcean Dynamic Configuration
ipv6_defaultrouter=""
# DigitalOcean Dynamic Configuration
ipv6_activate_all_interfaces="yes"

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

root@z:~ # ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        ether d2:04:87:f2:13:a2
        hwaddr d2:04:87:f2:13:a2
        inet6 fe80::d004:87ff:fef2:13a2%vtnet0 prefixlen 64 scopeid 0x1
        inet 188.166.79.215 netmask 0xffffc000 broadcast 188.166.127.255
        inet 10.18.0.5 netmask 0xffff0000 broadcast 10.18.255.255
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        media: Ethernet 10Gbase-T <full-duplex>
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        groups: lo

В общих чертах это обеспечивается через парсинг примонтированного через устройство /dev/vtbd1 файла /var/lib/cloud/seed/config_drive/digitalocean_meta_data.json.

root@z:~ # df -h
Filesystem         Size    Used   Avail Capacity  Mounted on
/dev/gpt/rootfs     56G    2.3G     49G     4%    /
devfs              1.0K    1.0K      0B   100%    /dev
fdescfs            1.0K    1.0K      0B   100%    /dev/fd
/dev/vtbd1         424K    424K      0B   100%    /var/lib/cloud/seed/config_drive
root@freebsd-s-2vcpu-2gb-ams3-01:~ # ll /var/lib/cloud/seed/config_drive/digitalocean_meta_data.json
-rw-r--r--  1 root  wheel  9694 Feb  5 11:19 /var/lib/cloud/seed/config_drive/digitalocean_meta_data.json

При запуске он обрабатываетcя системным скриптом /usr/local/etc/rc.d/digitalocean, который, помимо прочих, предустановлен на систему при создании дроплета.

root@z:~ # ll /usr/local/etc/rc.d/
total 32
-rwxr-xr-x  1 root  wheel   714 Oct 10  2014 cloudconfig*
-rwxr-xr-x  1 root  wheel   743 Oct 10  2014 cloudfinal*
-rwxr-xr-x  1 root  wheel   724 Jan  3 11:27 cloudinit*
-rwxr-xr-x  1 root  wheel   747 Oct 10  2014 cloudinitlocal*
-rwxr-xr-x  1 root  wheel  3700 Jul 29  2017 digitalocean*
-rwxr-xr-x  1 root  wheel  1394 Jul 29  2017 digitaloceanpre*
-r-xr-xr-x  1 root  wheel  1081 Dec 21 01:08 rsyncd*
-r-xr-xr-x  1 root  wheel   689 Jan 11 01:09 uuidd*

2. Подключение сети IPv6 /64

Самым популярным способом для получения в своё распоряжение подсети IPv6 является использование сервиса Tunnelbroker от крупного провайдера Hurricane Electric который предоставляет такую возможность через организацию туннеля 6in4. Обычно он используется в тех случаях, когда нет возможности обеспечить использования IPv6 в сети из-за ограничений провайдера, но ничто не мешает использовать тот же подход и как средство обойти вышеупомянутые ограничения DigitalOcean. Для примера настройки рассмотрим созданный туннель со следующими данными.

HE 6in4 IPv6 tunnel

Разумным будет в процессе организации выбрать в качестве сервера на стороне Hurricane Electric ближайшее с точки зрения задержек месторасположение. В моём случае как виртуальный сервер, так и шлюз расположены в Амстердаме.

Следует учитывать, что для того, чтобы иметь возможность использовать предостваляемый туннель для отправки SMTP-трафика вы должны сдать онлайн-экзамен на сертификат уровня "Sage". В результате у вас появится возможность разрешить его во вкладке "Advanced" созданного туннеля.

Также важно не забыть прописать реверсную зону DNS для выбранных для использования совместно с почтовым сервером IP-адресов. Для этого автор рекомендует использовать возможности замечательного DNS-сервиса FreeDNS.

IPv4 PTR records FreeDNS

Как видно, в данном случае для выбранного имени хоста z.peek.ru указан IPv6-адрес 2001:470:1f15:106a::215. Далее для созданного туннеля создаём специальный интерфейс gif0 в файле /etc/rc.conf стартовой конфигурации системы.

root@z:~ # grep gif0 /etc/rc.conf
cloned_interfaces="gif0"
create_args_gif0="tunnel 188.166.79.215 216.66.84.46"
ifconfig_gif0_ipv6="inet6 2001:470:1f14:106a::2 2001:470:1f14:106a::1 prefixlen 128"
ifconfig_vtnet0_alias1="inet6 2001:470:1f15:106a::215 prefixlen 64"
ipv6_defaultrouter="-iface gif0"

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

root@z:~ # cat /usr/local/etc/rc.d/digitalocean
...
# DigitalOcean Dynamic Configuration
ifconfig_vtnet0_ipv6="inet6 ${ip6_addr} prefixlen ${ip6_mask}"
# DigitalOcean Dynamic Configuration
#ipv6_defaultrouter="${ip6_gateway}"
...

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

root@z:~ # ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        ether d2:04:87:f2:13:a2
        hwaddr d2:04:87:f2:13:a2
        inet6 fe80::d004:87ff:fef2:13a2%vtnet0 prefixlen 64 scopeid 0x1
        inet6 2001:470:1f15:106a::215 prefixlen 64
        inet 188.166.79.215 netmask 0xffffc000 broadcast 188.166.127.255
        inet 10.18.0.5 netmask 0xffff0000 broadcast 10.18.255.255
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        media: Ethernet 10Gbase-T <full-duplex>
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        groups: lo
gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1280
        options=80000<LINKSTATE>
        tunnel inet 188.166.79.215 --> 216.66.84.46
        inet6 fe80::94b3:651c:c78e:5eed%gif0 prefixlen 64 scopeid 0x3
        inet6 2001:470:1f14:106a::2 --> 2001:470:1f14:106a::1  prefixlen 128
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
        groups: gif
root@z:~ # telnet -6 gmail-smtp-in.l.google.com 25
Trying 2a00:1450:4013:c00::1b...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP t4si7389116edj.344 - gsmtp
QUIT
221 2.0.0 closing connection t4si7389116edj.344 - gsmtp
Connection closed by foreign host.

Ещё одним важным моментом, о котором следует упомянуть, является необходимость настройки вашего SMTP-сервера на использование в качестве исходящего IPv6-адреса именно того, который является частью туннелированной на сервер сети и который, как уже говорилось выше, имеет корректную реверсную зону. В противном случае могут быть использованы другие имеющиеся в системе адреса что может привести к отказу в обслуживании на удалённой системе.

3. PROFIT!

Статья была полезной? Тогда прошу не стесняться и деньгами или биткоинами.

Вы можете также воспользоваться этой ссылкой и получить при регистрации в DigitalOcean 10 USD на счёт в качестве приветственного бонуса.


antispam  FreeBSD  DNS  hosting