Как стать автором
Обновить
2830.61
RUVDS.com
VDS/VPS-хостинг. Скидка 15% по коду HABR15

Как начать работать с IPv6 там, где его нет (часть 2)

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров10K

В настоящее время основным подходом к внедрению IPv6 является dual-stack, когда устройство одновременно настроено на функционирование обоих IP-протоколов. Это и понятно, ведь основная часть интернета работает на версии IPv4. Механизм 6to4 позволяет подключить ваше устройство IPv4 к брокеру, создав туннель в IPv6.

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

▍ Сетевая безопасность оконечных устройств


Важно понимать, что назначенный IPv6-адрес теперь светится в самый настоящий интернет напрямую, без всяких nat-технологий (в новом мире нужно можно забыть про них). Для убедительности продемонстрирую, как это выглядит со стороны сетевых сканеров:

nmap -6 2001:459:14:210::2

25/tcp   filtered smtp
135/tcp  open     msrpc
445/tcp  open     microsoft-ds
1025/tcp open     NFS-or-IIS
1026/tcp open     LSA-or-nterm
1027/tcp open     IIS
1030/tcp open     iad1
1040/tcp open     netsaint
3389/tcp open     ms-wbt-server
5357/tcp open     wsdapi

В IPv4 такое не встретишь, чтобы домашний Windows-компьютер прямо вот так вот был открыт на весь мир, а в IPv6 — пожалуйста. Поэтому соответствующее антивирусное обеспечение или встроенный брандмауэр здесь пригодятся. Но можно на сетевом уровне обойтись и без них, грамотно настроив firewall на chr. Для этого нужно узнать, какие службы на клиенте запущены и готовы работать с tcp- и udp-подключениями из внешнего мира:

# Для windows
netstat -abp tcp  -ab
netstat -abp udp  -ab

# Для linux
# netstat -tlnp
# netstat -ulnp

Активные подключения
  Имя    Локальный адрес        Внешний адрес          Состояние
  TCP    0.0.0.0:135            RUVDS:0            LISTENING   RpcSs   [svchost.exe]
  TCP    0.0.0.0:445            RUVDS:0            LISTENING   Не удается получить сведения о владельце
  TCP    0.0.0.0:1025           RUVDS:0            LISTENING   [wininit.exe]
  TCP    0.0.0.0:1026           RUVDS:0            LISTENING   eventlog   [svchost.exe]
  TCP    0.0.0.0:1027           RUVDS:0            LISTENING   Schedule   [svchost.exe]
  TCP    0.0.0.0:1030           RUVDS:0            LISTENING   [lsass.exe]
  TCP    0.0.0.0:1040           RUVDS:0            LISTENING   [services.exe]
  TCP    0.0.0.0:3389           RUVDS:0            LISTENING   CryptSvc   [svchost.exe]
  TCP    0.0.0.0:5357           RUVDS:0            LISTENING

После этого создаём джентльменский набор правил в IPv6 firewall (в dual-stack сетевой экран следует настраивать как для IPv4, так и отдельно для IPv6), дополнив его правилами блокировки tcp- и udp-портов, работа которых не должна светиться в интернет:

/ipv6 firewall filter
add action=accept chain=input comment="Accept established,related" connection-state=established,related
add action=drop chain=input comment="Drop invalid" connection-state=invalid
add action=accept chain=input comment="Accept ICMP" protocol=icmpv6
add action=accept chain=input comment="defconf: accept UDP traceroute" port=33434-33534 protocol=udp
add action=drop chain=input comment="Drop all input"
add action=accept chain=forward comment="Accept established,related" connection-state=established,related
add action=drop chain=forward comment="Drop invalid" connection-state=invalid
add action=accept chain=forward comment="Accept ICMP" protocol=icmpv6
add action=accept chain=forward comment="Accept forward LAN packets" in-interface=pptp-in1 out-interface=ipv6_tunnel
add action=drop chain=forward comment="My windows TCP ports" dst-port=135,445,1025,1026,1027,1030,1040,3389,5357 in-interface=ipv6_tunnel out-interface=pptp-in1 protocol=tcp
add action=drop chain=forward comment="My windows UDP ports" dst-port=123,500,3702,4500,5353,5355 in-interface=ipv6_tunnel out-interface=pptp-in1 protocol=udp

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

/ipv6 firewall filter add action=drop chain=forward comment="Drop all forwards"

Но тонкая настройка всегда может пригодиться в будущем. Результат повторного сканирования tcp- и udp-портов уверенно демонстрирует, что всё прикрыто, а значит безопасно:

nmap -6 2001:459:14:210::2

