Как стать автором
Обновить

Настройка маршрутизатора IPv6 на Linux

В статье рассматривается пример настройки маршрутизатора для проброса IPv6 сети в локальную сеть и автонастройка клиентов.

Настройки должны подойти для любых linux-дистрибутивов, но могут отличаться нарпимер команды установки или названия пакетов. В статье примеры приведены для CentOS 6.5.

Исходное состояние:

  1. Есть аккаунт на tunnelbroker.net
  2. Чистый CentOS 6.5 с двумя интерфейсами: в локальную сеть и в публичный интернет с прямым (можно динамическим) IP-адресом.


Будет получено в итоге

Шлюз из локальной сети в IPv6-интернет, на котором разрешены исходящие подключения и запрещены входящие (чтобы кто попало в локальную сеть не ломился). Маршрутизатор анонсирует себя в локальной сети и клиенты автоматически настраиваются на сеть без состояния.

НЕ будет рассматриваться

настройка DNS для IPv6, в моем случае на шлюзе в локальной сети уже стоит bind, он отдает IPv6-адреса без доп. настроек.

Создание туннеля

  1. На tunnelbroker.net слева нажать ссылку «Create Regular Tunnel”
  2. Вписать текущий IP шлюзв в поле IPv4 Endpoint (Your side).
  3. С сервера, который будет шлюзом попинговать каждый предложенный IP из списка „Available Tunnel Servers” и выбрать сервер с минимальным пингом. Туннель привязывается к этому серверу и весь трафик будет идти через него. Поменять этот сервер потом можно будет только путем создания нового туннеля. Для целей статьи пусть это будет сервер 1.2.3.4. Нажать Create tunnel.


