Назад | Перейти на главную страницу

Сервер Linux не получает маршрут IPv6 по умолчанию по ссылке PPP

Я заменяю маршрутизатор pfSense в удаленном офисе на небольшое устройство Linux, работающее под управлением Debian. Маршрутизатор должен поддерживать только самые простые возможности iptables / DHCP и VPN. Он настроен так, что восходящий провайдер представляет собой соединение PPPoE, по которому предоставляются статические адреса IPv4 и IPv6 (и префикс IPv6).

Я использую комбинацию radvd, wide-dhcpv6-client, wide-dhcpv6-server и ppp для настройки адресации. Практически все работает, за исключением того факта, что маршрутизатор не получает маршрут IPv6 по умолчанию, когда ppp0 подходит. Клиенты могут пинговать маршрутизатор, но маршрутизатор не может пинговать внешний мир.

Я настроил wide-dhcpv6-client как это (eth0 это локальный сетевой адаптер):

profile default
{
  request domain-name-servers;
  request domain-name;

  script "/etc/wide-dhcpv6/dhcp6c-script";
};
interface ppp0 {
    send ia-pd 0;
    send rapid-commit;
};

id-assoc pd 0 {
    prefix-interface eth0 {
        sla-len 0;
        sla-id 1;
        ifid 1;
    };
};

Предоставленные восходящие DNS-серверы правильно заполнены в resolv.conf (как IPv4, так и IPv6) и адрес IPv6 на eth0 установлен на правильный адрес (2001:111:1111::1), и radvd рекламирует правильный префикс. Тем не мение, ip -6 show route не указан ни один шлюз:

2001:111:1111::/48 dev eth0  proto kernel  metric 256
fe80::/64 dev eth1  proto kernel  metric 256
fe80::/64 dev ppp0  proto kernel  metric 256
fe80::/64 dev eth0  proto kernel  metric 256
fe80::/10 dev ppp0  metric 1
fe80::/10 dev ppp0  proto kernel  metric 256

У меня также есть следующие настройки:

net.ipv6.conf.ppp0.forwarding = 2
net.ipv6.conf.ppp0.accept_ra = 2

Если я просто сделаю ip -6 route add 0::/0 dev ppp0, Волшебным образом начинает работать маршрутизация IPv6. Однако я ожидаю, что когда ppp0 интерфейс, маршрут должен быть настроен автоматически, вместе с префиксом, DNS-серверами и всем остальным.

Маршрутизация IPv6 работает в pfSense (2.1), поэтому я не думаю, что он делает что-то забавное. Нужно ли мне каждый раз вручную добавлять этот маршрут? ppp0 появляется, или это должно работать автоматически?

редактировать Я включил режим отладки на dhcp6c и вот что выводится при открытии интерфейса: http://pastebin.com/dUDPm2D1

... net.ipv6.conf.ppp0.accept_ra = 2

Чтобы убедиться, что параметры конфигурации ядра действительно устанавливаются каждый раз, когда появляется устройство ppp, попробуйте использовать правило udev:

KERNEL=="ppp0", SUBSYSTEM=="net", ACTION=="add", RUN+="/bin/bash -c 'echo 2 >/proc/sys/net/ipv6/conf/ppp0/accept_ra; echo 2 >/proc/sys/net/ipv6/conf/ppp0/forwarding;'"

Поместите это где-нибудь в /etc/udev/rules.d/ и восстановите соединение ppp. В некоторых случаях я настроил accept_ra значение было сброшено до значения по умолчанию (если они отличаются) после исчезновения устройства ppp при отключении. Когда он снова подключается, мне тоже не хватало маршрута по умолчанию из-за неправильного значения, установленного в accept_ra.

У меня есть debian Linux, который делает почти то же самое (я не использую сервер dhcpv6 и использую dibbler в качестве клиента ipv6 dhcp для интерфейса ppp), в моей конфигурации PPP у меня есть:

defaultroute
replacedefaultroute
+ipv6
ipv6cp-accept-local

если вы добавите:

debug

в конфигурацию ppp вы получите подробную информацию о согласовании ipv6. Я подозреваю, тебе не хватает defaultroute вариант

Не могли бы вы захватить трассировку ppp интерфейса с помощью tcpdump во время согласования ppp, чтобы вы могли видеть, предоставляется ли адрес ipv6 через RAS? Я занимаюсь разработкой программного обеспечения для маршрутизаторов, работающих под управлением встроенного Linux, и самый простой способ диагностировать проблемы согласования ppp - это захват пакетов pppoe на этом этапе (PADI, PADO, PADR, PADS, PADT).