Хостинг-провайдер DigitalOcean пользуется большой популярностью среди размещающих свои ресурсы и сервисы в сети Интернет. Не буду перечислять его преимущества, которые и так достаточно широко известны. Остановлюсь лишь на одном из недостатков, который может стать неприятной неожиданностью для впервые использующих ресурсы DigitalOcean, а именно невозможности использовать представляемые IPv6 адреса для исходящего почтового трафика. Для IPv6 заблокированы на выход порты 25, 465 и 587. При этом входящий трафик для IPv6 равно как и SMTP-трафик в обеих направлениях для IPv4 открыт.
Сам хостинг объясняет это тем, что не имеет возможности предоставлять для каждого сервера отдельную IPv6 подсеть /64 как того требует RFC и, по этой причине осуществляет блокировку исходящего почтового трафика в качестве превентивных мер по защите репутации IPv6 блока, который совместно могут использовать большое количество пользователей.
В качестве возможного решения автор предлагает использовать возможности туннелирования IPv6 адресов внутри IPv4 трафика обепечив, таким образом, использование выделенной подсети на удалённом хосте. Благодаря этому может быть обеспечен обход блокировок исходящего SMTP-трафика и возможность полноценной в этом плане работы на серверах DigitalOcean. Кроме того, получение полного набора адресов IPv6 /64 сети, вместо всего лишь /128 которая предоставляются хостингом, может быть полезно и для других размещаемых сетевых сервисов.
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*
Самым популярным способом для получения в своё распоряжение подсети IPv6 является использование сервиса Tunnelbroker от крупного провайдера Hurricane Electric который предоставляет такую возможность через организацию туннеля 6in4. Обычно он используется в тех случаях, когда нет возможности обеспечить использования IPv6 в сети из-за ограничений провайдера, но ничто не мешает использовать тот же подход и как средство обойти вышеупомянутые ограничения DigitalOcean. Для примера настройки рассмотрим созданный туннель со следующими данными.
Разумным будет в процессе организации выбрать в качестве сервера на стороне Hurricane Electric ближайшее с точки зрения задержек месторасположение. В моём случае как виртуальный сервер, так и шлюз расположены в Амстердаме.
Следует учитывать, что для того, чтобы иметь возможность использовать предостваляемый туннель для отправки SMTP-трафика вы должны сдать онлайн-экзамен на сертификат уровня "Sage". В результате у вас появится возможность разрешить его во вкладке "Advanced" созданного туннеля.
Также важно не забыть прописать реверсную зону DNS для выбранных для использования совместно с почтовым сервером IP-адресов. Для этого автор рекомендует использовать возможности замечательного DNS-сервиса 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-адреса именно того, который является частью туннелированной на сервер сети и который, как уже говорилось выше, имеет корректную реверсную зону. В противном случае могут быть использованы другие имеющиеся в системе адреса что может привести к отказу в обслуживании на удалённой системе.
Статья была полезной? Тогда прошу не стесняться и поддерживать деньгами через PayPal или Яндекс.Деньги.
Вы можете также воспользоваться этой ссылкой и получить при регистрации в DigitalOcean 10 USD на счёт в качестве приветственного бонуса.