30.05.2014 в 00:58 (5018 Просмотров)
Исходное состояние:
1. Есть аккаунт на https://tunnelbroker.net
2. Чистый CentOS 6.5 с двумя интерфейсами: в локальную сеть и в публичный интернет с прямым (можно динамическим) IP-адресом.
Будет получено в итоге:
Шлюз из локальной сети в IPv6-интернет, на котором разрешены исходящие подключения и запрещены входящие (чтобы кто попало в локальную сеть не ломился). Маршрутизатор анонсирует себя в локальной сети и клиенты автоматически настраиваются на сеть без состояния.
НЕ будет рассматриваться:
настройка DNS для IPv6, в моем случае на шлюзе в локальной сети уже стоит bind, он отдает IPv6-адреса без доп. настроек.
Создание туннеля
На https://tunnelbroker.net слева нажать ссылку "Create Regular Tunnel”
Вписать текущий IP шлюзв в поле IPv4 Endpoint (Your side).
С сервера, который будет шлюзом попинговать каждый предложенный IP из списка "Available Tunnel Servers” и выбрать сервер с минимальным пингом. Туннель привязывается к этому серверу и весь трафик будет идти через него. Поменять этот сервер потом можно будет только путем создания нового туннеля.Нажать Create tunnel. Для целей статьи пусть это будет сервер 1.2.3.4
Подключение шлюза к туннелю
Если на шлюзе настроен 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-сеть появится на самом шлюзе, можно проверить попинговав сам сайт брокера
ping6 tunnelbroker.net
Настройка маршрутизации трафика из/в локальную сеть
Код :
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding # включение маршрутизации IPv6 трафика на всех интерфейсах
echo net.ipv6.conf.all.forwarding=1 >> /etc/sysctl.conf # сохранение маршрутизации при перезапусках сервера
ip6tables -F # ВНИМАНИЕ - ЭТА КОМАНДА УДАЛИТ ВСЕ ВАШИ ПРАВИЛА В ipv6tables если они были
ip6tables -I FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # Устранение эффекта когда половина картинок/страниц не загружаются.
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 должен заработать в локальной сети для всех устройств которые поддерживают его автонастройку, можно проверять зайдя на сайт http://test-ipv6.com