Различия

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

isp:domru:ubuntu-server-howto [2019-02-14 09:21 UTC]
rm
isp:domru:ubuntu-server-howto [2019-10-06 17:00 UTC] (текущий)
rm
Строка 1: Строка 1:
 +====== IPv6 от Дом.ru (ЭР-Телеком) на сервере Ubuntu/Debian ======
 +Теория: используется PPPoE с IPv4, поверх него можно воспользоваться протоколом DHCPv6-PD для получения IPv6 prefix delegation.
 +
 +:!: Внимание! Если вы настроите IPv6 без настройки межсетевого экрана, то предоставите полный доступ к ресурсам сервера. Если сервер выполняет роль роутера, то и доступ ко всем ресурсам локальной сети.
 +
 +===== PPPoE =====
 +
 +Для удобства, можно установить пакет pppoeconf, запустить сам pppoeconf от суперпользователя root, пройти через вопросы-ответы (в т.ч., надо будет ввести логин и пароль для PPPoE соединения):
 +<code>
 +sudo apt-get update
 +sudo apt-get install pppoeconf
 +sudo pppoeconf
 +</code>
 +
 +[[https://domru.ru/service/knowledgebase/article/174|Здесь]] официальная инструкция от ЭР-Телекома, с картинками.
 +
 +Потом поправить получившиеся настройки (обычно необходимо добавить одну из опций — ''ipv6 ,'' или ''+ipv6''):
 +
 +Пример:
 +<file text /etc/ppp/peers/dsl-provider>
 ++ipv6
 +noipdefault
 +defaultroute
 +replacedefaultroute
 +hide-password
 +noauth
 +persist
 +maxfail 0
 +plugin rp-pppoe.so eth1
 +user "v1234567"
 +</file>
 +
 +Для сервера, желательно указать опцию ''maxfail 0'', чтобы в случае проблем у провайдера, pppd пытался подключиться вечно, а не 10 раз, как это настроено по умолчанию.
 +
 +Пример системных настроек сетевых интерфейсов (тут обычно править ничего не нужно):
 +<file text /etc/network/interfaces>
 +
 +auto dsl-provider
 +iface dsl-provider inet ppp
 +pre-up /sbin/ifconfig eth1 up # line maintained by pppoeconf
 +provider dsl-provider
 +</file>
 +
 +===== Межсетевой экран =====
 +
 +==== ip6tables ====
 +
 +Разрешаем любые исходящие соединения, а также входящие icmpv6 и tcp на 80-й (http) и 22 порт (ssh):
 +
 +<file shell /etc/ppp/ipv6-up.d/10-ip6tables>
 +#!/bin/sh
 +
 +# Default value (if unset):
 +IFNAME=${IFNAME:-ppp0}
 +
 +ip6tables -F
 +ip6tables -X
 +ip6tables -P FORWARD DROP
 +# Accept DHCPv6 from WAN
 +ip6tables -A INPUT -i $IFNAME -p udp -s fe80::/10 --sport 547 --dport 546 -j ACCEPT
 +ip6tables -A INPUT -p icmpv6 -j ACCEPT
 +ip6tables -A INPUT -m state --state INVALID -j DROP
 +ip6tables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
 +ip6tables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
 +ip6tables -A INPUT -i $IFNAME -m state --state ESTABLISHED,RELATED -j ACCEPT
 +ip6tables -A INPUT -i $IFNAME -j REJECT
 +ip6tables -A OUTPUT -o $IFNAME -j ACCEPT
 +</file>
 +
 +==== shorewall6 ====
 +Раздел ещё не дописан.
 +
 +===== DHCPv6-PD =====
 +
 +Получение IPv6 адреса по DHCPv6-PD можно настроить с помощью любого из этих демонов:
 +  * dhcpcd5
 +  * wide-dhcpv6-client
 +  * dibbler-client
 +
 +==== dhcpcd ====
 +
 +Получить DHCPv6-PD можно с помощью пакета dhcpcd5.
 +Установка:
 +<code>
 +sudo apt-get update
 +sudo apt-get install dhcpcd5
 +</code>
 +
 +Конфигурация:
 +<file text /etc/dhcpcd.conf>
 +allowinterfaces ppp0 eth0
 +duid
 +ipv6only
 +noipv6rs
 +interface ppp0
 +ia_pd 1/::/64 eth0/0/64
 +</file>
 +
 +При остановке (или обрыве) PPPoE, dhcpcd5 сам удалит IPv6 адрес с eth0, а при переподключении сам получит новый IPv6 адрес. А вот о маршруте по умолчанию надо позаботиться самим:
 +
 +<file shell /etc/ppp/ipv6-up.d/20-route6>
 +#!/bin/sh
 +ip -6 route add default dev $IFNAME
 +</file>
 +
 +==== wide-dhcpv6-client ====
 +
 +Если не устраивает dhcpcd5, можно установить пакет wide-dhcpv6-client (но имейте в виду, что проект не развивается с 2008 года: [[https://sourceforge.net/p/wide-dhcpv6/git/ci/master/tree/|git репозиторий]]).
 +
 +Вначале убедитесь, что PPPoE соединение установлено, иначе установка будет завершена с ошибкой.
 +
 +Установка:
 +<code>
 +sudo apt-get update
 +sudo apt-get install wide-dhcpv6-client
 +</code>
 +
 +На вопрос «Интерфейсы, на которые клиент DHCPv6 должен отправлять запросы» ответить ppp0.
 +
 +<file text /etc/wide-dhcpv6/dhcp6c.conf>
 +interface ppp0 {
 +    send ia-pd 0;
 +};
 +
 +id-assoc pd 0 {
 +    prefix-interface eth0 {
 +        sla-len 0;
 +        ifid 1;
 +    };
 +};
 +</file>
 +
 +активируем автозапуск:
 +<file shell /etc/default/wide-dhcpv6-client>
 +INTERFACES="ppp0"
 +</file>
 +
 +Т.к. в случае остановки PPPoE надо удалить IPv6 адрес с eth0, но wide-dhcpv6-client почему то не делает этого сам, поэтому вобьём небольшой костыль:
 +<file shell /etc/ppp/ipv6-down.d/20-wide-client-stop>
 +#!/bin/sh
 +service wide-dhcpv6-client stop
 +</file>
 +
 +и к нему второй костыль:
 +<file shell /etc/ppp/ipv6-up.d/20-wide-client-start>
 +#!/bin/sh
 +service wide-dhcpv6-client start
 +</file>
 +
 +делаем файлы исполняемыми:
 +<code>
 +sudo chmod +x /etc/ppp/ipv6-down.d/20-wide-client-stop /etc/ppp/ipv6-up.d/20-wide-client-start
 +</code>
 +
 +и запускаем:
 +<code>
 +sudo service wide-dhcpv6-client start
 +</code>
 +
 +проверяем:
 +<code>
 +ip -6 addr show eth0
 +ping6 2600::
 +</code>
 +
 +===== Раздача IPv6 в локальную сеть =====
 +
 +В дополнение ко всему написанному выше, надо сделать ещё три пункта:
 +  * Нужно раздать ip-адреса,
 +  * настроить межсетевой экран,
 +  * разрешить проброс трафика между интерфейсами.
 +
 +==== Раздача IP-адресов ====
 +
 +Раздачу IPv6 можно организовать с помощью radvd или dnsmasq.
 +
 +=== radvd ===
 +
 +Установка:
 +<code>
 +sudo apt-get update
 +sudo apt-get install radvd
 +</code>
 +
 +Настройка:
 +<file text /etc/radvd.conf>
 +interface eth0
 +{
 +  AdvSendAdvert on;
 +  MaxRtrAdvInterval 60;
 +
 +  prefix ::/64
 +  {
 +    AdvValidLifetime 600;
 +    AdvPreferredLifetime 120;
 +  };
 +};
 +</file>
 +
 +Указание префикса в виде ''::/64'' включает автоматическое его определение из адресов, имеющихся на интерфейсе. При этом в некоторых версиях ''radvd'' возможно появление в логах сообщения "invalid all-zeros prefix in /etc/radvd.conf", однако его вывод является ошибочным (позже это было [[https://github.com/reubenhwk/radvd/commit/b37baa1137d0bd5b9cceb2e447550f1c0a105ac6|исправлено]]), и даже с таким сообщением всё должно [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=891324|работать нормально]].
 +
 +=== dnsmasq ===
 +
 +Раздел ещё не дописан.
 +
 +==== Межсетевой экран ====
 +
 +Межсетевой экран будет отличаться от предыдущего варианта, где не надо было пробрасывать трафик и защищать локальную сеть.
 +
 +=== ip6tables ===
 +
 +В этом примере разрешаем:
 +  * любые исходящие соединения, в том числе из локальной сети;
 +  * любые входящие icmpv6, в том числе в локальную сеть;
 +  * любые входящие на 80-й порт tcp (http), в том числе в локальную сеть;
 +  * входящие на сервер (но не в локальную сеть) tcp на 22-й порт (ssh).
 +
 +<file shell /etc/ppp/ipv6-up.d/10-ip6tables>
 +#!/bin/sh
 +
 +# Default value (if unset):
 +IFNAME=${IFNAME:-ppp0}
 +
 +ip6tables -F
 +ip6tables -X
 +ip6tables -P FORWARD DROP
 +# Accept DHCPv6 from WAN
 +ip6tables -A INPUT -i $IFNAME -p udp -s fe80::/10 --sport 547 --dport 546 -j ACCEPT
 +ip6tables -A INPUT -p icmpv6 -j ACCEPT
 +ip6tables -A INPUT -m state --state INVALID -j DROP
 +ip6tables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
 +ip6tables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
 +ip6tables -A INPUT -i $IFNAME -m state --state ESTABLISHED,RELATED -j ACCEPT
 +ip6tables -A INPUT -i $IFNAME -j REJECT
 +ip6tables -A OUTPUT -o $IFNAME -j ACCEPT
 +ip6tables -A FORWARD -p icmpv6 -j ACCEPT
 +ip6tables -A FORWARD -i eth0 -o $IFNAME -j ACCEPT
 +ip6tables -A FORWARD -i $IFNAME -o eth0 -p tcp -m tcp --dport 80 -j ACCEPT
 +ip6tables -A FORWARD -i $IFNAME -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
 +ip6tables -A FORWARD -m state --state INVALID -j DROP
 +ip6tables -A FORWARD -j REJECT
 +</file>
 +
 +=== shorewall6 ===
 +Раздел ещё не дописан.
 +
 +==== Проброс трафика ====
 +
 +Чтобы разрешить трафик между интерфейсами (т.е., чтобы из локальной сети можно было получить доступ в Интернет по IPv6):
 +
 +<file ini /etc/sysctl.d/60-ipv6-forwarding.conf>
 +net.ipv6.conf.all.forwarding=1
 +net.ipv6.conf.default.forwarding=1
 +net.ipv6.conf.ppp0.accept_ra=2
 +</file>
 +
 +Применяем:
 +<code>
 +sudo sysctl -p /etc/sysctl.d/60-ipv6-forwarding.conf
 +</code>
 +
 +===== Известные проблемы =====
 +
 +  * Иногда при подключении по PPPoE не работает DHCPv6, попробуйте перезапустить PPPoE:
 +<code>
 +sudo poff dsl-provider
 +sudo pon dsl-provider
 +</code>
 +  * dhcpcd5 (по крайней мере версии 6.0.5, из Ubuntu 14.04) иногда может падать:
 +<code>
 +Sep 27 22:55:24 ubuntuhost dhcpcd[2802]: ppp0: REPLY6 received from fe80::7e20:64ff:fe84:2765
 +Sep 27 22:55:24 ubuntuhost kernel: [84643.202100] show_signal_msg: 48 callbacks suppressed
 +Sep 27 22:55:24 ubuntuhost kernel: [84643.202112] dhcpcd[2802]: segfault at 454c456c ip 08060531 sp bfb0af50 error 4 in dhcpcd5[8048000+26000]
 +</code>
 +  * а radvd при этом продолжит раздавать адресацию, которой уже нет (bugreport: [[https://github.com/reubenhwk/radvd/issues/53|radvd doesn't announce prefix added at runtime]]).
 +  * При использовании dhcpcd5 (по крайней мере версии 6.0.5, из Ubuntu 14.04) на роутере с двумя сетевыми интерфейсами, в случае если интерфейс, на котором прописывается IPv6 адрес, переходит в состояние down (например выключили коммутатор за роутером), то IPv6 адрес удаляется и сервер остаётся без IPv6. После поднятия интерфейса адрес не восстанавливается. Такой проблемы нет с wide-dhcpv6-client, благодаря скриптам /etc/network/if-down.d/wide-dhcpv6-client и /etc/network/if-up.d/wide-dhcpv6-client.

isp/domru/ubuntu-server-howto.txt · Последние изменения: 2019-10-06 17:00 UTC От rm