Nmap scan report for 2001:470:28:231::2
Host is up (0.12s latency).
Not shown: 984 closed ports
PORT     STATE    SERVICE
25/tcp   filtered smtp
135/tcp  filtered msrpc
445/tcp  filtered microsoft-ds
1025/tcp filtered NFS-or-IIS
1026/tcp filtered LSA-or-nterm
1027/tcp filtered IIS
1030/tcp filtered iad1
1040/tcp filtered netsaint
3389/tcp filtered ms-wbt-server
5357/tcp filtered wsdapi

nmap -6 2001:470:28:231::2 –sU

Starting Nmap 7.80 ( https://nmap.org ) at 2023-09-03 15:29 MSK
Host is up (0.12s latency).
Not shown: 994 closed ports
PORT     STATE         SERVICE
123/udp  open|filtered ntp
500/udp  open|filtered isakmp
3702/udp open|filtered ws-discovery
4500/udp open|filtered nat-t-ike
5353/udp open|filtered zeroconf
5355/udp open|filtered llmnr

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

ping 2001:4860:4860::8888
ping -6 google.com
ping -4 google.com

▍ Туннелирование IPv6 до устройств домашней сети, которые не умеют работать с VPN


Получение маршрутизируемого в интернете IPv6-адреса позволяет подключаться к любому устройству из домашней сети напрямую. Это может быть удобно и интересно одновременно, особенно в контексте личных проектов из раздела сделай сам. Собирать рабочие решения и заставлять их трудиться на благо бывает полезно. Но не всегда есть возможность на оконечном оборудовании использовать VPN-клиенты. Тогда можно реализовать несколько другую схему, которая, кстати говоря, отражает механизмы, работающие на backend-стороне туннельного брокера.

Настроим следующую связку. В качестве VPN-клиента до chr будем использовать роутер домашней сети. У меня это будет тоже mikrotik, и если уж так, то воспользуемся их фирменной фичей — работой sstp-протокола без сертификатов, потому что он (протокол) хорош всем, а в этой ситуации одновременно прост в настройке. Команды уже знакомы:

/ip pool add name=pool_for_tunnel_in_lan ranges=192.168.99.1-192.168.99.2
/ppp profile add local-address=pool_for_tunnel_in_lan name=my_ppp_tunnels remote-address=pool_for_tunnel_in_lan use-encryption=required
/ppp secret add name=user01 profile=my_ppp_tunnels service=sstp password="123"
/interface sstp-server add name=sstp-in1 user=user01
/interface sstp-server server set authentication=mschap2 default-profile=my_ppp_tunnels enabled=yes

Однако на это раз автоматическое конфигурирование интерфейса (advertise=no) не будет работать, поэтому назначим статическую маршрутизацию IPv6 для интерфейса. Закрепим на обратной стороне туннеля небольшую /126 сеть. Разрешающее правило для firewall также расположим ранее правила drop для цепочки input:

/ipv6 address add address=2001:470:28:231::1/126 advertise=no interface=sstp-in1
/ipv6 route add disabled=no distance=1 dst-address=2001:470:28:231::4/126 gateway=2001:470:28:231::2 routing-table=main scope=30 target-scope=10
/ip firewall filter add action=accept chain=input comment="Accept SSTP" dst-port=443 protocol=tcp

Далее на домашнем роутере поднимем sstp-клиент, зададим на туннельном и bridge-интерфейсах IPv6-адреса из разных сетей, настроим маршрутизацию. Выходит некоторый аналог работы сервера брокера:

/interface sstp-client
add authentication=mschap2 connect-to=ip_адрес_chr disabled=no max-mtu=1280 \
    name=sstp-out1 password=123 profile=default-encryption user=user01
/ipv6 address
add address=2001:470:28:231::2/126 advertise=no interface=sstp-out1
add address=2001:470:28:231:5/126 advertise=no interface=bridge
/ipv6 route
add distance=1 dst-address=2000::/3 gateway=2001:470:28:231::1

Имеем следующее распределение адресов:

Первая сеть:

  • 2001:470:28:231::0/126 — сеть;
  • 2001:470:28:231::1/126 — со стороны туннельного интерфейса chr;
  • 2001:470:28:231::2/126 — со стороны туннельного интерфейса домашнего роутера;
  • 2001:470:28:231::3/126 — не используется в нашей схеме («последний» адрес в IPv4-сетях является широковещательным, а в IPv6-сетях обычным).

Вторая сеть:

  • 2001:470:28:231::4/126 — сеть;
  • 2001:470:28:231::5/126 — на bridge-интерфейсе домашнего роутера;
  • 2001:470:28:231::6/126 — для устройства из домашней сети;
  • 2001:470:28:231::7/126 — не используется в нашей схеме.

Из соображений безопасности, чтобы в локальной сети не могло быть более одного труженика IPv6, о котором администратору не известно, можно попробовать прокинуть маршрут только до одного устройства, например 2001:470:28:231::6/126. Сделать это не получится. Routeros не разрешит задать IPv6-маршрут до конкретного хоста. Вместо этого неявно будет исправлен роут до всей сети:

/ipv6 route add disabled=no distance=1 dst-address=2001:470:28:231::6/126 \
gateway=2001:470:28:231::2 routing-table=main scope=30 target-scope=10

/ipv6 route print                                       
Flags: D - DYNAMIC; A - ACTIVE; c - CONNECT, s - STATIC; + - ECMP                 
Columns: DST-ADDRESS, GATEWAY, DISTANCE
#      DST-ADDRESS             GATEWAY             DISTANCE
…
1  As  2001:470:28:231::4/126  2001:470:28:231::2         1

Применим статическую IPv6-адресацию на устройстве из домашней сети, которое не умеет или не хочет работать с VPN-протоколами, как показано на рисунках ниже:



Сеть заведётся, dual-stack во всей красе. Осталось настроить firewall, это также можно сделать на chr или домашнем роутере. Уже описано выше. Когда на устройстве нет возможности посмотреть, какие соединения прослушиваются, следует прибегнуть к сетевому сканеру вроде nmap или connection tracking, если он есть у вашего маршрутизатора. По мне так nmap проще, но нужно помнить, что с параметрами по умолчанию он сканирует только порты до 1024 включительно, а также все порты с большими номерами, упомянутыми в файле nmap-services для протокола, по которому идёт сканирование, чего в 99% случаев достаточно. Чтобы отсканировать вообще все tcp- и udp-порты, применяются следующие ключи (готовьтесь к длительному ожиданию):

nmap -6 2001:470:28:231::2 –p0-65535
nmap -6 2001:470:28:231::2 –sU –p0-65535

▍ IPv4 to IPv6 на Linux


Проведённые настройки облачного маршрутизатора на routeros достаточно просты и наглядны. Однако арендовать целый сервер, чтобы установить на него chr только для доступа в IPv6, не обязательно. Всё это можно проделать и непосредственно в Linux. Сервер помимо этой изыскательской задачи может быть комбайном, нагруженным другими интересными и практическими функциями, как это обычно и бывает у практичных системных администраторов. Дальнейшее описание будет вестись на базе debian 11, к которому прикрутим IPv6. Чтобы подключиться к брокеру, добавим и запустим новый интерфейс:

nano /etc/network/interfaces

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
        address 2001:459:13:210::2
        netmask 64
        endpoint 216.66.80.90
        local ip_адрес_сервера
        ttl 255
        gateway 2001:459:13:210::1

ifup he-ipv6
ip a

…
4: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    link/sit ip_адрес_сервера peer 216.66.80.90
    inet6 2001:459:13:210::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::b905:f816/64 scope link
       valid_lft forever preferred_lft forever

Сервер создал туннель в IPv6-интернет, который мы протянем до локалки. Вследствие этого VDS станет самым настоящим маршрутизатором, который должен передавать forward-пакеты далее по сети, для этого активируем IPv4- и IPv6-пересылки:

nano /etc/sysctl.conf

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

sysctl -p

Можно тестировать соединение, проще всего это сделать, кинув пинги на адреса из нового диапазона. Также в Linux опционально настроим резолвинг на IPv6 DNS-серверах:

nano /etc/resolv.conf

nameserver 77.88.8.8
nameserver 77.88.8.1
nameserver 2001:4860:4860::8888
nameserver 2001:4860:4860::8844

▍ Промежуточные выводы


Во второй части цикла статей показан подход к обеспечению безопасности подключаемых к IPv6-клиентов. Настроено туннелирование до устройств сети, которые не умеют работать с vpn, используя домашний роутер в качестве шлюза на примере конфигурирования sstp и статической маршрутизации. Используя полученный практический опыт, перенесли подключение к брокеру IPv6 на Linux. В последней части материала настроим туннелирование IPv6 до устройств домашней сети посредством удобного и безопасного протокола l2tp. А для работы (в первую очередь мобильных устройств) дополнительно организуем ikev2, сделав на сервере неплохую связку для кроссплатформенного доступа в новый мир.

Теги:
Хабы:
Всего голосов 53: ↑53 и ↓0+53
Комментарии25

Публикации

Информация

Сайт
ruvds.com
Дата регистрации
Дата основания
Численность
11–30 человек
Местоположение
Россия
Представитель
ruvds