Подключение шлюза к туннелю

  1. Если на шлюзе настроен firewall — разрешить для выбранного сервера пинг-запросы и трафик по протоколу 41. Для простоты — можно разрешить весь трафик с сервера-шлюза.
    iptables -I INPUT -s 1.2.3.4 -j ACCEPT
    service iptables save # Для сохранения настроек при перезагрузке
    


    Создать скрипт tunnelbroker-ipv6
    #!/bin/bash
    
    MODE="$1"
    
    if [ -z "$MODE" ] || [ "$MODE" != "up" -a "$MODE" != "down" ]; then
        echo "Usage: $0 up|down"
        exit 1
    fi
    
    REMOTE_IP="1.2.3.4" # IP-адрес сервера со стороны tunnelbroker. Можно посмотреть на странице туннеля, поле "Server IPv4 Address".
    DEV_NAME="ipv6-tunnel" # Адрес виртуального интерфейса для IPv6-трафика. На момент выполнения скрипта интерфейс с таким названием должен отсутствовать.
    SERVER_NETWORK="2001:db8:27:1f::2/64” # Адрес на виртуальном интерфейсе и сеть для связи с сервером брокера. Поле "Client IPv6 Address"
    HOME_NETWORK="2001:db8:28:1f::/64"    # Блок, выделенный для использования в локальной сети. Этот адрес ПОХОЖ на предыдущий, но ОТЛИЧАЕТСЯ, в моем случае отличался одной цифрой. поле "Routed /64:”
    HOME_NETWORK_DEV=“eth0” # Интерфейс, выходящий в локальную сеть
    
    # Следующие поля нужны если у нашего шлюза динамический IP
    TUNNELBROKER_LOGIN=“login” # Логин с которым вы регистрировались на tunnelbroker
    TUNNELBROKER_TUNNEL_ID=“12345” # Идентификатор тунеля, поле "Tunnel ID"
    TUNNELBROKER_UPDATEKEY=“abcd” # Ключ обновления, используется вместо пароля. Можно посмотреть на странице информации о туннеле, вкладка advanced, поле "Update Key”.
    
    if [ "$MODE" = "up" ]; then
        # Сообщаем брокеру текущий внешний адрес шлюза (адрес подставляется тот с которого был сделан запрос).
        wget "https://$TUNNELBROKER_LOGIN:$TUNNELBROKER_UPDATEKEY@ipv4.tunnelbroker.net/nic/update?hostname=$TUNNELBROKER_TUNNEL_ID" -O /dev/null
    
        modprobe ipv6 # Подгрузка модуля ядра. Обычно уже загружен.
        ip tunnel del $DEV_NAME 2> /dev/null # удаляется существующий интерфейс (например от прошлого запуска)
        ip tunnel add $DEV_NAME mode sit remote $REMOTE_IP # Создается интерфейс туннеля
        ip link set $DEV_NAME up # Включается интерфейс туннеля, с этого момента он виден в ifconfig
        ip addr add $SERVER_NETWORK dev $DEV_NAME # Назначается адрес для связи с сервером брокера
        ip route add ::/0 dev $DEV_NAME # Маршрут по умолчанию - чтобы весь IPv6 трафик для которого нет специальных маршрутов направлялся в этот виртуальный интерфейс.
    
        ip route del $HOME_NETWORK 2>/dev/null # Очистка предыдущего маршрута
        ip route add $HOME_NETWORK dev $HOME_NETWORK_DEV # Направляем трафик локальной сети на устройство, смотрящее в эту сеть.
    elif [ "$MODE" = "down" ]; then
        ip tunnel del $DEV_NAME # Удаляется виртуальный интерфейс.
        ip route del $HOME_NETWORK 2>/dev/null # Удаляется маршрутизация блока в локальную сеть
    fi
    


    При публикации некоторые кавычки поменялись с правильных на “красивые», так что как будет работать скрипт после копирования непонятно. Правильный вариант можно скачать тут.

    Этот скрипт нужно запускать с параметрами up (включение шлюза) или down — выключение шлюза. Скрипт можно запускать много раз подряд. У меня он настроен для автозапуска после подключения к интернету в /etc/ppp/ip-up.local. После запуска этого скрипта IPv6-сеть появится на самом шлюзе, можно проверить попинговав сам брокера
    chmod +x ./tunnelbroker-ipv6
    ./tunnelbroker-ipv6 up
    ping6 tunnelbroker.net
    


    Настройка маршрутизации трафика из/в локальную сеть

    echo 1 > /proc/sys/net/ipv6/conf/all/forwarding # включение маршрутизации IPv6 трафика на всех интерфейсах
    echo net.ipv6.conf.all.forwarding=1 >> /etc/sysctl.conf # сохранение маршрутизации при перезапусках сервера
    ip6tables -P FORWARD DROP # Запрет прохождения IPv6-трафика, который не разрешен явно
    ip6tables-A FORWARD -i eth0 -o ipv6-tunnel -j ACCEPT # Разрешаем весь исходящий трафик из локальной сети в глобальную. eth0 - интерфейс локальной сети, если у вас отличается - надо поставить свой.
    ip6tables -A FORWARD -i ipv6-tunnel -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT # Разрешение ответов на запросы сделанные из локальной сети.
    service ip6tables save # Сохранение настроек в файл.
    


    В этот момент если вручную настроить IPv6 на компьютерах локальной сети то он уже будет работать.

    Автоматическая настройка клиентов

    yum install radvd # Установка демона, рассылающего информацию об этом шлюзе в локальную сеть.
    


    дальше надо поправить /etc/radvd.conf
    interface eth0 # Указать интерфейс локальной сети
    {
    AdvSendAdvert on; # Рассылать информацию что этот компьютер выступает шлюзом
        prefix 2001:db8:28:1f::/64 # Префикс домашней сети, из которого клиенты будут набирать себе адреса. Поле  "Routed /64”
        {
        };
    };
    


    service radvd start # запуск
    chkconfig radvd on # включение в автозапуск
    


    В этот момент IPv6 должен заработать в локальной сети для всех устройств которые поддерживают его автонастройку, можно проверять на сайте test-ipv6.com.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.