IPv6 от Дом.ru (ЭР-Телеком) на сервере Ubuntu/Debian

Теория: используется PPPoE с IPv4, поверх него можно воспользоваться протоколом DHCPv6-PD для получения IPv6 prefix delegation.

:!: Внимание! Если вы настроите IPv6 без настройки межсетевого экрана, то предоставите полный доступ к ресурсам сервера. Если сервер выполняет роль роутера, то и доступ ко всем ресурсам локальной сети.

PPPoE

Для удобства, можно установить пакет pppoeconf, запустить сам pppoeconf от суперпользователя root, пройти через вопросы-ответы (в т.ч., надо будет ввести логин и пароль для PPPoE соединения):

sudo apt-get update
sudo apt-get install pppoeconf
sudo pppoeconf

Здесь официальная инструкция от ЭР-Телекома, с картинками.

Потом поправить получившиеся настройки (обычно необходимо добавить одну из опций — ipv6 , или +ipv6):

Пример:

/etc/ppp/peers/dsl-provider
+ipv6
noipdefault
defaultroute
replacedefaultroute
hide-password
noauth
persist
maxfail 0
plugin rp-pppoe.so eth1
user "v1234567"

Для сервера, желательно указать опцию maxfail 0, чтобы в случае проблем у провайдера, pppd пытался подключиться вечно, а не 10 раз, как это настроено по умолчанию.

Пример системных настроек сетевых интерфейсов (тут обычно править ничего не нужно):

/etc/network/interfaces
…
auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth1 up # line maintained by pppoeconf
provider dsl-provider

Межсетевой экран

ip6tables

Разрешаем любые исходящие соединения, а также входящие icmpv6 и tcp на 80-й (http) и 22 порт (ssh):

/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

shorewall6

Раздел ещё не дописан.

DHCPv6-PD

Получение IPv6 адреса по DHCPv6-PD можно настроить с помощью любого из этих демонов:

  • dhcpcd5
  • wide-dhcpv6-client
  • dibbler-client

dhcpcd

Получить DHCPv6-PD можно с помощью пакета dhcpcd5. Установка:

sudo apt-get update
sudo apt-get install dhcpcd5

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

/etc/dhcpcd.conf
allowinterfaces ppp0 eth0
duid
ipv6only
noipv6rs
interface ppp0
ia_pd 1/::/64 eth0/0/64

При остановке (или обрыве) PPPoE, dhcpcd5 сам удалит IPv6 адрес с eth0, а при переподключении сам получит новый IPv6 адрес. А вот о маршруте по умолчанию надо позаботиться самим:

/etc/ppp/ipv6-up.d/20-route6
#!/bin/sh
ip -6 route add default dev $IFNAME

wide-dhcpv6-client

Если не устраивает dhcpcd5, можно установить пакет wide-dhcpv6-client (но имейте в виду, что проект не развивается с 2008 года: git репозиторий).

Вначале убедитесь, что PPPoE соединение установлено, иначе установка будет завершена с ошибкой.

Установка:

sudo apt-get update
sudo apt-get install wide-dhcpv6-client

На вопрос «Интерфейсы, на которые клиент DHCPv6 должен отправлять запросы» ответить ppp0.

/etc/wide-dhcpv6/dhcp6c.conf
interface ppp0 {
    send ia-pd 0;
};
 
id-assoc pd 0 {
    prefix-interface eth0 {
        sla-len 0;
        ifid 1;
    };
};

активируем автозапуск:

/etc/default/wide-dhcpv6-client
INTERFACES="ppp0"

Т.к. в случае остановки PPPoE надо удалить IPv6 адрес с eth0, но wide-dhcpv6-client почему то не делает этого сам, поэтому вобьём небольшой костыль:

/etc/ppp/ipv6-down.d/20-wide-client-stop
#!/bin/sh
service wide-dhcpv6-client stop

и к нему второй костыль:

/etc/ppp/ipv6-up.d/20-wide-client-start
#!/bin/sh
service wide-dhcpv6-client start

делаем файлы исполняемыми:

sudo chmod +x /etc/ppp/ipv6-down.d/20-wide-client-stop /etc/ppp/ipv6-up.d/20-wide-client-start

и запускаем:

sudo service wide-dhcpv6-client start

проверяем:

ip -6 addr show eth0
ping6 2600::

Раздача IPv6 в локальную сеть

В дополнение ко всему написанному выше, надо сделать ещё три пункта:

  • Нужно раздать ip-адреса,
  • настроить межсетевой экран,
  • разрешить проброс трафика между интерфейсами.

Раздача IP-адресов

Раздачу IPv6 можно организовать с помощью radvd или dnsmasq.

radvd

Установка:

sudo apt-get update
sudo apt-get install radvd

Настройка:

/etc/radvd.conf
interface eth0
{
  AdvSendAdvert on;
  MaxRtrAdvInterval 60;
 
  prefix ::/64
  {
    AdvValidLifetime 600;
    AdvPreferredLifetime 120;
  };
};

Указание префикса в виде ::/64 включает автоматическое его определение из адресов, имеющихся на интерфейсе. При этом в некоторых версиях radvd возможно появление в логах сообщения «invalid all-zeros prefix in /etc/radvd.conf», однако его вывод является ошибочным (позже это было исправлено), и даже с таким сообщением всё должно работать нормально.

dnsmasq

Раздел ещё не дописан.

Межсетевой экран

Межсетевой экран будет отличаться от предыдущего варианта, где не надо было пробрасывать трафик и защищать локальную сеть.

ip6tables

В этом примере разрешаем:

  • любые исходящие соединения, в том числе из локальной сети;
  • любые входящие icmpv6, в том числе в локальную сеть;
  • любые входящие на 80-й порт tcp (http), в том числе в локальную сеть;
  • входящие на сервер (но не в локальную сеть) tcp на 22-й порт (ssh).
/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

shorewall6

Раздел ещё не дописан.

Проброс трафика

Чтобы разрешить трафик между интерфейсами (т.е., чтобы из локальной сети можно было получить доступ в Интернет по IPv6):

/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

Применяем:

sudo sysctl -p /etc/sysctl.d/60-ipv6-forwarding.conf

Известные проблемы

  • Иногда при подключении по PPPoE не работает DHCPv6, попробуйте перезапустить PPPoE:
sudo poff dsl-provider
sudo pon dsl-provider
  • dhcpcd5 (по крайней мере версии 6.0.5, из Ubuntu 14.04) иногда может падать:
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]
  • а radvd при этом продолжит раздавать адресацию, которой уже нет (bugreport: 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
Personal Tools